【问题标题】:Which shape should have input and output data for a LSTM NN?哪个形状应该具有 LSTM NN 的输入和输出数据?
【发布时间】:2018-06-10 23:31:48
【问题描述】:

我在为具有 LSTM 层的 NN 创建数据的方式上存在问题。我有许多文件,其中包含数百行。 每个文件代表一首歌曲每行代表一个带有 4 个值的音符。我希望 NN 阅读带有 10 个音符序列 的音符,以便它可以从中预测下一个音符。如果需要,我们可以将音符数量固定为每首歌曲 5000 个。

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

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

总结一下:

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

  • 文件中的一行代表一个带有 4 个值的音符。

感谢您的帮助。

【问题讨论】:

  • 能否提供输入数据的样本?
  • 输入数据有数千行,这里无法提供。共有4列,每个值都是0到1之间的数字。

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


【解决方案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
# ...

【讨论】:

  • 感谢您的帮助。所以如果我理解得很好,所有歌曲都应该在同一个文件中?那么文件会有 NB_songs * 5000 行吗?或者也许 x 代表一首歌曲,我将其用作输入,当 NN 完成处理后,我将 x 替换为另一首歌曲?我应该在输出数据中添加什么?我的意思是如何构建输出?
  • 您的歌曲在磁盘上的存储方式在这里并不重要(有多种存储和加载方式)。我更新了我的答案以解释我将如何构建输入数据x 和输出y。我还没有测试我添加的代码,但我希望你能从中得到灵感。
  • 非常感谢您更新的答案!因此,如果我有 2 首歌曲并且都有 5000 个音符,那么数组“歌曲”的形状是 (2,5000,4) 吗?根据您的说法,新数组 x 和 y 的形状应该是什么? (我没有得到你的变量 samples_per_song、n_samples 等的值......)。这个新数组 x 将是 NN 的输入数据。
  • 没错,如果您有 2 首歌曲,每首歌曲有 5000 个音符,那么 songs 的形状为 (2, 5000, 4)。在这种情况下,x 的形状将是 (2*(5000-10), 10, 4)y 将是 (2*(5000-10), 4)。这里,samples_per_song 包含您通过滑动长度为window_length 的窗口获得的训练示例的数量。例如,请注意,您可以在长度为 5000 的歌曲上滑动 5000-10=4990 次长度为 10 的窗口,并且这些向量中的每一个都是一个训练示例。然后标签就是窗口后面的注释。 n_samples 是样本总数,结合所有歌曲。
  • 好的,我明白了。太感谢了。你建议的工作!你帮了我很多!
【解决方案2】:

我希望 NN 读取包含 10 个音符的序列的音符,以便它可以从中预测下一个音符。

我从未使用过 keras,但我认为您应该先将这些笔记转换为 id。例如:(aa, bb, cc, dd) 为 1 和 (ab, bb, cc, dd) 为 2 等等。

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

您完全可以通过 id 取回笔记。你可以建立一个词汇表来来回转移它。

【讨论】:

  • 感谢您的帮助。我会尽力做到这一点。所以想象一下 x,一个包含一首歌曲音符的数组。然后我会将它用作我的输入数据。但是我应该如何构建我的输出数据?如果没有前 10 个音符,它应该与 x 相同吗?
  • 这取决于您的任务。在您的问题中,您的意思是在给定前十个音符的情况下仅生成下一个音符,然后我在回答中建议该方法。你能详细说明你的问题吗?
  • 是的,我希望 NN 从 10 个音符中预测一个音符。但是在进行机器学习之前,我需要为输入和输出定义一个数组。我现在知道要输入什么,但我应该如何填写输出?在第一步中,NN 将获取 10 个第一个音符,并预测第 11 个音符并将其与输出的第一行中应该找到的真实第 11 个音符进行比较。但是输出的下一部分呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多