【发布时间】:2019-09-16 14:18:33
【问题描述】:
我正在研究实现 CNN 以将图像分类为“好”或“坏”的可能性,但我目前的架构没有运气。
表示“坏”图像的特征:
- 过度曝光
- 过饱和
- 白平衡不正确
- 模糊
实现神经网络来根据这些特征对图像进行分类是否可行,还是最好留给传统算法来简单地查看整个图像的亮度/对比度变化并以此方式对其进行分类?
我曾尝试使用 VGGNet 架构训练 CNN,但无论历元数或步数如何,我似乎总是得到一个有偏见且不可靠的模型。
例子:
我当前模型的架构非常简单(因为我是整个机器学习领域的新手)但似乎可以很好地处理其他分类问题,我对其进行了一些修改以更好地处理这个二进制分类问题:
# CONV => RELU => POOL layer set
# define convolutional layers, use "ReLU" activation function
# and reduce the spatial size (width and height) with pool layers
model.add(Conv2D(32, (3, 3), padding="same", input_shape=input_shape)) # 32 3x3 filters (height, width, depth)
model.add(Activation("relu"))
model.add(BatchNormalization(axis=channel_dimension))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25)) # helps prevent overfitting (25% of neurons disconnected randomly)
# (CONV => RELU) * 2 => POOL layer set (increasing number of layers as you go deeper into CNN)
model.add(Conv2D(64, (3, 3), padding="same", input_shape=input_shape)) # 64 3x3 filters
model.add(Activation("relu"))
model.add(BatchNormalization(axis=channel_dimension))
model.add(Conv2D(64, (3, 3), padding="same", input_shape=input_shape)) # 64 3x3 filters
model.add(Activation("relu"))
model.add(BatchNormalization(axis=channel_dimension))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25)) # helps prevent overfitting (25% of neurons disconnected randomly)
# (CONV => RELU) * 3 => POOL layer set (input volume size becoming smaller and smaller)
model.add(Conv2D(128, (3, 3), padding="same", input_shape=input_shape)) # 128 3x3 filters
model.add(Activation("relu"))
model.add(BatchNormalization(axis=channel_dimension))
model.add(Conv2D(128, (3, 3), padding="same", input_shape=input_shape)) # 128 3x3 filters
model.add(Activation("relu"))
model.add(BatchNormalization(axis=channel_dimension))
model.add(Conv2D(128, (3, 3), padding="same", input_shape=input_shape)) # 128 3x3 filters
model.add(Activation("relu"))
model.add(BatchNormalization(axis=channel_dimension))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25)) # helps prevent overfitting (25% of neurons disconnected randomly)
# only set of FC => RELU layers
model.add(Flatten())
model.add(Dense(512))
model.add(Activation("relu"))
model.add(BatchNormalization())
model.add(Dropout(0.5))
# sigmoid classifier (output layer)
model.add(Dense(classes))
model.add(Activation("sigmoid"))
此模型是否有任何明显的遗漏或错误,或者我无法使用深度学习(使用我当前的 GPU,GTX 970)解决这个问题?
感谢您的时间和经验,
乔什
编辑: 这是我用于编译/训练模型的代码:
# initialise the model and optimiser
print("[INFO] Training network...")
opt = SGD(lr=initial_lr, decay=initial_lr / epochs)
model.compile(loss="sparse_categorical_crossentropy", optimizer=opt, metrics=["accuracy"])
# set up checkpoints
model_name = "output/50_epochs_{epoch:02d}_{val_acc:.2f}.model"
checkpoint = ModelCheckpoint(model_name, monitor='val_acc', verbose=1,
save_best_only=True, mode='max')
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2,
patience=5, min_lr=0.001)
tensorboard = TensorBoard(log_dir="logs/{}".format(time()))
callbacks_list = [checkpoint, reduce_lr, tensorboard]
# train the network
H = model.fit_generator(training_set, steps_per_epoch=500, epochs=50, validation_data=test_set, validation_steps=150, callbacks=callbacks_list)
【问题讨论】:
-
您当前的模型究竟有什么问题?
-
我认为这是过度拟合,因为无论我使用什么输入进行预测,结果都是有偏差且非常相似的。无论时代数或步骤数如何,它都表现出这种行为,这让我认为这是架构的问题。例如,对于三个不同的图像,我的结果是 0.987 差和 0.999 好(到 3 个有效数字)。
-
我不关注;什么是“0.987 坏和 0.999 好”?您的准确度是多少?
-
啊,对不起。在训练我的 50 个 epoch 模型结束时,我的准确率约为 80%。我之前给你的是模型的预测......
-
请在您的帖子中包含此信息!假设我们正在讨论 validation 准确性(请澄清这一点)。这是诊断可能问题的起点,而不是口头陈述(“有偏见且不可靠)或假设(我认为它过度拟合)......
标签: python machine-learning keras deep-learning conv-neural-network