LSTM层调用触发TypeError:输入数据类型为字符串不被允许
问题解决:LSTM训练时的字符串类型错误
错误原因
你的temp变量是字符串类型,而LSTM层仅支持数值型输入(如float32、int32等),类型不匹配导致报错。查看数据集可知,Daily minimum temperatures列的数值可能带有空格或非数字字符,导致pandas默认将其识别为字符串。
解决方案
读取数据后先将温度列转换为数值类型,具体步骤:
- 用
pd.to_numeric清理非数字内容,无法转换的值设为NaN - 填充转换产生的NaN值(示例用均值填充,可按需调整)
修改后的关键代码片段
data = pd.read_csv('/content/daily-minimum-temperatures-in-me.csv') # 转换温度列为数值型,处理异常值 data['Daily minimum temperatures'] = pd.to_numeric(data['Daily minimum temperatures'], errors='coerce') # 填充缺失值 data['Daily minimum temperatures'] = data['Daily minimum temperatures'].fillna(data['Daily minimum temperatures'].mean()) # 后续代码不变 dates = data['Date'].values temp = data['Daily minimum temperatures'].values
完整可运行代码
import numpy as np import pandas as pd from keras.layers import Dense, LSTM import matplotlib.pyplot as plt import tensorflow as tf data = pd.read_csv('/content/daily-minimum-temperatures-in-me.csv') # 转换温度列为数值型并处理缺失值 data['Daily minimum temperatures'] = pd.to_numeric(data['Daily minimum temperatures'], errors='coerce') data['Daily minimum temperatures'] = data['Daily minimum temperatures'].fillna(data['Daily minimum temperatures'].mean()) data.head(20) data.isnull().sum() dates = data['Date'].values temp = data['Daily minimum temperatures'].values plt.figure(figsize=(15,5), dpi=100) plt.plot(dates, temp) plt.title('Temperature average', fontsize=16); def windowed_dataset(series, window_size, batch_size, shuffle_buffer): series = tf.expand_dims(series, axis=-1) ds = tf.data.Dataset.from_tensor_slices(series) ds = ds.window(window_size + 1, shift=1, drop_remainder=True) ds = ds.flat_map(lambda w: w.batch(window_size + 1)) ds = ds.shuffle(shuffle_buffer) ds = ds.map(lambda w: (w[:-1], w[-1:])) return ds.batch(batch_size).prefetch(1) train_set = windowed_dataset(temp, window_size=60, batch_size=100, shuffle_buffer=1000) model = tf.keras.models.Sequential([ tf.keras.layers.LSTM(60, return_sequences=True), tf.keras.layers.LSTM(60), tf.keras.layers.Dense(30, activation="relu"), tf.keras.layers.Dense(10, activation="relu"), tf.keras.layers.Dense(1), ]) optimizer = tf.keras.optimizers.SGD(lr=1.0000e-04, momentum=0.9) model.compile(loss=tf.keras.losses.Huber(), optimizer=optimizer, metrics=["mae"]) history = model.fit(train_set,epochs=100)
验证方法
运行print(temp.dtype),输出应为float64,确认数据类型正确后再训练模型,即可解决该错误。
内容的提问来源于stack exchange,提问作者RayzioJax
相关产品推荐
相关产品推荐

