CNN 没有正确学习

数据挖掘 机器学习 神经网络 深度学习 张量流 美国有线电视新闻网
2022-01-30 22:25:02

在将我的问题标记为重复之前,我想说我已经尝试了类似问题中提到的所有可能的解决方案,但这似乎不起作用。

我目前正在研究血细胞分类问题,我们基本上必须对血液图像(4类)进行分类。该数据集由 9957 张图像组成,所有 4 个类别的图像数量几乎相等。即使在尝试了不同的优化器和学习率之后,准确率也始终徘徊在 25-27% 左右。我什至尝试训练多达 100 个 epoch。图像增强没有帮助。此外,它并不是为所有图像预测相同的类别,尽管对于 1 个特定批次的图像,它预测相同的类别。它再次为下一批中的所有图像预测其他类别。所以,我只想知道,我可能做错了什么?数据集是否不够,或者架构应该有更多的隐藏层,或者我没有正确实现优化器或损失函数,或者我在代码中忽略了任何愚蠢的错误?

我的 CNN 架构:(fs 表示 filter_size,nf 表示过滤器数量,s 是 no.strides)

Input(80,80,1)->Conv(fs = 3, nf = 80, s = [1,1,1,1])
Activation(LeakyReLU)->Conv(fs = 3,nf=64,s=[1,1,1,1])
Activation(LReLU)->Pool(ps = [1,2,2,1],s=[1,2,2,1]
Conv(fs = 3,nf = 64,s=[1,1,1,1])->Activation(LReLU)
Dropout(prob = 0.75)->Flatten
FullyConnected(output_features = 128)->Dropout(prob = 0.5)
FullyConnected(output_features = 4)


loss_value = tf.reduce_mean(loss_fn)
optimizer = tf.train.AdamOptimizer()

loss_min_fn = optimizer.minimize(loss = loss_value)
check_prediction = tf.equal(tf.argmax(y,axis=1),y_pred)
model_accuracy = tf.reduce_mean(tf.cast(check_prediction, tf.float32)

sess.run(loss_min_fn, feed_dict = {x:X_train_batch, y:y_train_batch})         
train_accuracy = train_accuracy + sess.run(model_accuracy, feed_dict={x : X_train_batch,y:y_train_batch})
train_loss = train_loss + sess.run(loss_value, feed_dict={x : X_train_batch,y:y_train_batch})

图像看起来像这样
在此处输入图像描述 单核细胞 中性粒细胞 嗜酸性粒细胞

2个回答

我会做一些观察,希望能有所帮助。

  1. 我会删除 dropout 层,直到您有证据表明数据过度拟合。dropout 层通常用于使模型更通用,在这种情况下这不是您的问题,它可能会损害您的模型。
  2. 图像可能没有足够的信息来区分类别。专家可以通过查看图像来分配类别标签吗?如果不是,则可能只是从图像中无法实现。
  3. 您的准确度分数意味着该模型只是在猜测,因为随机机会分类器也有望执行。但是,奇怪的是,您似乎在一门课上获得了合理的准确性。您可能会发现需要将多个模型配置为 one-vs-the-rest 二进制分类器。每个模型都可以进行独特的配置和训练,以专注于一个类。训练完成后(这可能很耗时),预测应该是有效的。
  4. 最后,你认为模型在你停止训练时已经停止学习了吗?直观地说,在看到一个真正完善的模型之前,我预计需要数万个 epoch 甚至数百万个。100 个 epoch 似乎才刚刚开始学习。由于这个成本,我建议您配置您的模型,以便您可以从停止点继续训练。

无论如何,不​​断尝试不同的图层配置。不过要记住的一件事是,每次使用卷积层时,都会丢失信息。您需要考虑每个卷积层丢失了多少信息。

我建议如下:

在形状 1*1*3 的开头添加一个 1*1 卷积层。因此,如果颜色变化很微妙,这会将图像更改为另一个颜色空间。添加一个最大池,然后添加另一个 1*1*your_choice 来学习颜色映射。

添加跳过连接(^ 有这个,甚至没有)。这将保留信息和速度训练。

最后一层的有效感受野大小是不够的。至少再添加一个最大池(可能是 2 个)和至少两到三个卷积层。

您的某些类可能难以区分。使用硬挖掘或焦点损失来关注误差较大的图像。(也许减少辍学,看看)

我希望您正在对图像进行预处理和规范化。

如果可以的话,请告诉我们您的数据集和损失曲线,以及图像的大小。

回来报告。