我正在尝试使用带有Keras的CNN将两个类别(正/负)之一分配给音频。我的模型应该接受各种长度的输入(框架),其中每个框架包含41个要素,但是我在输入大小方面感到吃力。请记住,我还没有获取完整的数据集,所以我只是嘲笑了一些毫无意义的数据,只是为了检查网络是否工作正常。
根据文档https://keras.io/layers/convolutional/,据我最好的理解,如果input_shape
元组的第一个元素为None
,Conv1D可以处理各种长度。包含输入数据X_train.shape
的变量的形状为(4, 497, 41)
。
data = pd.read_csv('output_file.csv', sep=';')
featureCount = data.values.shape[1]
#mocks because full data is not available yet
Y_train = np.asarray([1, 0, 1, 0])
X_train = np.asarray(
[np.array(data.values, copy=True), np.array(data.values, copy=True), np.array(data.values, copy=True),
np.array(data.values, copy=True)])
# variable length with 41 features
model = keras.models.Sequential()
model.add(keras.layers.Conv1D(100, 5, activation='relu', input_shape=(None, featureCount)))
model.add(keras.layers.GlobalMaxPooling1D())
model.add(keras.layers.Dense(10, activation='relu'))
model.add(keras.layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
model.summary()
model.fit(X_train, Y_train, epochs=10, verbose=False, validation_data=(np.array(data.values, copy=True), [1]))
此代码产生错误
ValueError: Error when checking input: expected conv1d_input to have 3 dimensions, but got array with shape (497, 41)
。因此,似乎第一个维度被切掉了,因为它包含训练样本(对我而言似乎是正确的),令我困扰的是所需的维度,为什么是3?
在寻找答案之后,我偶然发现了Dimension of shape in conv1D,然后添加了最后一个维度(使用X_train = np.expand_dims(X_train, axis=3)
),该维度仅包含一位数字,但最终出现了另一个类似的错误:
ValueError: Error when checking input: expected conv1d_input to have 3 dimensions, but got array with shape (4, 497, 41, 1)
现在看来,以前被视为样本“列表”的第一个维度现在已成为实际数据的一部分。
我还尝试摆弄input_shape
参数,但无济于事,并使用Reshape
层,但最终还是争夺了尺寸
我该怎么做才能满足所需的形状?如何准备要处理的数据?