如何根据输入形状定义conv2D大小

时间:2020-04-27 11:08:11

标签: machine-learning conv-neural-network

我不知道如何测量Conv2D的大小,MaxPooling2D的pool_size等以构建CNN?例如,我看到了一个教程,当图像大小28*28时,他们可以运行该教程:

model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28,28,1)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))

现在,我正在处理图像尺寸 100 * 100 的数据集。因此,我尝试像示例一样构建模型:

model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(100,100,1)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(64, activation='softmax'))

但是,我根本没有得到令人满意的结果:

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

n=100   # to reduce time in slow pc

model.fit(X_train_4d[:n], y_train_categorical[:n], 
          batch_size=32, epochs=5, verbose=1)

loss, accuracy = model.evaluate(X_test_4d[:n], y_test_categorical[:n], verbose=0)
print('\nTest Acc: ', accuracy)

输出:

Epoch 1/5
100/100 [==============================] - 12s 121ms/step - loss: 6.0578 - accuracy: 0.0000e+00
Epoch 2/5
100/100 [==============================] - 10s 96ms/step - loss: 4.0280 - accuracy: 0.1000
Epoch 3/5
100/100 [==============================] - 9s 94ms/step - loss: 3.7660 - accuracy: 0.3000
Epoch 4/5
100/100 [==============================] - 9s 94ms/step - loss: 3.2143 - accuracy: 0.3600
Epoch 5/5
100/100 [==============================] - 10s 103ms/step - loss: 2.3389 - accuracy: 0.4000

Test Acc:  0.25999999046325684

因此,我认为对于不同的input_shape,网格的大小,密度应该有所不同吗?但是,我不知道应该为哪种形状选择哪种尺寸?

1 个答案:

答案 0 :(得分:1)

通过查看您的代码,看来您有64个类。为了训练具有如此大量分类的模型,我们需要每个分类至少有足够数量的示例(例如10个),以获得合理的分类精度。我相信您为测试集获得的低准确性主要不是因为模型参数有任何错误,而是因为数据量有限。

我看到您通过设置n=100限制了训练数据,这显然不足以训练模型。我假设您需要在数据库中至少有10000个数据样本才能获得可接受的分类精度。使用完整的数据库,并花一些时间进行培训。

此外,您需要指定一些验证数据以观察模型在整个训练过程中的表现。例如,可以通过在validation_split=0.2中设置model.fit()参数来轻松完成此操作,该参数将花费20%的训练数据进行验证。然后,您将有一个验证损失,应经常监视该验证损失,并在验证损失达到最小时停止训练,以防止过拟合。