簡體   English   中英

如何建立具有多維輸入和輸出的Keras模型?

[英]How to build a Keras model with multidimensional input and output?

我正在建立一個神經網絡來產生歌曲。 我有一個文件,其中包含一首歌曲的所有音符,並且一行對應於一個音符:

0 0 0.05511 0.78740
0 0 0.07874 0.50393
0 0 0.71653 1
0 0 0.50393 0
.. .. .. ..

我想給神經網絡10個第一音符 ,然后給它下一個音符 ,作為輸出,必須在這10個音符之后播放。

但是我不知道如何構建第一層和最后一層(密集,LSTM ...),因為我有:

  1. 10x4尺寸 (4列和10行)的輸入。
  2. 1x4尺寸 (1行和4列)的輸出。

這是我的代碼的開頭(無法正確讀取我的數據):

model = Sequential()
model.add(Dense(10, activation='relu',input_shape = (10,4)))
model.add(Dense(4, activation='relu'))

謝謝您的幫助。

這是一個序列預測問題,最好通過循環或長期短期存儲網絡解決。

以下可能是一個很好的入門者:

from keras.models import Sequential
from keras.layers import LSTM, Dense, Dropout
import numpy as np

#assuming all 4 columns correspond to 1 song
data_dim = 4
#so one song would be 10x4 2D array 
number_of_notes_per_song = 10
nsongs_train = 100
#tunable parameter
batch_size = 32
epochs = 5

# I generated dummy data, but you have your own...
x_train = np.random.random((nsongs_train, number_of_notes_per_song, data_dim)).reshape(nsongs_train*number_of_notes_per_song,data_dim)

#this is a supervised learning problem, but your dataset has no labels..
#we can use last note in each song as a label when training LSTM 
X = x_train[np.mod(np.arange(x_train.shape[0]),number_of_notes_per_song)!=0].reshape(nsongs_train,number_of_notes_per_song-1,data_dim)
y = x_train[::number_of_notes_per_song].reshape(nsongs_train,data_dim) 

model = Sequential()
model.add(LSTM(32, input_shape=(number_of_notes_per_song-1, data_dim),return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(64))
model.add(Dropout(0.2))
model.add(Dense(data_dim, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam')

model.fit(X,y,batch_size=batch_size, epochs=epochs)

#predict on unseen data, expects tensors of shape (None, number_of_notes_per_song-1, data_dim)
model.predict(...)

請注意,這是有監督的機器學習問題,但是您的數據集沒有標簽。 我們可以通過將每首歌曲中的最后一個音符用作標簽來解決此問題。 這樣可以有效地將序列長度減少1個音符。

另請注意,如果您的歌曲中包含數百個音符,則最好以子序列的方式將它們提供給LSTM,而不是在歌曲結束之前重置狀態。 是Keras進行有狀態訓練的示例。

如果需要預測整首歌曲(而不只是下一首歌),則需要在所有LSTM層中設置return_sequences=True並在輸出處使用TimeDistributed密集層。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM