Python 如何将输入传递到Keras中的2D Conv?

Python 如何将输入传递到Keras中的2D Conv?,python,tensorflow,keras,Python,Tensorflow,Keras,我用librosa把声音转换成了频谱图。spectrogram的形状是(257356),我把它改成了(257356,1) 我创建了一个模型 from keras.models import Sequential from keras.layers import Dense, Conv2D, Flatten model = Sequential() model.add(Conv2D(64, kernel_size=3, activation='relu', input_shape=A.shape)

我用librosa把声音转换成了频谱图。spectrogram的形状是(257356),我把它改成了(257356,1)

我创建了一个模型

from keras.models import Sequential
from keras.layers import Dense, Conv2D, Flatten
model = Sequential()
model.add(Conv2D(64, kernel_size=3, activation='relu', input_shape=A.shape))
model.add(Flatten())
model.add(Dense(1, activation='softmax'))
在拟合模型时,会产生如下误差

model.fit(A,validation_data=(A2), epochs=3)
其中A2是另一个具有以下尺寸的光谱图

ValueError: Error when checking input: expected conv2d_3_input to have 4 dimensions, but got array with shape (257, 356, 1)
模型摘要

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_24 (Conv2D)           (None, 255, 354, 64)      640       
_________________________________________________________________
conv2d_25 (Conv2D)           (None, 253, 352, 32)      18464     
_________________________________________________________________
flatten_11 (Flatten)         (None, 2849792)           0         
_________________________________________________________________
dense_11 (Dense)             (None, 10)                28497930  
=================================================================
Total params: 28,517,034
Trainable params: 28,517,034
Non-trainable params: 0
且[0]的形状为

A[0].shape = (356, 1)

编辑:这是我的工作代码:

from keras.models import Sequential
from keras.layers import Dense, Conv2D, Flatten
import numpy as np

A = np.zeros((1,257,356,1))     # Only for illustration
A2 = np.zeros((1,1))     # Only for illustration

model = Sequential()
model.add(Conv2D(64, kernel_size=(3,3), activation='relu', input_shape=A.shape[1:]))     # input_shape ==> (257,356,1)
model.add(Flatten())
model.add(Dense(1, activation='softmax'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(A, A2, validation_data = (A, A2), epochs=3)
这是三个时代的输出:

Train on 1 samples, validate on 1 samples
Epoch 1/3
1/1 [==============================] - 0s 250ms/step - loss: 0.0000e+00 - accuracy: 1.0000 - val_loss: 0.0000e+00 - val_accuracy: 1.0000
Epoch 2/3
1/1 [==============================] - 0s 141ms/step - loss: 0.0000e+00 - accuracy: 1.0000 - val_loss: 0.0000e+00 - val_accuracy: 1.0000
Epoch 3/3
1/1 [==============================] - 0s 156ms/step - loss: 0.0000e+00 - accuracy: 1.0000 - val_loss: 0.0000e+00 - val_accuracy: 1.0000

<keras.callbacks.callbacks.History at 0x1d508dbb708>
对1个样本进行训练,对1个样本进行验证
纪元1/3
1/1[======================================================-0s 250ms/步-损耗:0.0000e+00-精度:1.0000-val\u损耗:0.0000e+00-val\u精度:1.0000
纪元2/3
1/1[==================================================================-0s141ms/步-损耗:0.0000e+00-精度:1.0000-val\u损耗:0.0000e+00-val\u精度:1.0000
纪元3/3
1/1[=========================================================-0s 156ms/步-损耗:0.0000e+00-精度:1.0000-val\u损耗:0.0000e+00-val\u精度:1.0000

您的模型中缺少批量大小

二维卷积的输入形状为
(批处理、空间1、空间2、通道)

我不知道你的数据结构,但你似乎没有一批?(如果这是真的,您需要创建大小为1的批处理维度,但这根本无法很好地训练,您需要大量的数据,而不是一个示例)

因此,
A.shape
必须是
(1257356,1)
,第一个是批次大小,最后一个是通道数。另外两个数字是“图像”的空间维度


并且您的
input\u-shape
不能包含批量大小:
input\u-shape=(257356,1)

请注意上类似于convnet的VGG示例。 与前面提到的@Daniel一样,
输入形状必须定义为
的元组(示例的数量、高度、宽度、通道)

作为参考,假设您有500个样本,您的输入数据应该如下所示:

x_train = np.random.random((500, 257, 356, 1))
print(x_train.shape)
(500, 257, 356, 1)

我已经编辑了您共享的代码。但这是行不通的。并生成提供的错误。编辑:我已经更正并上传了工作代码。希望这有帮助!:)我尝试将您的代码与我的输入光谱图一起使用,但在拟合模型值时会产生错误错误错误:检查输入时出错:预期conv2d_29_输入为4维,但得到了具有形状的数组(257、356、1)为什么您将A2指定为带零的1D,为什么不提供具有3维的随机数字,因为光谱图的形状是二维的。@SoProgram,似乎您的光谱图输入
A
仍然是三维的,您能打印并检查A的尺寸吗?它需要是4-D。只是好奇,在
model.fit
中为什么没有传递
y
值?你能显示
model.summary()
A.shape
A[0]。shape
值吗?Moller通过A=S添加批量大小[None,:,:]给出以下错误。ValueError:输入形状为:[?、1257356]、[3,3356,64]的“conv2d_29/卷积”(op:“conv2d”)从1中减去3导致负尺寸大小.我已经使用了您建议的方法,但模型不会超过3维值,在拟合过程中,如果出于测试目的通过3维值,则会显示尺寸误差@Daniel MollerDone检查了它,但得到了以下错误值error:检查目标时出错:预期稠密_1具有形状(1),但得到了具有形状(874,)的数组