循环神经网络训练报错:NotImplementedError无法转换符号张量
解决LSTM股票预测训练时的NotImplementedError错误
在训练用于股票价格预测的LSTM模型时,调用model.fit()出现以下错误:
NotImplementedError:无法将符号张量(sequential/lstm/strided_slice:0)转换为NumPy数组。此错误可能表示您正尝试将Tensor传递给NumPy调用,这是不被支持的
用户怀疑问题出在RNN第一层,尝试添加input_shape参数后仍报错,参考的示例是单词编码器场景,和当前股票预测场景不同。
原代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt import tensorflow as tf from sklearn.preprocessing import MinMaxScaler dataset_train = pd.read_csv('Google_Stock_Price_Train.csv') training_set = dataset_train.iloc[:, 1:2].values sc = MinMaxScaler(feature_range = (0,1)) training_set_scaled = sc.fit_transform(training_set) x_train = [] y_train = [] for i in range(60, 1258): #we have 1258 dates in our excel file x_train.append(training_set_scaled[i-60:i, 0]) y_train.append(training_set_scaled[i, 0]) x_train, y_train = np.array(x_train),np.array(y_train) x_train = np.reshape(x_train, (x_train.shape[0],x_train.shape[1],1)) model = tf.keras.Sequential() model.add(tf.keras.layers.LSTM(units=128,activation='tanh', return_sequences=True)) model.add(tf.keras.layers.Dropout(0.2)) model.add(tf.keras.layers.LSTM(units=128, activation='tanh',return_sequences=True)) model.add(tf.keras.layers.Dropout(0.2)) model.add(tf.keras.layers.LSTM(units=128, activation='tanh',return_sequences=True)) model.add(tf.keras.layers.Dropout(0.2)) model.add(tf.keras.layers.LSTM(units=128, activation='tanh')) model.add(tf.keras.layers.Dropout(0.2)) model.add(tf.keras.layers.Dense(units=1)) model.compile(optimizer = 'adam', loss = 'mean_squared_error') model.fit(x_train, y_train, epochs=100, batch_size=32)
修复方案
这个错误主要是TensorFlow与NumPy版本不兼容,或者模型输入未明确定义导致的,按以下步骤修复:
1. 明确第一层LSTM的input_shape
股票预测的输入维度是(时间步长, 特征数),这里时间步是60,特征数是1,必须在第一层LSTM中明确指定,否则模型无法正确推断输入形状。修改第一层代码:
model.add(tf.keras.layers.LSTM(units=128, activation='tanh', return_sequences=True, input_shape=(x_train.shape[1], 1)))
2. 修复版本兼容性问题
NumPy 1.24+移除了对符号张量转换的支持,而旧版TensorFlow未适配这个变化。可以二选一:
- 降级NumPy到1.23.x版本:
pip install numpy==1.23.5 - 升级TensorFlow到2.10及以上版本:
pip install tensorflow>=2.10
3. 确保输入数组类型正确
显式将输入数组转换为TensorFlow默认的float32类型,避免类型不匹配:
x_train = x_train.astype(np.float32) y_train = y_train.astype(np.float32)
修复后的完整代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt import tensorflow as tf from sklearn.preprocessing import MinMaxScaler dataset_train = pd.read_csv('Google_Stock_Price_Train.csv') training_set = dataset_train.iloc[:, 1:2].values sc = MinMaxScaler(feature_range = (0,1)) training_set_scaled = sc.fit_transform(training_set) x_train = [] y_train = [] for i in range(60, 1258): #we have 1258 dates in our excel file x_train.append(training_set_scaled[i-60:i, 0]) y_train.append(training_set_scaled[i, 0]) x_train, y_train = np.array(x_train),np.array(y_train) # 转换为float32类型 x_train = x_train.astype(np.float32) y_train = y_train.astype(np.float32) x_train = np.reshape(x_train, (x_train.shape[0],x_train.shape[1],1)) model = tf.keras.Sequential() # 添加input_shape参数 model.add(tf.keras.layers.LSTM(units=128, activation='tanh', return_sequences=True, input_shape=(x_train.shape[1], 1))) model.add(tf.keras.layers.Dropout(0.2)) model.add(tf.keras.layers.LSTM(units=128, activation='tanh',return_sequences=True)) model.add(tf.keras.layers.Dropout(0.2)) model.add(tf.keras.layers.LSTM(units=128, activation='tanh',return_sequences=True)) model.add(tf.keras.layers.Dropout(0.2)) model.add(tf.keras.layers.LSTM(units=128, activation='tanh')) model.add(tf.keras.layers.Dropout(0.2)) model.add(tf.keras.layers.Dense(units=1)) model.compile(optimizer = 'adam', loss = 'mean_squared_error') model.fit(x_train, y_train, epochs=100, batch_size=32)
内容的提问来源于stack exchange,提问作者Deon Hargrove
相关产品推荐
相关产品推荐

