我有一个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 回答
首先需要确保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 .