2016-04-09 30 views
2

Müzik dizileri oluşturmak için lstm-rnn oluşturmaya çalışıyorum. Eğitim verisi, eğitilmesi gereken bazı şarkılardaki her notanın çeşitli özelliklerini (MIDI notası dahil) temsil eden, boyut 4'teki vektörlerin bir dizisidir.tensorflow/tflearn giriş şekli

Okumaya baktığımda, her giriş örneği için ne yapmaya çalıştığım göründüğüne benziyor, çıktı örneği bir sonraki boyut 4 vektörüdür (yani, geçerli olanı verilen bir sonraki notu tahmin etmeye çalışmalı, ve daha önce gelen örneklerin bilgisini içeren LSTM'lerden dolayı).

Ben RNN'ler için hala çok yeni olduğum için tflearn kullanıyorum. Ben uzunluğu 20 dizileri içine trainX ve trainY bölünmüş Bu kodun önce aşağıdaki kodu

net = tflearn.input_data(shape=[None, seqLength, 4]) 
net = tflearn.lstm(net, 128, return_seq=True) 
net = tflearn.dropout(net, 0.5) 
net = tflearn.lstm(net, 128) 
net = tflearn.dropout(net, 0.5) 
net = tflearn.fully_connected(net, 4, activation='softmax') 
net = tflearn.regression(net, optimizer='adam', 
        loss='mean_square') 

# Training 
model = tflearn.DNN(net, tensorboard_verbose=3) 
model.fit(trainX, trainY, show_metric=True, batch_size=128) 

var (keyfi, ancak bu bunu yapmak için iyi bir yoldur gibi bir yerde diziler o eğitimi okuyun).

Bu iyi görünüyor ama ben hata alıyorum ValueError: '(?, 4)' şekli olan Tensor u'TargetsData/Y: 0 'için şekil değeri (128, 16, 4) beslenemiyor.

SO: Şu ana kadarki varsayımlarım, [Hiçbiri, sqLength, 4] giriş şeklinin TF [batchLength (sırayla tflearn ile beslenen), dizi uzunluğu, örnek uzunluğunun] olduğunu söylüyor. Anlamadığım şey neden çıktı yanlış şekli olduğunu söylüyor? Veri dizisi bölünmüş olarak yanlış mı varsayıyorum? Tüm verilerimi dizilere bölünmeden beslemeye çalıştığımda, giriş şekli [Yok, 4], TF'nin LSTM katmanının en az 3 boyutlu bir giriş şekli beklediğini söyler.

Kafamı, girişlerin ve çıkışların şekillerinin ne olması gerektiği konusunda alamıyorum. Bunun basit bir şey olması gerektiği gibi geliyor - Bir dizi girdi dizisi var ve ağın sıradaki sıradakileri denemesini ve tahmin etmesini istiyorum. Oldukça gelişmiş bir bilgi düzeyine sahip olmayan çok az çevrimiçi var, bu yüzden bir tuğla duvara çarptım. Herkesin verebileceği herhangi bir anlayışa minnettarım!

cevap

3

Bunu çözdüm, aynı soruna sahip olan herkes için cevabı burada yazıyorum. Bu ağların nasıl çalıştığının yanlış anlaşılmasına dayanıyordu, ancak bu okuduğum öğreticilerin çoğunda bilginin varsayılan olarak kabul edilmesi diğer yeni başlayanlar için net olmayabilir.

LSTM ağları, giriş durumlarını hesaba katabildikleri için bu durumlar için kullanışlıdır. Tarihin LSTM'ye verilme şekli sıralama yoluyla gerçekleşir, ancak her bir sekans hala tek bir çıkış veri noktasına yol açar. Böylece çıktı sadece 2D iken, giriş 3D şekle sahip olmalıdır.

Tüm bir dizi ve istenen tarih uzunluğu verildiğinde, girdiyi historyLength dizilerine ve tek bir çıktı vektörüne bölerim. Bu benim şekil problemimi çözdü.

+2

Merhaba henreh, çözümünüzü daha fazla detaylandırmak ister misiniz? Bu şekil problemini çözmek için kod dosyasını paylaşabilir misiniz? – user288609