【问题标题】:How to build a Keras model with multidimensional input and output?如何构建具有多维输入和输出的 Keras 模型?
【发布时间】:2017-12-29 17:22:59
【问题描述】:

我正在构建一个神经网络来制作歌曲。我有一个文件,其中包含一首歌曲的所有音符,一行对应一个音符:

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

我想给神经网络 10 个第一个音符,我希望它给出 下一个音符,作为输出,必须在这 10 个之后播放笔记。

但是我不知道如何构建第一层和最后一层(Dense、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'))

感谢您的帮助。

【问题讨论】:

    标签: python multidimensional-array machine-learning neural-network keras


    【解决方案1】:

    这是一个序列预测问题,最好用循环或长期短期记忆网络来解决。

    以下可能是一个很好的开始:

    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,而不是在歌曲结束之前重置状态。 Here 是使用 Keras 进行有状态训练的示例。

    如果需要预测整首歌曲(而不仅仅是下一个字符),您需要在所有 LSTM 层中设置 return_sequences=True 并在输出处使用 TimeDistributed 密集层。

    【讨论】:

    • 非常感谢您的回答。这对我帮助很大。我这样做了,它奏效了。但是,我如何修改这个程序以便一个一个地读取一个文件,以便神经网络学习很多歌曲而不仅仅是一首?因为一个文件只是一首有数千个音符的歌曲。所以我想知道考虑到我有很多歌曲和数千个音符,输入和输出数据的形状应该是什么?谢谢。
    猜你喜欢
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 2022-01-08
    • 2021-08-13
    • 2018-01-10
    • 1970-01-01
    相关资源
    最近更新 更多