ResNet时间序列预测模型始终输出预测值1.0,应如何排查原因?
时间序列预测ResNet输出固定为1.0的问题修复方案
核心错误点
- 输出层激活函数选择错误:回归任务的单神经元输出层不该用
softmax激活。softmax会将所有输出值归一化到总和为1,当只有1个输出神经元时,无论输入是什么,输出都会被强制映射为1.0,这是得到固定预测值的直接原因。回归任务应去掉激活函数用线性输出,若标签已归一化到0-1区间也可替换为sigmoid激活。 - 评价指标选择错误:
accuracy是分类任务专属指标,回归任务下该指标完全无参考意义,应该替换为MAE、RMSE这类回归适用的评价指标。
其他潜在问题
- 输入数据未做归一化:如果输入特征或标签值域差异过大,容易导致模型训练不收敛。
- 训练轮数设置过少:10轮训练对于深度残差网络来说通常不足以收敛,可根据验证集表现调整到50-100轮。
- 残差块实现不匹配:需要确认
residual_block函数的下采样逻辑和输出通道匹配规则,避免出现维度不匹配或梯度消失问题。
修正后的核心代码
def create_res_net(): inputs = Input(shape=(50, 1)) num_filters = 5 t = BatchNormalization()(inputs) t = Conv1D(kernel_size=18, strides=1, filters=num_filters, padding="same")(t) t = relu_bn(t) num_blocks_list = [2, 5, 5, 2] for i in range(len(num_blocks_list)): num_blocks = num_blocks_list[i] for j in range(num_blocks): t = residual_block(t, downsample=(j==0 and i!=0), filters=num_filters) num_filters *= 2 t = AveragePooling1D(2)(t) t = Flatten()(t) # 回归任务移除softmax激活,使用线性输出 outputs = Dense(1)(t) model = Model(inputs, outputs) # 替换为回归适用的评价指标 model.compile(optimizer='adam', loss='mse', metrics=['mae']) return model model = create_res_net() # 适当增加训练轮数,拆分验证集避免过拟合 model.fit(x=X, y=y_train, epochs=50, verbose=1, validation_split=0.2)
内容的提问来源于stack exchange,提问作者Houssem Eddine Louchene
相关产品推荐
相关产品推荐

