首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras:如何对日志进行一次性编码以匹配损失函数的标签

Keras:如何对日志进行一次性编码以匹配损失函数的标签
EN

Stack Overflow用户
提问于 2020-06-01 17:59:49
回答 1查看 487关注 0票数 1

我正在尝试为我的LSTM语言模型实现一个困惑损失函数。然而,我得到了以下错误:

代码语言:javascript
复制
InvalidArgumentError: logits and labels must have the same first dimension, got logits shape [32,3345] and labels shape [107040]
     [[{{node loss_9/dense_10_loss/perplexity/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits}}]]

现在,我认为解决这个问题的方法是对我的日志进行一次热编码,但我不确定如何做到这一点,也就是说,我不知道如何访问我的日志,也不知道我应该对它们进行多大深度的编码。

我的损失函数如下所示:

代码语言:javascript
复制
import keras.losses
from keras import backend as K
def perplexity(y_true, y_pred):
    """
    The perplexity metric. Why isn't this part of Keras yet?!
    https://stackoverflow.com/questions/41881308/how-to-calculate-perplexity-of-rnn-in-tensorflow
    https://github.com/keras-team/keras/issues/8267
    """
    cross_entropy = K.sparse_categorical_crossentropy(y_true, y_pred)
    perplexity = K.exp(cross_entropy)
    return perplexity

我将我的LSTM模型定义如下:

代码语言:javascript
复制
# 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'))
print(model.summary())
# compile network
model.compile(loss=perplexity, optimizer='adam', metrics=['accuracy'])
# fit network
model.fit(X, y, epochs=150, verbose=2)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-01 18:17:22

如果使用sparse_categorical_crossentropy,则输出必须是简单的整数编码

代码语言:javascript
复制
def perplexity(y_true, y_pred):
    cross_entropy = K.sparse_categorical_crossentropy(y_true, y_pred)
    perplexity = K.exp(cross_entropy)
    return perplexity

vocab_size = 10
X = np.random.uniform(0,1, (1000,10))
y = np.random.randint(0,vocab_size, 1000)

model = Sequential()
model.add(Dense(64, activation='relu', input_dim=(10)))
model.add(Dense(vocab_size, activation='softmax'))
# compile network
model.compile(loss=perplexity, optimizer='adam', metrics=['accuracy'])
# fit network
model.fit(X, y, epochs=10, verbose=2)

如果您有独热编码目标,请注意在K.categorical_crossentropy中更改K.sparse_categorical_crossentropy

代码语言:javascript
复制
def perplexity(y_true, y_pred):
    cross_entropy = K.categorical_crossentropy(y_true, y_pred)
    perplexity = K.exp(cross_entropy)
    return perplexity

vocab_size = 10
X = np.random.uniform(0,1, (1000,10))
y = pd.get_dummies(np.random.randint(0,vocab_size, 1000)).values # one-hot

model = Sequential()
model.add(Dense(64, activation='relu', input_dim=(10)))
model.add(Dense(vocab_size, activation='softmax'))
# compile network
model.compile(loss=perplexity, optimizer='adam', metrics=['accuracy'])
# fit network
model.fit(X, y, epochs=10, verbose=2)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62129733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档