股票预测代码报错:AttributeError与NameError问题求助
咱们一步步来拆解你遇到的两个报错,彻底搞定你的股票预测模型代码:
第一个报错:AttributeError: module 'tensorflow' has no attribute 'get_default_graph'
问题根源
你同时混用了**tensorflow.keras和原生keras库**,这在TensorFlow 2.x版本里是大忌!这两个库在TF2.x已经合并成tensorflow.keras,原生keras会调用TensorFlow旧版本的API(比如tf.get_default_graph()),但TF2.x已经移除了这个旧API的直接调用方式,所以触发了属性错误。看你最初的导入列表,既导入了from tensorflow.keras.models import Sequential,又导入了from keras.models import Sequential,这就是冲突的核心原因。
修复方案
彻底抛弃原生keras的导入,所有模块统一使用tensorflow.keras。
第二个报错:NameError: name 'Sequential' is not defined
问题根源
你修改后的代码里,虽然写过model = tf.keras.Sequential(),但后面构建模型时又直接用Sequential(),而你并没有把Sequential类导入到当前命名空间,也没使用完整的tf.keras.Sequential路径调用,Python自然找不到这个名称。另外你还保留了from keras.layers import Dense, LSTM这种原生keras的导入,依然会埋下冲突隐患。
正确的代码调整方案
第一步:统一导入tensorflow.keras模块
把所有原生keras的导入全部删掉,替换成tensorflow.keras的对应模块:
import math import pandas_datareader as web import numpy as np import pandas as pd from sklearn.preprocessing import MinMaxScaler import quandl import tensorflow as tf from tensorflow.keras.layers import Dense, LSTM # 用TF官方集成的层 import matplotlib.pyplot as plt plt.style.use('fivethirtyeight')
第二步:二选一构建模型
方式1:使用完整的tf.keras路径调用
这种方式不需要额外导入类,直接用完整路径,避免命名冲突:
# Build the LSTM network model model = tf.keras.Sequential() model.add(tf.keras.layers.LSTM(units=50, return_sequences=True, input_shape=(x_train.shape[1], 1))) model.add(tf.keras.layers.LSTM(units=50, return_sequences=False)) model.add(tf.keras.layers.Dense(units=25)) model.add(tf.keras.layers.Dense(units=1))
方式2:提前导入所需类
如果觉得完整路径太繁琐,可以提前导入需要的类,之后直接使用类名:
# 先导入需要的模型和层类 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, LSTM # 然后构建模型 model = Sequential() model.add(LSTM(units=50, return_sequences=True, input_shape=(x_train.shape[1], 1))) model.add(LSTM(units=50, return_sequences=False)) model.add(Dense(units=25)) model.add(Dense(units=1))
额外小贴士
- 检查你的TensorFlow版本,确保是2.x以上:执行
print(tf.__version__)查看,如果版本过低,用pip install --upgrade tensorflow升级。 - TensorFlow 2.x默认启用Eager Execution,不需要手动处理图会话,别再尝试调用
tf.get_default_graph()这类旧API啦。
内容的提问来源于stack exchange,提问作者Abood

