使用2维卷积输入层时,为什么会出现尺寸错误?

时间:2018-11-08 00:01:30

标签: python machine-learning keras deep-learning

我有一个Keras深度学习问题:

我正在建立一个mnist分类器,但是我的神经网络的输入层是二维卷积层。训练集有60000个样本,测试集有10000个样本。每个图像的尺寸为28 x 28像素。我将像素张量切片压缩为两个参数张量,除以255,然后将其设为“ float32”。

导入:

from keras.models import Sequential
from keras.layers import Dense, MaxPooling2D, Conv2D, Dropout, Flatten
from keras.datasets import mnist

加载数据:

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

预处理:

train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') /255
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') /255

然后我通过2维卷积输入层运行它:

network = Sequential()
network.add(Conv2D(64, kernel_size = (3, 3), padding='valid', data_format="channels_last", input_shape = (60000, 784)))

完整型号:

network = Sequential()
network.add(Conv2D(64, kernel_size = (3, 3), padding='valid', data_format="channels_last", input_shape = (60000, 784)))
network.add(MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format="channels_last"))
network.add(Conv2D(64, (2,2), strides=(1, 1), padding='valid',  data_format=None, dilation_rate=(1, 1), activation=None, use_bias=True, 
kernel_initializer='glorot_uniform', bias_initializer='zeros', 
kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, 
kernel_constraint=None, bias_constraint=None))
network.add(MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid', data_format=None))
network.add(Flatten())
network.add(Dense(128, activation= 'relu'))
network.add(Dropout(0.2, noise_shape=None, seed=7))
network.add(Dense(10, activation='softmax'))

我得到了错误:

ValueError: Input 0 is incompatible with layer conv2d_7: expected ndim=4, found ndim=3

所以我尝试添加频道尺寸(代表黑白色):

network = Sequential()
network.add(Conv2D(64, kernel_size = (3, 3), padding='valid', 
data_format="channels_last", input_shape = (60000, 784, 1)))

尝试拟合数据时仍然出现错误,但是这次我的模型可以编译

ValueError: Error when checking input: expected conv2d_3_input to have 4 dimensions, but got array with shape (60000, 784)

1 个答案:

答案 0 :(得分:0)

您首先需要确保Conv2d的输入形状为( height , width , number of channels ),并且还必须在开始时添加批次大小尺寸。整个维度变为( batch size , height , width , number of channels )

  • 您的输入形状为( 60000 , 784 , 1 ) 60000是您的批量,通道数是1。

  • 对于Conv2d,您输入的形状应为( 28 , 28 ,1 )。您无需提及Conv2d的批处理大小