假设你有1000张训练图片,每张图片都是48x48的灰度图像。将这些图片加载到numpy数组中后,数组的形状将为:(1000, 48, 48)
。
这意味着你的数组中有1000个元素,每个元素都是一个48x48的矩阵。
现在,为了将这些数据馈送到训练卷积神经网络(CNN)中,你需要将此列表重新调整为(1000, 48, 48, 1)
的形状,其中1
代表通道维度。由于你使用的是灰度图像,所以必须使用1
。如果是RGB图像,则会使用3
。
考虑下面给出的示例:
x_train = np.random.rand(1000, 48, 48)
y_train = np.array([np.random.randint(0, 2) for x in range(1000)])
model = Sequential()
model.add(Conv2D(32, kernel_size=(5, 5),
activation='relu',
input_shape=(48,48,1)
)
)
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam')
model.fit(x_train, y_train, epochs=10, batch_size=32)
这将会导致一个错误,
检查输入时发生错误:期望 conv2d_3_input 有4个维度,但得到了形状为 (1000, 48,48) 的数组。
为了解决这个问题,需要对 x_train
进行重新塑形,像这样:
x_train = x_train.reshape(x_train.shape[0], x_train.shape[1], x_train.shape[2], 1)
现在可以拟合模型了:
model.fit(x_train, y_train, epochs=10, batch_size=32)
Epoch 1/10
1000/1000 [==============================] - 1s 1ms/step - loss: 0.7177
Epoch 2/10
1000/1000 [==============================] - 1s 882us/step - loss: 0.6762
Epoch 3/10
1000/1000 [==============================] - 1s 870us/step - loss: 0.5882
Epoch 4/10
1000/1000 [==============================] - 1s 888us/step - loss: 0.4588
Epoch 5/10
1000/1000 [==============================] - 1s 906us/step - loss: 0.3272
Epoch 6/10
1000/1000 [==============================] - 1s 910us/step - loss: 0.2228
Epoch 7/10
1000/1000 [==============================] - 1s 895us/step - loss: 0.1607
Epoch 8/10
1000/1000 [==============================] - 1s 879us/step - loss: 0.1172
Epoch 9/10
1000/1000 [==============================] - 1s 886us/step - loss: 0.0935
Epoch 10/10
1000/1000 [==============================] - 1s 888us/step - loss: 0.0638