Python 属性错误:';稀疏分类交叉熵';对象没有属性'_id';

Python 属性错误:';稀疏分类交叉熵';对象没有属性'_id';,python,tensorflow2.0,Python,Tensorflow2.0,我一直在尝试使用基本Keras层重新创建一个简单的DNN,并从头开始编写所有内容。一切似乎都很好,但在训练循环中,我遇到了以下错误: AttributeError:'SparseCategoricalCrossentropy'对象没有属性'\u id' 我尝试将损失函数更改为CategoricalCrossentropy和SparseCategoricalCrossentropy(from_logits True或False),但错误总是会弹出 代码如下: 将numpy导入为np 导入tenso

我一直在尝试使用基本Keras层重新创建一个简单的DNN,并从头开始编写所有内容。一切似乎都很好,但在训练循环中,我遇到了以下错误:
AttributeError:'SparseCategoricalCrossentropy'对象没有属性'\u id'

我尝试将损失函数更改为CategoricalCrossentropy和SparseCategoricalCrossentropy(from_logits True或False),但错误总是会弹出

代码如下:

将numpy导入为np
导入tensorflow作为tf
从tensorflow进口keras
从utils导入绘图图像、绘图列表结果、绘图值数组
类展平(keras.layers.Layer):
定义初始化(自):
超级(变平,自我)。\uuuu初始化
def构建(自我,输入_形状):
self.output\u size=np.prod(input\u shape)
def呼叫(自我,X):
返回tf.reshape(X,shape=(-1,self.output\u size))
密实级(keras.层.层):
定义初始(自身、单位、激活):
超(稠密,自)密度
self.units=单位
自我激活
def构建(自我,输入_形状):
self.kernel=self.add\u weight(
name='kernel',
dtype=tf.64,
初始值设定项='glorot_normal',
可训练的,
形状=(输入形状[-1],自身单位)
)
self.bias=self.add\u权重(
name='bias',
dtype=tf.64,
初始值设定项=keras.初始值设定项.常数(0.1),
可训练的,
形状=(1,自我单位)
)
def呼叫(自我,X):
返回self.activation(tf.matmul(X,self.kernel)+self.bias)
DNN类(keras.models.Model):
定义初始(自身、单位、激活):
超级(DNN,self)。\uuuuu init\uuuuuu()
self.units=单位
自我激活
def构建(自我,输入_形状):
self.flatte=flatte()
self.hidden_层=密集(self.units,tf.nn.relu)
self.output_layer=密集(10,tf.nn.softmax)
def呼叫(自我,X):
打印(自隐藏层(自展平(X)).shape)
打印(self.output_layer(self.hidden_layer(self.flatten(X)))).shape)
返回self.output\u层(self.hidden\u层(self.flatten(X)))
#@tf.function
def系列(型号、损耗、选装件、X、y):
使用tf.GradientTape()作为磁带:
梯度=磁带梯度(损失(模型(X),y),模型可训练变量)
梯度变量=zip(梯度、模型、可训练的梯度变量)
选择应用梯度(梯度变量)
mnist=keras.datasets.mnist
(列车图像,列车标签),(测试图像,测试标签)=mnist.load\u data()
列车图像=列车图像/255.0
测试图像=测试图像/255.0
型号=DNN(单位=128,激活=tf.nn.relu)
opt=tf.optimizers.Adam(学习率=1e-3)
对于范围(3)中的历元:
对于步进范围(列标签形状[0]):
损失=keras.loss.SparseCategoric交叉熵
列车(型号、损耗、opt、列车图像[步骤、:,:],列车标签[步骤])
列车损耗=损耗(型号(列车图像)、列车标签)
模板='Epoch{},列车损失:{:.5f}'
打印(template.format(epoch+1,train\u loss.numpy())

我希望模型能够成功训练,但事实似乎并非如此。我做错了什么?

从给定的代码中,我可以看到您在下面给出的地方混合使用tf和keras

opt = tf.optimizers.Adam(learning_rate=1e-3)

loss = keras.losses.SparseCategoricalCrossentropy
这可能会引发这样的问题。对于TensorFlow 2.0,您可以在所有直接使用keras的地方统一使用tf.keras

我还可以发现,您正在批处理循环中实例化loss对象。这是不正确的。您必须在开始epoch循环的顶部实例化

一切似乎都很好。希望这有帮助