首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Keras中将输入传递给2D Conv?

如何在Keras中将输入传递给2D Conv?
EN

Stack Overflow用户
提问于 2020-01-03 12:38:14
回答 3查看 1.1K关注 0票数 3

我用librosa把声音转换成了声谱图。平面图的形状是(257,356),我把它重塑为(257,356,1)。

我创造了一个模型

代码语言:javascript
复制
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'))

在对模型进行拟合时,会产生跟随误差。

代码语言:javascript
复制
model.fit(A,validation_data=(A2), epochs=3)

其中,A2是另一个具有以下维度的谱图

代码语言:javascript
复制
ValueError: Error when checking input: expected conv2d_3_input to have 4 dimensions, but got array with shape (257, 356, 1)

模型摘要

代码语言:javascript
复制
_________________________________________________________________
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

和A的形状是

代码语言:javascript
复制
A[0].shape = (356, 1)
EN

回答 3

Stack Overflow用户

发布于 2020-01-03 13:19:53

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

代码语言:javascript
复制
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)

这是三个时代的输出:

代码语言:javascript
复制
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>
票数 2
EN

Stack Overflow用户

发布于 2020-01-03 13:35:42

您缺少模型中的批处理大小。

二维卷积的输入形状为(batch, spatial1, spatial2, channels)

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

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

而且您的input_shape不能包括批处理大小:input_shape=(257,356,1)

票数 0
EN

Stack Overflow用户

发布于 2020-01-03 13:47:37

请注意keras official documentation page上类似VGG的convnet示例。正如@Daniel所提到的,input_shape必须定义为(number_of_examples, height, width, channel)的元组。

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

代码语言:javascript
复制
x_train = np.random.random((500, 257, 356, 1))
print(x_train.shape)
(500, 257, 356, 1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59578786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档