You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
---&gt; 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.

问题原因

  1. 内置损失函数无'nse':Keras/TensorFlow的官方内置损失函数中不存在名为nse的函数,nse(纳什效率系数)属于自定义指标/损失,需要手动实现。
  2. 编译语句覆盖错误:代码中连续三次调用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'])

代码其他问题修正

除了损失函数问题,代码中还有几处语法/逻辑错误需要修复:

  1. 重复定义模型:代码中两次定义model = tf.keras.Sequential([...]),第二次会覆盖第一次的模型结构,建议保留其中一个即可。
  2. 函数定义语法错误: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
  1. 变量名拼写错误: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)
  1. 变量名不一致: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 15:07:02