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

循环神经网络训练报错: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:05:34