首页 文章

当我使用2-dim卷积输入层时,为什么会出现尺寸误差?

提问于
浏览
0

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

我正在构建一个mnist分类器,但我的神经网络的输入层是第二维卷积层 . 训练集有60000个样本,测试集有10000个样本 . 每个图像的尺寸为28乘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-Dim卷积输入层运行它:

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

    首先需要确保Conv2d将输入形状视为 ( height , width , number of channels ) 还必须在开头添加批量大小维度 . 整个维度变为 ( batch size , height , width , number of channels ) .

    • 您的输入形状是 ( 60000 , 784 , 1 ) 这里60000是 batch size ,通道数是1 .

    • 对于Conv2d,输入的形状应为 ( 28 , 28 ,1 ) . 你 do not need to mention the batch size for Conv2d .

相关问题