【问题标题】:What Activation Function is appropriate for input range (0,1) and output range (-∞,∞) for Regression Nerwork in Keras什么激活函数适用于 Keras 中回归神经网络的输入范围 (0,1) 和输出范围 (-∞,∞)
【发布时间】:2020-08-19 12:26:23
【问题描述】:

输入图像被正则化为 (0, 1) 并且输出是具有伪高斯分布 (-∞,∞) 的 float32 值

拟合后,训练和验证准确度均超过 0.999 但是当使用训练集和验证集进行预测时,它不会自我复制。

预测输出仅显示负值(和少数正相同值)

这个问题是不是激活函数选择错误造成的?

我也尝试过,而不是'relu'、'linear'、'sigmoid'。 结果是一样的。

model = Sequential()
model.add(Convolution1D(filters=64, kernel_size=2, input_shape=(img_width, img_height)))
model.add(Activation("relu"))
model.add(MaxPooling1D(pool_size=(2)))

model.add(Convolution1D(filters=32, kernel_size=2))
model.add(Activation("relu"))
model.add(MaxPooling1D(pool_size=(2)))

model.add(Flatten())
model.add(Dense(256))
model.add(Activation("relu"))
model.add(Dense(1, activation='linear'))

model.compile(loss='mse', optimizer=optimizers.RMSprop(lr=0.0001), metrics=['accuracy'])

这样预测,

model.fit(x_train, y_train, epochs=2,
          validation_data=(x_valid, y_valid),
          batch_size=2048,
          shuffle='batch',
          use_multiprocessing=True)
# right after fitting 
result = model.predict(x_train, use_multiprocessing=True)

【问题讨论】:

  • 这是一个回归问题,accuracy是一个分类指标,用accuracy做regression是没有意义的。您应该只关注损失或使用 mae 作为指标
  • 问题是数据集中的空数据点或无意义的数据点。我已经消除了它们,但它确实可以部分复制。

标签: python tensorflow machine-learning keras deep-learning


【解决方案1】:

首先,要设计一个输出这么大范围的模型是非常困难的,模型的错误率会非常高。

  1. 我建议您在 (0., 1.) 范围内标准化输出,并在最后一层使用 sigmoid。

您始终可以使用逆变换来重建原始输出。

mn = np.min(y_train)
mx = np.max(y_train)
y_train = (y_train - mn)/(mx - mn)

# ... train

# inverse transform
y_train_original = y_train*(mx-mn) + mn

拟合后,训练和验证准确度均超过 0.999,但当 使用训练集和验证集进行预测,它不会自我复制。

原因:过拟合。你的数据不可能在如此复杂的输出分布下学习,所以模型只是盲目地记忆训练数据而不学习任何模式。

避免:

  • 使用输出标准化。

  • model.add(Dense(256)) - 减少这里的神经元数量,试试32->64->128

  • 使用 dropout

【讨论】:

  • 这不是我的问题的解决方案,但被选为答案。
【解决方案2】:

Convolution1D 不是处理图像的标准选择,我建议你使用 Convolution2D

其次,'accuracy' 不是回归任务的正确指标,好的选择是均方误差 (mse)、平均绝对误差 (mae)、均方根误差 (rmse)

【讨论】:

    【解决方案3】:

    拟合后,训练和验证准确度均超过 0.999,但 当使用训练集和验证集进行预测时,它不会重现 自己。

    这表明您的预测代码出了点问题,而您没有将其包括在内。您的测试数据或您的预测方式有问题(没有加载权重?)

    【讨论】:

    • 请也为您的数据添加代码,您是否也正则化测试输入 0-1?
    • 是的,从代码中可以看出,我只是再次使用 x_train 进行预测。 x_train 与拟合变量相同。使用 HDF5Matrix(keras utils) 加载的数据,使用 'lambda x: x/255.0' 进行标准化
    • 我刚刚注意到您的批量大小是 2048。这非常大并且可能会导致问题,通常最佳做法是批量大小为 32 或 64。
    • 批量大小为 32 的同样奇怪的结果。我猜,输入范围 [0, 1] 和输出范围 (-∞, ∞) 与训练网络不匹配。它看起来像纠正了。我也应该在 [0, 1] 范围内规范输出(y_train)吗?
    猜你喜欢
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 2018-03-22
    • 2017-06-23
    • 2020-03-27
    • 1970-01-01
    • 2019-08-02
    • 2020-05-17
    相关资源
    最近更新 更多