python - 卷积神经网络中的形状误差

标签 python machine-learning keras neural-network conv-neural-network

我正在尝试训练具有以下结构的神经网络:

model = Sequential()

model.add(Conv1D(filters = 300, kernel_size = 5, activation='relu', input_shape=(4000, 1)))
model.add(Conv1D(filters = 300, kernel_size = 5, activation='relu'))
model.add(MaxPooling1D(3))
model.add(Conv1D(filters = 320, kernel_size = 5, activation='relu'))
model.add(MaxPooling1D(3))
model.add(Dropout(0.5))

model.add(Dense(num_labels, activation='softmax'))

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

return model

我收到此错误:

expected dense_1 to have shape (442, 3) but got array with shape (3, 1)

我的输入是一组短语(总共 12501 个),已针对 4000 个最相关的单词进行标记,并且有 3 种可能的分类。因此我的输入是train_x.shape = (12501, 4000)。我将 Conv1D 层的形状重新调整为 (12501, 4000, 1)。现在,我的 train_y.shape = (12501,3),我将其重新整形为 (12501,3, 1)。

我使用的拟合函数如下:

model.fit(train_x, train_y, batch_size=32, epochs=10, verbose=1, validation_split=0.2, shuffle=True)

我做错了什么?

最佳答案

分类时无需转换标签形状。您可以查看您的网络结构。

print(model.summary())
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_1 (Conv1D)            (None, 3996, 300)         1800      
_________________________________________________________________
conv1d_2 (Conv1D)            (None, 3992, 300)         450300    
_________________________________________________________________
max_pooling1d_1 (MaxPooling1 (None, 1330, 300)         0         
_________________________________________________________________
conv1d_3 (Conv1D)            (None, 1326, 320)         480320    
_________________________________________________________________
max_pooling1d_2 (MaxPooling1 (None, 442, 320)          0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 442, 320)          0         
_________________________________________________________________
dense_1 (Dense)              (None, 442, 3)            963       
=================================================================
Total params: 933,383
Trainable params: 933,383
Non-trainable params: 0
_________________________________________________________________

模型的最后输出是 (None, 442, 3),但标签的形状是 (None, 3, 1)。您最终应该以全局池化层 GlobalMaxPooling1D() 或 Flatten 层 Flatten() 结束,将 3D 输出转换为 2D 输出,以进行分类或回归。

关于python - 卷积神经网络中的形状误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53713947/

相关文章:

linux - 包装 python+keras+tensorflow 'as a service' 以接收来自 PHP 的预测请求?

javascript - 使用 python 和 Flask 进行有趣的时钟流文本

python - 如何使用 Poetry 指定特定于平台的依赖关系?

python - 按下拍摄按钮时控制拍摄频率?

parsing - 从句子中找到有意义的子句子

scala - Spark 中逻辑回归如何并行化?

tensorflow - 关于 Keras 框架下自编码器模型中的解码器层定义

python - 在 Q# 中获取数字序列

python - 我可以使用机器学习模型作为优化问题的目标函数吗?

python - 使用 TensorFlow 和 Keras 进行图像分类