TF2.8中EagerTensor转Numpy数组报错:无astype属性的解决问询
解决TensorFlow 2.8中EagerTensor转Numpy数组的astype错误
问题详情
使用TensorFlow 2.8加载训练好的模型后,尝试将模型输出的EagerTensor转换为Numpy数组,代码如下:
trained_model = tf.keras.models.load_model(model_path) output = trained_model(features)[index] output.numpy()
转换过程中触发around函数调用,出现以下错误:
/opt/conda/envs/my_env/lib/python3.8/site-packages/tensorflow/python/ops/numpy_ops/np_array_ops.py:738: in around AttributeError: EagerTensor object has no attribute 'astype'. E If you are looking for numpy-related methods, please run the following: E from tensorflow.python.ops.numpy_ops import np_config E np_config.enable_numpy_behavior()
已尝试执行np_config.enable_numpy_behavior()但问题未解决,待转换的张量信息为:type: <dtype: 'float32'> <class 'tensorflow.python.framework.ops.EagerTensor'> tf.Tensor(78400.01, shape=(), dtype=float32)
解决方案
方法1:使用tf.make_ndarray转换
针对标量或任意形状的EagerTensor,可直接调用TensorFlow内置方法转换为Numpy数组:
import tensorflow as tf output_np = tf.make_ndarray(output)
方法2:用Numpy数组包裹张量
直接使用np.array()强制将EagerTensor转换为Numpy类型:
import numpy as np output_np = np.array(output)
方法3:排查隐式调用around的逻辑
错误提示显示触发了around函数,检查代码中是否存在以下情况:
- 转换前后调用了
np.around()或tf.numpy_ops.np.around() - 模型输出后存在自动四舍五入的逻辑
- 第三方库或自定义代码中隐式调用了该函数
方法4:升级TensorFlow版本(可选)
TensorFlow 2.8存在部分Numpy兼容的已知bug,若环境允许,升级至2.9及以上版本可修复此类兼容性问题。
内容的提问来源于stack exchange,提问作者Akhmad Sumekenov
相关产品推荐
相关产品推荐

