Keras构建语言模型时自定义perplexity损失函数遇未知错误
解决Keras自定义Perplexity损失函数的报错问题
嗨,我来帮你搞定这个困惑度损失的问题!你遇到的ValueError其实是由两个小细节问题导致的,咱们一步步来修正:
1. 自定义损失函数的实现错误
你当前的perplexity_loss函数里,keras.losses.SparseCategoricalCrossentropy是一个损失类,不能直接把y_true和y_pred当作参数传入。正确的做法是使用函数式的损失接口tf.keras.losses.sparse_categorical_crossentropy,或者先实例化损失类再调用。
修正后的损失函数应该是这样的:
import tensorflow as tf from tensorflow import keras def perplexity_loss(y_true, y_pred): """计算困惑度损失""" # 先计算稀疏分类交叉熵 cross_entropy = tf.keras.losses.sparse_categorical_crossentropy(y_true, y_pred) # 困惑度是交叉熵的指数 perplexity = tf.keras.backend.exp(cross_entropy) return perplexity
2. 编译模型时的传参错误
你在model.compile里写的loss='perplexity_loss'是字符串形式,但Keras只会识别内置损失函数的字符串名称,自定义损失函数需要直接传入函数对象,而不是字符串名称。
所以编译部分要改成:
# 编译网络 model.compile(loss=perplexity_loss, optimizer='adam', metrics=['accuracy'])
完整修正后的代码
把这些修正整合起来,完整的可运行代码如下:
import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Embedding, LSTM, Dense def perplexity_loss(y_true, y_pred): """计算困惑度损失""" cross_entropy = tf.keras.losses.sparse_categorical_crossentropy(y_true, y_pred) perplexity = tf.keras.backend.exp(cross_entropy) return perplexity # define model model = Sequential() model.add(Embedding(vocab_size, 500, input_length=max_length-1)) model.add(LSTM(750)) model.add(Dense(vocab_size, activation='softmax')) # compile network model.compile(loss=perplexity_loss, optimizer='adam', metrics=['accuracy']) # fit network model.fit(X, y, epochs=150, verbose=2)
补充一句:困惑度本质上是交叉熵的指数,所以这个损失函数的训练收敛趋势和直接用交叉熵损失是一致的,只是数值尺度不同~
内容的提问来源于stack exchange,提问作者WibeMan
相关产品推荐
相关产品推荐

