对于如何将数据输入 Keras 的问题,我似乎找不到具体的答案。大多数示例似乎都可以处理图像/文本数据,并且具有明确定义的数据点。
我正在尝试将音乐输入 LSTM 神经网络。我希望网络播放约 3 秒的音乐并提名接下来的 2 秒。我将我的音乐准备成 .wav 文件并划分为 5 秒的间隔,我将这些间隔分解为 X(前 3 秒)和 Y(最后两秒)。我以 44,100 赫兹对我的音乐进行了采样,所以我的 X 是 132,300 次“长”观察,而我的 Y 是“88,200”长观察。
但我不知道如何将 Keras 连接到我的数据结构。我正在使用 Tensorflow 后端。
为了概括问题和答案,我将使用 A、B、C 来表示维度。这个示例数据和我的真实数据之间的唯一区别是这些是从 0 到 1 分布的随机值,而我的数据是一个整数数组。
import numpy as np
#using variables to make it easy to generalize the answer
#a = the number of observations I have
a = 411
#b = the duration of the sample, 44.1k observations per second of music
b_train = 132300
b_test = 88200
#c = the number of channels in the music, this is 2 channel stereo
c = 2
#now create sample data with the dimensionality given above:
X = np.random.rand(a,b_train,c)
y = np.random.rand(a,b_test ,c)
#split the data
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.20, random_state=42)
但是,我真的不知道如何配置模型以了解“第一”(A)维度包含观察结果,并且我想或多或少地通过通道(C)分解音乐(B)。
我知道将其转换为单声道(和 2d 问题)可能会更容易,但我很好奇这是否有一个“简单”的解决方案 - 是否主要采用我下面的形式或者我是否应该以另一种方式考虑模型。
主要问题是:我将如何构建一个允许我将 X 数据转换为 Y 数据的模型?
理想情况下,答案将显示如何修改下面的模型以适应上面的数据结构。
import keras
import math, time
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.layers.recurrent import LSTM
from keras.models import load_model
def build_model(layers):
d = 0.3
model = Sequential()
model.add(LSTM(256, input_shape=(layers), return_sequences=True))
model.add(Dropout(d))
model.add(LSTM(256, input_shape=(layers), return_sequences=False))
model.add(Dropout(d))
model.add(Dense(32,kernel_initializer="uniform",activation='relu'))
model.add(Dense(1,kernel_initializer="uniform",activation='linear'))
start = time.time()
model.compile(loss='mse',optimizer='adam', metrics=['accuracy'])
print("Compilation Time : ", time.time() - start)
return model
#build model...
model = build_model([328,132300,2])
model.fit(X_train,y_train,batch_size=512,epochs=30,validation_split=0.1,verbose=1)
但是,这会产生错误(在模型 = ... 步骤):
ValueError: Input 0 is incompatible with layer lstm_2: expected ndim=3, found ndim=4
我不知道 Keras 期望从哪里看到 ndim=4 数据。此外,我不知道如何确保将数据输入模型,以便模型“理解”观察分布在 A 轴上,而数据本身分布在 B 轴和 C 轴上。
如果有任何不清楚的地方,请发表评论。我会一直关注到 17 年 9 月左右,我一定会更新这个问题以反映留下的建议/评论。
谢谢!