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

使用keras-beats的NBeats模型做时序预测遇float dtype ValueError

ValueError: Invalid dtype: float 使用keras-beats的NBeats模型时的数据类型错误

问题背景

尝试使用keras-beats库的NBeats模型进行时间序列预测,遇到浮点数据类型相关的ValueError。已尝试通过astype将数据转换为float32和float64,但问题仍未解决。

复现代码

from kerasbeats import prep_time_series, NBeatsModel
import pandas as pd
from sklearn.model_selection import train_test_split

# 导入数据集
df = pd.read_csv('DailyDelhiClimateTrain.csv', parse_dates=['date'], index_col='date')
df.sort_index(inplace=True)

# 预处理单变量时间序列
X, y = prep_time_series(df['meantemp'], lookback=7, horizon=1)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, shuffle=False, test_size=0.2)

# 初始化并拟合模型
nbeats = NBeatsModel(model_type='generic', lookback=7, horizon=1)
nbeats.fit(X, y)

错误信息

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[104], line 4
      1 X = X.astype('float64')
      2 y = y.astype('float64')
----> 4 nbeats.fit(X,y)

File ~\AppData\Roaming\Python\Python311\site-packages\kerasbeats\nbeats.py:384, in NBeatsModel.fit(self, X, y, **kwargs)
    382 """Build and fit model"""
    383 self.build_layer()
---> 384 self.build_model()
    385 self.model.compile(optimizer = keras.optimizers.Adam(self.learning_rate), 
    386                    loss      = [self.loss],
    387                    metrics   = ['mae', 'mape'])
    388 self.model.fit(X, y, batch_size = self.batch_size, **kwargs)

File ~\AppData\Roaming\Python\Python311\site-packages\kerasbeats\nbeats.py:376, in NBeatsModel.build_model(self)
    374 def build_model(self):
    375     """Creates keras model to use for fitting"""
---> 376     inputs     = keras.layers.Input(shape = (self.horizon * self.lookback, ), dtype = 'float')
    377     forecasts  = self.model_layer(inputs)
    378     self.model = Model(inputs, forecasts)

File ~\AppData\Roaming\Python\Python311\site-packages\keras\src\layers\core\input_layer.py:143, in Input(shape, batch_size, dtype, sparse, batch_shape, name, tensor)
     89 @keras_export(["keras.layers.Input", "keras.Input"])
     90 def Input(
     91     shape=None,
   (...)
     97     tensor=None,
     98 ):
     99     """Used to instantiate a Keras tensor.
    100 
    101     A Keras tensor is a symbolic tensor-like object, which we augment with
   (...)
    141     ```
    142     """
---> 143     layer = InputLayer(
    144         shape=shape,
    145         batch_size=batch_size,
    146         dtype=dtype,
    147         sparse=sparse,
    148         batch_shape=batch_shape,
    149         name=name,
    150         input_tensor=tensor,
    151     )
    152     return layer.output

File ~\AppData\Roaming\Python\Python311\site-packages\keras\src\layers\core\input_layer.py:49, in InputLayer.__init__(self, shape, batch_size, dtype, sparse, batch_shape, input_tensor, name, **kwargs)
     47     batch_shape = (batch_size,) + shape
     48 self.batch_shape = tuple(batch_shape)
---> 49 self._dtype = backend.standardize_dtype(dtype)
     51 self.sparse = bool(sparse)
     52 if self.sparse and not backend.SUPPORTS_SPARSE_TENSORS:

File ~\AppData\Roaming\Python\Python311\site-packages\keras\src\backend\common\variables.py:521, in standardize_dtype(dtype)
    518     dtype = dtype.__name__
    520 if dtype not in dtypes.ALLOWED_DTYPES:
---> 521     raise ValueError(f"Invalid dtype: {dtype}")
    522 return dtype

ValueError: Invalid dtype: float

问题根源

错误来自keras-beats库的nbeats.py文件第376行:代码中给keras.layers.Input指定了dtype='float',但新版Keras(尤其是Keras 3+)不接受这种泛称的浮点类型,必须指定具体的类型如float32或float64。

解决方案

方案1:修改keras-beats库源码

找到Python环境中keras-beats的安装路径(报错信息中给出的路径为~\AppData\Roaming\Python\Python311\site-packages\kerasbeats\nbeats.py),打开该文件并定位到build_model方法,将:

inputs = keras.layers.Input(shape = (self.horizon * self.lookback, ), dtype = 'float')

修改为:

inputs = keras.layers.Input(shape=(self.horizon * self.lookback, ), dtype='float32')

保存文件后重新运行代码即可。

方案2:重写模型类(无需修改库源码)

创建NBeatsModel的子类,重写build_model方法以修正dtype参数:

from kerasbeats import NBeatsModel
from keras import Model, layers

class FixedNBeatsModel(NBeatsModel):
    def build_model(self):
        # 指定具体的浮点类型,这里用float32,也可以换成float64
        inputs = layers.Input(shape=(self.horizon * self.lookback, ), dtype='float32')
        forecasts = self.model_layer(inputs)
        self.model = Model(inputs, forecasts)

# 使用修正后的模型类初始化
nbeats = FixedNBeatsModel(model_type='generic', lookback=7, horizon=1)
# 确保数据类型和模型一致
X = X.astype('float32')
y = y.astype('float32')
nbeats.fit(X, y)

方案3:降级Keras版本(不推荐)

如果不想修改代码或库源码,可以尝试降级到Keras 2.x版本,旧版Keras可能兼容dtype='float'的写法,但这只是临时解决方案,长期来看推荐前两种方案。

注意事项

  • 确保输入数据X、y的类型与模型Input层指定的dtype一致(比如都用float32)
  • Keras 3对数据类型的校验更严格,建议始终使用具体的数值类型标识

内容的提问来源于stack exchange,提问作者Priyanshu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 21:40:55