Colab中LSTM模型训练报错:未知损失函数'nse'求助
问题:Colab中LSTM训练报错"未知损失函数'nse'"
在Colab中分块运行股票价格预测的LSTM模型代码时,执行语句model.fit(x, y, epochs=epochs, batch_size=batch_size, callbacks=callbacks)出现ValueError,错误提示未知损失函数'nse'。
错误详情
Epoch 1/2 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-171-3925766564e3> in <cell line: 1>() ----> 1 model.fit(x, y, epochs=epochs, batch_size=batch_size, callbacks=callbacks) 1 frames /usr/local/lib/python3.10/dist-packages/keras/engine/training.py in tf__train_function(iterator) 13 try: 14 do_return = True ---> 15 retval_ = ag__.converted_call(ag__.ld(step_function), (ag__.ld(self), ag__.ld(iterator)), None, fscope) 16 except: 17 do_return = False ValueError: in user code: File "/usr/local/lib/python3.10/dist-packages/keras/engine/training.py", line 1284, in train_function * return step_function(self, iterator) File "/usr/local/lib/python3.10/dist-packages/keras/engine/training.py", line 1268, in step_function ** outputs = model.distribute_strategy.run(run_step, args=(data,)) File "/usr/local/lib/python3.10/dist-packages/keras/engine/training.py", line 1249, in run_step ** outputs = model.train_step(data) File "/usr/local/lib/python3.10/dist-packages/keras/engine/training.py", line 1051, in train_step loss = self.compute_loss(x, y, y_pred, sample_weight) File "/usr/local/lib/python3.10/dist-packages/keras/engine/training.py", line 1109, in compute_loss return self.compiled_loss( File "/usr/local/lib/python3.10/dist-packages/keras/engine/compile_utils.py", line 240, in __call__ self.build(y_pred) File "/usr/local/lib/python3.10/dist-packages/keras/engine/compile_utils.py", line 182, in build self._losses = tf.nest.map_structure( File "/usr/local/lib/python3.10/dist-packages/keras/engine/compile_utils.py", line 353, in _get_loss_object loss = losses_mod.get(loss) File "/usr/local/lib/python3.10/dist-packages/keras/losses.py", line 2653, in get return deserialize(identifier, use_legacy_format=use_legacy_format) File "/usr/local/lib/python3.10/dist-packages/keras/losses.py", line 2600, in deserialize return legacy_serialization.deserialize_keras_object( File "/usr/local/lib/python3.10/dist-packages/keras/saving/legacy/serialization.py", line 543, in deserialize_keras_object raise ValueError( ValueError: Unknown loss function: 'nse'. Please ensure you are using a `keras.utils.custom_object_scope` and that this object is included in the scope.
问题原因
- 内置损失函数无'nse':Keras/TensorFlow的官方内置损失函数中不存在名为
nse的函数,nse(纳什效率系数)属于自定义指标/损失,需要手动实现。 - 编译语句覆盖错误:代码中连续三次调用
model.compile,最后一次配置loss='nse'覆盖了前两次的有效配置,而未提前定义该损失函数,导致训练时无法识别。
修复方案
方案1:替换为内置损失函数(快速解决)
如果不需要使用nse作为损失,直接保留第一次编译的配置,使用常用的MSE(均方误差)损失:
# 替换之前的三次compile语句,只保留这一行 model.compile(optimizer='adam', loss=tf.keras.losses.MeanSquaredError(), metrics=['accuracy'])
方案2:自定义并使用nse损失函数
如果确实需要用nse作为损失,先实现nse的计算逻辑(通常用1-NSE的等价形式作为损失),再编译模型:
步骤1:定义nse损失函数
import tensorflow as tf def nse_loss(y_true, y_pred): # 计算纳什效率系数的损失形式:分子为预测与真实值的平方和,分母为真实值与均值的平方和 numerator = tf.reduce_sum(tf.square(y_true - y_pred)) denominator = tf.reduce_sum(tf.square(y_true - tf.reduce_mean(y_true))) # 返回比值作为损失(值越小,模型效果越好) return numerator / denominator
步骤2:编译模型时使用自定义损失
model.compile(optimizer='adam', loss=nse_loss, metrics=['accuracy'])
代码其他问题修正
除了损失函数问题,代码中还有几处语法/逻辑错误需要修复:
- 重复定义模型:代码中两次定义
model = tf.keras.Sequential([...]),第二次会覆盖第一次的模型结构,建议保留其中一个即可。 - 函数定义语法错误:
get_test_data函数定义缺少冒号且参数缺失,修正为:
def get_test_data(seq_len, normalise): data_windows=[] for i in range(len_test - seq_len): data_windows.append(data_test[i:i+seq_len]) data_windows = np.array(data_windows).astype(float) data_windows = normalise_windows(data_windows, single_window=False) if normalise else data_windows x = data_windows[:, :-1] y = data_windows[:, -1, [0]] return x,y
- 变量名拼写错误:
sequence_lenght应为sequence_length,修正get_last_data调用处的变量名:
last_data_2_predict_prices = get_last_data(-(sequence_length-1), False) last_data_2_predict = get_last_data(-(sequence_length-1), True)
- 变量名不一致:
last_data_2_predict_prices_1st_prise应为last_data_2_predict_prices_1st_price,修正反归一化处的调用:
predicted_price = de_normalise_predicted(last_data_2_predict_prices_1st_prise, predictions2[0][0])
内容的提问来源于stack exchange,提问作者CloudNE
相关产品推荐
相关产品推荐

