TensorFlow1.15使用tf.reduce_mean调用predict报错如何解决
问题根因
你的代码存在4个问题,共同触发了运行报错:
- 输入层参数写法错误:
layers.Input的shape参数要求传入元组类型,直接传入整数10不符合参数规范。 - 模型输出链路不符合TF1.15内置Keras的要求:直接将TensorFlow原生算子
tf.reduce_mean的运算结果作为模型输出,没有通过Keras标准层封装,Keras无法识别该计算节点的输出格式。 - 均值计算逻辑错误:调用
tf.reduce_mean(inp)时没有指定计算轴,会对包含batch维度的所有元素求全局平均,最终输出单个0维标量,而predict方法需要按batch维度拆分输出、对应到每个输入样本,拿到无batch维度的标量时无法完成结果聚合,就会抛出Attempted to aggregate unsupported object类报错。 - 缺失依赖导入:代码中调用了
np.random.randn但没有导入numpy库,不补充导入会触发名称错误。
修正后可运行代码
import numpy as np from tensorflow.keras import layers, models import tensorflow as tf # shape参数传入长度为1的元组,明确输入特征维度为10 inp = layers.Input(shape=(10,)) # 通过Lambda层包裹原生TF运算,指定axis=1仅对每个样本的特征维度求均值,保留batch维度 loss_mean = layers.Lambda(lambda x: tf.reduce_mean(x, axis=1))(inp) model = models.Model(inp, loss_mean) # 运行预测 result = model.predict(np.random.randn(3, 10)) print(result)
运行说明
修正后的代码会输出形状为(3,)的numpy数组,每个值对应一个输入样本10个特征的均值,符合预期逻辑。注意在TF1.15版本中,所有非Keras内置层的自定义运算,都需要通过Lambda层或者自定义Layer封装后才能接入Keras模型的计算链路,否则会出现节点识别、输出聚合类的问题。
内容的提问来源于stack exchange,提问作者Влад Лещук
相关产品推荐
相关产品推荐

