Python 如何将输入传递到Keras中的2D Conv?
我用librosa把声音转换成了频谱图。spectrogram的形状是(257356),我把它改成了(257356,1) 我创建了一个模型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)
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,)的数组