使用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
相关产品推荐
相关产品推荐

