我实现了一个perplexity()
函数来评估Keras
中的LSTM
语言模型。我使用的是cross entropy loss
和one-hot encoding
。由此产生的困惑不是exp(loss)
。你知道吗
我采用了来自this github discussion的困惑代码,并按照this stackoverflow post中的建议,将基数从2
改为e
。你知道吗
我还写了一个回调来计算困惑。这个回调计算正确的复杂度(exp(loss)
)。你知道吗
一些额外的背景信息:
-tensorflow: 1.14.0
-keras: 2.2.4
-数据集:宾夕法尼亚州树状银行(PTB)
-loss: categorical_crossentropy()
perplexity()
函数。你知道吗
from keras import backend as K
def perplexity(true_label, pred_label):
cross_entropy = K.categorical_crossentropy(true_label, pred_label)
return K.exp(cross_entropy)
回调类。你知道吗
class Perplexity(Callback):
def on_epoch_end(self, epoch, logs={}):
super().on_epoch_end(epoch,logs)
print(f"Callback Perplexity: {K.eval(K.exp(logs['loss']))}")
这是模型。忽略不相关的变量。你知道吗
model = Sequential()
model.add(Embedding(...))
model.add(LSTM(...))
model.add(Dense(activation='softmax', ...))
model.compile(loss='categorical_crossentropy', metrics=[perplexity], ...)
model.summary()
model.fit_generator(callbacks=[Perplexity()], ...)
例如,如果cross entropy loss
是7.0554
,
-perplexity()
函数给出9555.6286
-回调给出1158.995545671746
回调的结果接近预期的复杂度exp(7.0554)=1159.101019
。你知道吗
如何使用perplexity()
函数来计算正确的复杂度?我的代码中有什么错误吗?如果需要,我可以提供更多的代码。提前谢谢。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐