输入图像已标准化为(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)
回答:
首先,要设计一个输出范围如此大的模型是非常困难的,模型的错误率会非常高。
- 我建议你将输出标准化到(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