基于Galaxy10CNN的星系形态分类项目实战,TensorFlow环境配置踩坑及记录
项目地址
链接: 项目地址
实现
打开链接,将这一个文件
跑通即可。
踩坑点:深度学习项目环境配置
下面笔者简述环境配置过程及踩坑点:
坑1:TensorFlow==2.16.1
默认安装的最新版本,其自带版本匹配的tf_keras,但代码中单独使用keras包,不会报错,但是在内部调用中会自动调用TensorFlow自带的tf_keras包。
此时会出现第一个问题:报错如下:
Traceback (most recent call last): File "C:\Users\99773\Desktop\AI_dmx\G10_classification_3.9.py", line 41, in <module> galaxy10net = Galaxy10CNN() File "C:\APP_WORK\Anaconda3\envs\AI_dmx\lib\site-packages\astroNN\models_init_.py", line 64, in Galaxy10CNN galaxy10_net = Cifar10CNN() File "C:\APP_WORK\Anaconda3\envs\AI_dmx\lib\site-packages\astroNN\models\misc_models.py", line 54, in init super().init() File "C:\APP_WORK\Anaconda3\envs\AI_dmx\lib\site-packages\astroNN\models\base_cnn.py", line 168, in init super().init() File "C:\APP_WORK\Anaconda3\envs\AI_dmx\lib\site-packages\astroNN\models\base_master_nn.py", line 68, in init self._keras_ver = tfk.version # tensorflow.keras version File "C:\APP_WORK\Anaconda3\envs\AI_dmx\lib\site-packages\tensorflow\python\util\lazy_loader.py", line 211, in getattr return getattr(module, item) AttributeError: module 'keras._tf_keras.keras' has no attribute 'version'
具体问题描述为:找不到tf_keras的包,但是笔者通过路径找到该包时,发现version是存在的。
分析如下:
-
Traceback (most recent call last):
:这是Python程序出现异常时的标准输出格式,表示接下来会显示引发当前错误的函数调用序列(即“调用栈”),从最近的调用开始追溯。 -
File "C:\Users\99773\Desktop\AI_dmx\G10_classification_3.9.py", line 41, in <module>
:指出错误发生在哪个文件中(G10_classification_3.9.py
),具体是第41行,并且该行位于文件的顶级模块(<module>
)。 -
galaxy10net = Galaxy10CNN()
:这是出错的代码行,尝试创建一个名为Galaxy10CNN
的类的实例,并将其赋值给变量galaxy10net
。 -
File "C:\APP_WORK\Anaconda3\envs\AI_dmx\lib\site-packages\astroNN\models\__init__.py", line 64, in Galaxy10CNN
:错误追溯到astroNN.models
包中的__init__.py
文件,第64行的Galaxy10CNN
类定义内。 -
galaxy10_net = Cifar10CNN()
:在Galaxy10CNN
类的定义中,调用了Cifar10CNN
类的构造函数来创建实例。 -
File "C:\APP_WORK\Anaconda3\envs\AI_dmx\lib\site-packages\astroNN\models\misc_models.py", line 54, in __init__
:进一步追溯到astroNN.models.misc_models.py
文件中的Cifar10CNN
类的__init__
方法(第54行)。 -
super().__init__()
:该行代码调用了父类的初始化方法。 -
File "C:\APP_WORK\Anaconda3\envs\AI_dmx\lib\site-packages\astroNN\models\base_cnn.py", line 168, in __init__
:继续追溯到父类定义所在的文件base_cnn.py
,以及其__init__
方法的第168行。 -
super().__init__()
:此处同样调用了更上层父类的初始化方法。 -
File "C:\APP_WORK\Anaconda3\envs\AI_dmx\lib\site-packages\astroNN\models\base_master_nn.py", line 68, in __init__
:最终追溯到最顶层父类定义所在的文件base_master_nn.py
及其__init__
方法的第68行。 -
self._keras_ver = tfk.__version__ # tensorflow.keras version
:在该行代码中,试图获取tensorflow.keras
模块的版本号,并将其赋值给实例变量self._keras_ver
。 -
File "C:\APP_WORK\Anaconda3\envs\AI_dmx\lib\site-packages\tensorflow\python\util\lazy_loader.py", line 211, in __getattr__
:由于tensorflow.keras
是通过延迟加载(lazy loading)的方式引入的,因此实际访问属性时会触发lazy_loader.py
文件中__getattr__
方法。 -
return getattr(module, item)
:在__getattr__
方法中,尝试从实际加载的模块(module
)中获取指定属性(item
)。 -
AttributeError: module 'keras._tf_keras.keras' has no attribute '__version__'
:最终抛出异常,表示在模块keras._tf_keras.keras
中找不到名为__version__
的属性(即版本号)。这可能是由于该模块的实现不包含版本信息,或者模块结构发生了变化导致无法按预期方式访问版本号。
解决方法:
直接查询TensorFlow版本
如果keras._tf_keras.keras
确实不提供__version__
属性,您可以考虑直接查询tensorflow
的版本,因为tensorflow.keras
是tensorflow
的一部分。修改base_master_nn.py
文件中第68行代码为:
self._keras_ver = tf.__version__ # 使用tensorflow的版本代替
这样虽然不能得到tensorflow.keras
模块本身的精确版本,但通常情况下,tensorflow
的版本足以反映其内部keras
组件的大致版本信息。
第一个问题解决之后,继续运行,报出第二个问题:报错如下:
出现了内部调用的函数位置参数不匹配问题。这肯定是astroNN包与TensorFlow版不一致导致的,而且无法轻易修改,会导致后续一系列问题。
解决办法:
astroNN 包保持版本不变,tensorflow==2.12.1
,但是该版本没有对应的tf_keras包,单独安装keras==2.12.0
坑2:TensorFlow==2.12.1
解决过程:
会有两个报错,也是版本不完全匹配导致的,但是该版本不匹配可以通过将报错的代码注释掉即可顺利跑通。
第一个报错:
sample_weight_mode = sample_weight_mode
注释掉这句即可
第二个报错:
说是TensorFlow版本小于2.13,请升级版本!
注意,此时千万不要升级版本,把报错的地方,即需要使用2.13版本TensorFlow的代码注释掉即可,只要不影响功能的实现即可。
具体位置:
该文件中注释掉的部分即为使用2.13版本的TensorFlow,注释掉即可(可能2.13版本的可以跳过这个错误直接实现,但笔者没有尝试):
到此为此,程序即可跑通,进入训练即可,可自行修改训练参数。