一、问题
在使用TensorFlow进行数据训练的时候,报了下面这样的一个错误。
代码如下:
import tensorflow as tf
from utilz import *
import numpy as np
acoustic = load_features('C:/Test/MSA Datasets/data/acoustic_wav2vec.pkl')
label = load_features('C:/Test/MSA Datasets/data/labels.pkl')
shapeReturn = np.shape(acoustic['train'])
print(shapeReturn)
x = tf.keras.layers.Input((128, 512))
h = tf.keras.layers.LSTM(32, dropout=0.5)(x)
res = tf.keras.layers.Dense(3, 'softmax')(h)
model = tf.keras.Model(inputs=x, outputs=res)
# 问题出现在下面这一行
model.compile(optimizer='Adam', loss=tf.keras.losses.SparseCategoricalCrossentropy)
model.summary()
print(model.summary())
output_layer = model.layers[-1]
print(output_layer.activation)
callback_list = [tf.keras.callbacks.ModelCheckpoint(filepath='C:/Test/MSA Datasets/res_tmp/model.tf', monitor='val_loss', save_best_only=True, save_freq='epoch')]
model.fit(x=np.asarray(acoustic['train']), y=np.asarray(label['train']), batch_size=16, epochs=30,
validation_data=[np.asarray(acoustic['valid']), np.asarray(label['valid'])],
callbacks=callback_list)
报错如下:
Traceback (most recent call last):
File "E:\WorkSpace\1v6_code_fs\ser_exp.py", line 20, in <module>
model.fit(x=np.asarray(acoustic['train']), y=np.asarray(label['train']), batch_size=16, epochs=30, TypeError: Failed to convert elements of <keras.src.losses.SparseCategoricalCrossentropy object at 0x000001BF851EF6D0> to Tensor. Consider casting elements to a supported type. See https://www.tensorflow.org/api_docs/python/tf/dtypes for supported TF dtypes.
二、原因
从错误信息来看,问题似乎与损失函数的定义有关。错误提示 SparseCategoricalCrossentropy
对象无法转换为 Tensor。
首先,确保你正确地实例化了 SparseCategoricalCrossentropy
。当你在 model.compile
中设置损失函数时,确保你是这样做的:
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
或者:
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)
其中 from_logits
参数取决于你的模型输出是否已经经过 softmax 激活。如果模型的输出层使用了 softmax 激活函数,则 from_logits
应设置为 False
。否则,设置为 True
。
三、如何检查模型的输出层使用了 softmax 激活函数
- 使用模型的 summary 方法:
model.summary()
会打印模型的所有层及其详细信息。你可以查看输出层的激活函数。print(model.summary())
-
直接检查输出层的激活属性: 如果你知道模型的输出层的索引或名称,你可以直接检查其激活属性。
例如,如果输出层是模型的最后一层,你可以这样做:
output_layer = model.layers[-1] print(output_layer.activation)
如果输出是
softmax
,那么你应该会看到类似<function softmax at 0x7f...>
的输出。 -
我这里代码检查的结果是使用了softmax。
<function softmax at 0x00000248078FC940>
-
那么上面的值就要设置为False。
model.compile(optimizer='Adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False))
再跑代码的话,就成功解决了问题。