输入形状的卷积神经网络误差

时间:2018-05-31 18:31:20

标签: python machine-learning neural-network deep-learning conv-neural-network

我有1000,28 * 28分辨率的图像。我将这1000个图像转换为numpy数组并形成一个大小为(1000,28,28)的新数组。所以,同时  使用keras创建卷积层,输入形状(X值)指定为(1000,28,28),输出形状(Y值)指定为(1000,10)。因为我哈 1000个例子是输入和10个输出类别。

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',kernel_initializer='he_normal',input_shape=(1000,28,28)))
.
.
.
model.fit(train_x,train_y,batch_size=32,epochs=10,verbose=1)

因此,在使用fit函数时,它会将ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (1000, 28, 28)显示为错误。请帮助我们为CNN提供适当的输入和输出维度。

代码:

 model = Sequential()
 model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',kernel_initializer='he_normal',input_shape=(4132,28,28)))
 model.add(MaxPooling2D((2, 2)))
 model.add(Dropout(0.25))

 model.add(Conv2D(64, (3, 3), activation='relu'))
 model.add(MaxPooling2D(pool_size=(2, 2)))
 model.add(Dropout(0.25))

 model.add(Conv2D(128, (3, 3), activation='relu'))
 model.add(Dropout(0.4))

 model.add(Flatten())
 model.add(Dense(128, activation='relu'))
 model.add(Dropout(0.3))
 model.add(Dense(10, activation='softmax'))

 model.compile(loss=keras.losses.categorical_crossentropy,optimizer=keras.optimizers.Adam(),metrics=['accuracy'])
 model.summary()

 train_x  = numpy.array([train_x])

 model.fit(train_x,train_y,batch_size=32,epochs=10,verbose=1)

3 个答案:

答案 0 :(得分:2)

您需要将输入更改为4维,1设置为input_shape :( 1000,28,28,1),您需要更改卷积图层的(28, 28, 1)model.add(Conv2D(32, kernel_size=(3, 3),...,input_shape=(28,28,1)))

{
    "operation": "pin",
    "question": {
        "studentPin": "123456"
    }
}

答案 1 :(得分:0)

你的numpy数组需要第四个维度,通常的标准是用第一个维度对样本进行编号,因此将(1000,28,28)更改为(1,1000,28,28)。

您可以阅读有关此here的更多信息。

答案 2 :(得分:0)

从您的输入看起来您使用tensorflow作为后端。

在keras中,input_shape应始终为3维。 对于作为后端的张量流,模型的input_shape将为

input_shape = [img_height,img_width,channels(depth)]

在你的情况下,应该是

的张量流后端
input_shape = [28,28,1]

train_x的形状应为

train_x = [batch_size,img_height,img_width,channels(depth)]

在你的情况下

train_x = [1000,28,28,1]

当您使用灰度图像时,图像的尺寸将是(image_height,image_width),因此您必须为图像添加额外的尺寸,这将导致(image_height,image_width,1)&# 39; 1'表示图像的深度,对于灰度等级为' 1'对于rgb来说就是' 3'。