哪个形状应具有LSTM NN的输入和输出数据?

时间:2017-12-31 08:14:55

标签: python multidimensional-array neural-network keras recurrent-neural-network

我在为具有LSTM图层的NN创建数据时遇到问题。我有许多文件包含数百行。 每个文件代表一首歌每行代表一个包含4个值的音符。我希望NN用一系列10个音符读取音符,以便它可以预测它们的下一个音符。如果需要,我们可以将歌曲的数量固定为每首歌5000张。

所以我只想知道我的输入和输出数据应该具有哪种形状以及如何定义第一个LSTM图层。

model = Sequential()
model.add(LSTM(32, input_shape=(5000, 4),return_sequences=True))

要成功:

  • 一个文件有5000行和4列,代表一首歌。

  • 文件中的一行代表一个包含4个值的注释。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

第一个LSTM图层的输入形状应为(None, 10, 4)。 模型的输出形状为(None, 4)。我使用None作为批量大小。

我编写了一个简单的LSTM作为例子:

import numpy as np
from keras.layers import LSTM
from keras.models import Sequential

batch_size = 32
window_length = 10
note_dim = 4
n_samples = 5000

# Input data. TODO: Slide window and modify it to use real data
x = np.ones(shape=(n_samples, window_length, note_dim))
y = np.ones(shape=(n_samples, note_dim))

# Define model
model = Sequential()
model.add(LSTM(note_dim, input_shape=(window_length, note_dim))) # The batch dimension is implicit here

model.compile('sgd', 'mse')
model.fit(x=x, # Batch input shape is: (None, window_length, note_dim)
          y=y, # Batch output shape is: (None, note_dim)
          batch_size=batch_size)

如果您需要更复杂的模型(即2个LSTM图层),您可以这样定义:

# ...
# Define model
hidden_size = 50
model = Sequential()
model.add(LSTM(hidden_size, input_shape=(window_length, note_dim), return_sequences=True)) # The batch dimension is implicit here
model.add(LSTM(note_dim))
# ...

更新:回答您的第一条评论。

在滑动窗口后,

x应包含所有歌曲。例如,假设您有一个变量songs,其形状(n_songs, notes_per_song, note_dim)包含您的所有歌曲。然后,您可以创建xy,如下所示:

# ...
# Input data    
# Suppose that variable ´songs´ is an array with shape: (n_songs, notes_per_song, note_dim). 
samples_per_song = notes_per_song-window_length
n_samples = n_songs*samples_per_song
x = np.zeros(shape=(n_samples, window_length, note_dim))
y = np.zeros(shape=(n_samples, note_dim))
for n, song in enumerate(songs):
    for i in range(samples_per_song):
        x[i+n*samples_per_song, :, :] = song[i:(i+window_length), :]
        y[i+n*samples_per_song, :, :] = song[i+window_length, :] # note that you want to predict
# ...

答案 1 :(得分:0)

  

我希望NN用10个音符的序列读取音符,以便它可以预测它们的下一个音符。

我从未使用过keras,但我认为你应该首先将这些音符转换为ID。例如:(aa,bb,cc,dd)为1,(ab,bb,cc,dd)为2等。

然后你会读取编码器的10个ID /音符,然后添加一个投影以将最终状态投影到第11个音符。如果你想用歌曲中任何音符的10个音符来测试模型,你可以将第二个音符训练到第11个,并在投影后将第12个作为目标。依此类推,直到最后一个音符为目标。这是一首歌,并重复所有歌曲。

你绝对可以通过ID回复笔记。您可以构建一个词汇表来进行转发。