TensorFlow:tensorflow.keras.Model.fit()报错: TypeError: Failed to convert elements of xxx

一、问题

在使用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 激活函数

  1. 使用模型的 summary 方法: model.summary() 会打印模型的所有层及其详细信息。你可以查看输出层的激活函数。
    print(model.summary())
    

  2. 直接检查输出层的激活属性: 如果你知道模型的输出层的索引或名称,你可以直接检查其激活属性。

    例如,如果输出层是模型的最后一层,你可以这样做:

    output_layer = model.layers[-1]
    print(output_layer.activation)
    

    如果输出是 softmax,那么你应该会看到类似 <function softmax at 0x7f...> 的输出。

  3. 我这里代码检查的结果是使用了softmax。

    <function softmax at 0x00000248078FC940>
  4. 那么上面的值就要设置为False。

    model.compile(optimizer='Adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False))
    

再跑代码的话,就成功解决了问题。 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值