6

对于如何将数据输入 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 月左右,我一定会更新这个问题以反映留下的建议/评论。

谢谢!

4

1 回答 1

1

Keras 约定是在input_shape参数中通常省略批处理维度。从指南

将 input_shape 参数传递给第一层。这是一个形状元组(整数元组或 None 条目,其中 None 表示可能需要任何正整数)。在 input_shape 中,不包括批处理维度。

所以改变model = build_model([132300,2])应该可以解决问题。

于 2017-08-16T20:31:14.900 回答