对于回归网络在Keras中,输入范围为(0,1)和输出范围为(-∞,∞)时,适用的激活函数是什么

输入图像已标准化为(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)# 拟合后立即进行预测result = model.predict(x_train, use_multiprocessing=True)

回答:

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

  1. 我建议你将输出标准化到(0., 1.)范围,并在最后一层使用sigmoid激活函数。

你总是可以使用逆变换来重建原始输出。

mn = np.min(y_train)mx = np.max(y_train)y_train = (y_train - mn)/(mx - mn)# ... 训练# 逆变换y_train_original = y_train*(mx-mn) + mn

当模型拟合时,训练和验证的准确率都超过0.999,但使用训练和验证集进行预测时,无法重现结果。

原因:过拟合。你的数据无法学习如此复杂的输出分布,因此模型只是盲目地记忆训练数据而没有学习任何模式。

为了避免这个问题:

  • 使用输出标准化。

  • model.add(Dense(256)) – 减少此处的neurons数量,尝试使用32->64->128

  • 使用dropout

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注