【问题标题】:CNN regression results in two distinct (incorrect) predictionsCNN 回归导致两个不同(不正确)的预测
【发布时间】:2021-03-27 02:13:54
【问题描述】:

我正在尝试使用 Python Keras CNN(Tensorflow 作为主干)解决回归问题,我尝试根据获取的 8 维卫星图像(23x45 像素)预测单个 y 值来自 Google Earth Engine 使用他们的 Python API。我目前有 280 张图像,我使用翻转和随机噪声来扩充以获得 2500 张图像。数据经过标准化和标准化,我已经删除了异常值和只有零的图像。

我已经测试了许多 CNN 架构,例如: (Convolution2D(4,4,3),MaxPooling2D(2,2),dense(50),dropout(0.4),dense(30),dropout(0.4),dense(1)

这会导致一种奇怪的行为,其中预测值主要位于两个不同的组或集群中(每个组的方差很小)。真实值的方差要高得多。见下图。

我选择不发布任何代码 sn-ps,因为我的问题更笼统。什么可能导致这种聚类预测?有什么好的常用技巧来改善结果吗? 我尝试使用来自 SciKit-Learn 的普通神经网络和回归工具来解决这个问题,方法是将图像展平为一个长数组(长度 23x45x8 = 8280)。这不会导致聚类,尽管准确性仍然很低。我认为这是由于数据不足或不适当造成的。

Plotted Truth (x) vs Prediction (y) which shows that the prediction is heavily clustered

【问题讨论】:

    标签: python machine-learning keras regression conv-neural-network


    【解决方案1】:

    您的模型非常简单,它甚至无法正确提取特征,所以我猜它不合适。你的 dropout 在 2 层中是 40%,对于这么小的网络来说这相当高。你也有线性激活,好像是这样。

    是的,样本的数量也会对组预测产生影响,大多数是选择样本最多的类。

    我还注意到您的一些真值大于 1 且小于 0。您必须正确归一化并使用正确的激活函数。

    【讨论】:

    • 感谢您的一些好主意。我修复了标准化,降低了 dropout,并通过一些改进使网络更深。我正在努力获取更多数据,但我想知道是否有关于使用什么损失函数和激活函数的好的指南?到目前为止,我通过所有密集层的 sigmoid 激活和损失函数 mean_squared_logarithmic_error 获得了最好的结果。
    • 深度学习中不使用sigmoid,因为它会导致梯度消失,也没有使用tanh。您必须使用 relu、leaky relu 或不要使用其他激活函数。
    • 我明白了,这很有帮助。
    猜你喜欢
    • 2020-03-30
    • 2018-07-30
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    相关资源
    最近更新 更多