Keras - 如何获得非标准化的logits而不是概率

     2023-02-23     242

关键词:

【中文标题】Keras - 如何获得非标准化的logits而不是概率【英文标题】:Keras - how to get unnormalized logits instead of probabilities 【发布时间】:2018-04-12 16:21:34 【问题描述】:

我正在 Keras 中创建一个模型,并想计算我自己的指标(困惑度)。这需要使用非标准化的概率/logits。但是,keras 模型只返回 softmax 概率:

model = Sequential()
model.add(embedding_layer)
model.add(LSTM(n_hidden, return_sequences=False))
model.add(Dropout(dropout_keep_prob))
model.add(Dense(vocab_size))
model.add(Activation('softmax'))
optimizer = RMSprop(lr=self.lr)

model.compile(optimizer=optimizer, 
loss='sparse_categorical_crossentropy')

Keras FAQ 有一个解决方案来获取中间层的输出here。另一个解决方案是here。但是,这些答案将中间输出存储在不同的模型中,这不是我需要的。 我想将 logits 用于我的自定义指标。自定义指标应包含在 model.compile() 函数中,以便在训练期间对其进行评估和显示。所以我不需要将Dense 层的输出分隔在不同的模型中,而是作为我原始模型的一部分。

简而言之,我的问题是:

使用def custom_metric(y_true, y_pred) 定义here 概述的自定义指标时,y_pred 是否包含logits 或归一化概率?

如果它包含归一化的概率,我怎样才能得到非归一化的概率,即Dense层输出的logits?

【问题讨论】:

所以你想保留这个模型或者你可以改变它?你想保持 sparse_categorical_crossentropy 作为损失吗? 产生相同最终结果的替代方案是什么? 【参考方案1】:

尝试将上次激活从 softmax 更改为线性

model = Sequential()
model.add(embedding_layer)
model.add(LSTM(n_hidden, return_sequences=False))
model.add(Dropout(dropout_keep_prob))
model.add(Dense(vocab_size))
model.add(Activation('linear'))
optimizer = RMSprop(lr=self.lr)

model.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy')

【讨论】:

但我最后确实需要softmax概率,所以最终模型输出必须是概率 为什么将激活更改为线性会得到对数而不是概率? @Goldname 因为线性激活意味着只传递值而不应用任何激活。 ML 中的 Logits 仅指非标准化的对数概率。如果将激活更改为 softmax,它会获取 logits 并将它们传递给 softmax 函数,该函数返回归一化的概率。 [更多信息] (***.com/questions/41455101/…) 我认为这行不通。优化器不会自动发现激活是线性的而不是 softmax。【参考方案2】:

您可以创建一个模型用于训练,另一个模型用于预测。

对于训练,您可以使用函数式 API 模型,只需提取现有模型的一部分,将 Activation 放在一边:

model = yourExistingModelWithSoftmax 
modelForTraining = Model(model.input,model.layers[-2].output)

#use your loss function in this model:
modelForTraining.compile(optimizer=optimizer,loss=my_sparse_categorical_crossentropy, metrics=[my_custom_metric])

由于您将一个模型作为另一个模型的一部分,因此它们将共享相同的权重。

当你想训练时,使用modelForTraining.fit() 要预测概率时,请使用model.predict()

【讨论】:

我认为我在上面找到的解决方案更加简单。但是,在创建自定义构建指标时,我仍然不知道 Keras 中的 y_pred 是什么。总是最后一个网络层的输出吗? 是的,y_pred 是模型的输出,而y_true 是你传递给fit 的真实数据。 --- 我的解决方案认为您稍后将需要 softmax 概率。 只要我总是添加一个softmax,我以后就不能继续使用softmax probabiltites吗?例如,当调用 model.predict(input) 时,输出将是非标准化概率(=logits)。添加 probs = K.nn.softmax(model.predict(input)) 时,我会得到所需的 softmax 概率。对吗? 关于您的回答:我必须在训练期间使用 sparse_categorical_cross_entropy 作为损失函数。当只训练模型的第一部分时,它使用未归一化的概率作为损失函数的输入,这会产生错误的结果 您只能从输出中获取指标,因此您需要非标准化输出。如果需要,您可以在自定义损失函数中对它们进行标准化。在所有情况下,您稍后都会发现您需要一个模型来执行 softmax。你最终会得到这个答案的变体加上你的答案。【参考方案3】:

我想我找到了解决办法

首先,我将激活层更改为线性,以便我收到@loannis Nasios 概述的 logits。

其次,为了仍将sparse_categorical_crossentropy 作为损失函数,我定义了自己的损失函数,将 from_logits 参数设置为 true。

model.add(embedding_layer)
model.add(LSTM(n_hidden, return_sequences=False))
model.add(Dropout(dropout_keep_prob))
model.add(Dense(vocab_size))
model.add(Activation('linear'))
optimizer = RMSprop(lr=self.lr)


def my_sparse_categorical_crossentropy(y_true, y_pred):
    return K.sparse_categorical_crossentropy(y_true, y_pred, from_logits=True)

model.compile(optimizer=optimizer,loss=my_sparse_categorical_crossentropy)

【讨论】:

所以,您明确承认了一个有帮助的答案,但甚至都不在乎投票?? 不知道你为什么错误地指责另一个用户。我马上就给了loannis Naosis 的答案。但是,肯定是其他人投了反对票,所以我的赞成票没有显示出来。 最后怎么得到softmax概率?

为啥允许使用 kebab-case 非标准属性,而不允许使用其他属性?以及如何在 TypeScript 中定义这样的类型?

...使用kebab-case非标准属性,而不允许使用其他属性?以及如何在TypeScript中定义这样的类型?【英文标题】:Whykebab-casenon-standardattributesareallowedwhileothersaren\'t?AndhowtodefinetypeslikethisinTypeScript?为什么允许使用kebab-case非标准属性,而不... 查看详情

模拟 Android 设备:如何获得比例/像素比以匹配具有非标准密度的物理手机?

】模拟Android设备:如何获得比例/像素比以匹配具有非标准密度的物理手机?【英文标题】:EmulatedAndroiddevice:Howtogetscale/pixelratiotomatchphysicalphonewithnon-standarddensity?【发布时间】:2021-12-0418:12:29【问题描述】:我的模拟android设备的... 查看详情

Stata和R中Logit回归的不同稳健标准误差

...ogit回归从Stata复制到R。在Stata中,我使用“稳健”选项来获得稳健的标准误差(异方差一致的标准误差)。我能够从Stata复制完全相同的系数,但我无法与包“三明治”具有相同的 查看详情

keras中的二元交叉熵和带有logits的二元交叉熵有啥区别?

】keras中的二元交叉熵和带有logits的二元交叉熵有啥区别?【英文标题】:Whatisthedifferencebetweenbinarycrossentropyandbinarycrossentropywithlogitsinkeras?keras中的二元交叉熵和带有logits的二元交叉熵有什么区别?【发布时间】:2018-03-1213:41:02【... 查看详情

Variational AutoEncoder- Keras-logits 和标签必须具有相同的形状?

】VariationalAutoEncoder-Keras-logits和标签必须具有相同的形状?【英文标题】:VariationalAutoEncoder-Keras-logitsandlabelsmusthavethesameshape?【发布时间】:2021-10-2201:18:34【问题描述】:我正在Kerashttps://keras.io/examples/generative/vae/上浏览这个示例... 查看详情

如何获得 Keras 激活?

】如何获得Keras激活?【英文标题】:HowtogetKerasactivations?【发布时间】:2020-02-1320:05:29【问题描述】:我不确定如何修改我的代码以激活keras。我已经看到K.function()输入的冲突示例,并且不确定我是否在我们的激活层中获得了输... 查看详情

Keras LSTM 错误 - Logits 和标签应该具有相同的形状

】KerasLSTM错误-Logits和标签应该具有相同的形状【英文标题】:KerasLSTMerror-Logitsandlabelsshouldhavethesameshape【发布时间】:2021-07-1104:39:36【问题描述】:我正在尝试使用KerasLSTM进行二进制分类。我的输入数据是2340条记录*254个特征。... 查看详情

如何在 keras 中获得可重现的结果

】如何在keras中获得可重现的结果【英文标题】:Howtogetreproducibleresultsinkeras【发布时间】:2015-12-0121:05:09【问题描述】:每次我从Keras框架(https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py)运行imdb_lstm.py示例时都会得到不同的... 查看详情

如何在 Tensorflow Keras 中标准化我的图像数据

】如何在TensorflowKeras中标准化我的图像数据【英文标题】:howtonormalizemyimagedatainTensorflowKeras【发布时间】:2020-10-0404:37:46【问题描述】:如前所述,我正在尝试在训练我的模型之前标准化我的数据集。我以前使用tf.keras.preprocessin... 查看详情

如何在 Keras 中获得分类概率?

】如何在Keras中获得分类概率?【英文标题】:HowtogetclassificationprobabilitiesinKeras?【发布时间】:2019-10-2521:34:57【问题描述】:我试图从训练有素的Keras模型中获取分类概率,但是当我使用model.predict(或model.predict_proba)方法时,... 查看详情

如何在 Keras 中计算精度和召回率

】如何在Keras中计算精度和召回率【英文标题】:HowtocalculateprecisionandrecallinKeras【发布时间】:2017-08-2122:38:34【问题描述】:我正在用Keras2.02(带有Tensorflow后端)构建一个多类分类器,但我不知道。请帮帮我。【问题讨论】:我... 查看详情

在 tensorflow.keras 中使用 BinaryCrossentropy(from_logits=True) 时应该使用啥作为目标向量

】在tensorflow.keras中使用BinaryCrossentropy(from_logits=True)时应该使用啥作为目标向量【英文标题】:WhatshouldIuseastargetvectorwhenIuseBinaryCrossentropy(from_logits=True)intensorflow.keras在tensorflow.keras中使用BinaryCrossentropy(from_logits=Tru 查看详情

Keras 中具有批量标准化的双向 LSTM

】Keras中具有批量标准化的双向LSTM【英文标题】:BidirectionalLSTMwithBatchNormalizationinKeras【发布时间】:2017-11-2423:55:51【问题描述】:我想知道如何在Keras中使用批标准化(BN)实现biLSTM。我知道BN层应该介于线性和非线性之间,即激活... 查看详情

如何对非标准业务地址进行地理编码

】如何对非标准业务地址进行地理编码【英文标题】:Howtogeocodenon-standardbusinessaddresses【发布时间】:2009-06-2703:20:12【问题描述】:我有小型企业数据库及其地址。使用GoogleGeocodeAPI,我已经能够获得大约80%的准确率。如果一家企... 查看详情

如何获得keras预测模型CNN中的概率百分比

】如何获得keras预测模型CNN中的概率百分比【英文标题】:HowtogettheprobabilitypercentageinkeraspredictingmodelCNN【发布时间】:2019-03-1422:50:09【问题描述】:在这里,我得到的数据是[0100]或[0001],---我知道它告诉我[0100]是label2,[0001]是labe... 查看详情

如何在 keras 中正确使用 U-net 批量标准化?

】如何在keras中正确使用U-net批量标准化?【英文标题】:HowtocorrectlyusebatchnormalizationwithU-netinkeras?【发布时间】:2019-10-0705:39:34【问题描述】:我正在尝试使用带有U-net的批量标准化层来执行分割任务。相同的层适用于res-net、vgg... 查看详情

keras:如何在训练前获得初始损失函数值

】keras:如何在训练前获得初始损失函数值【英文标题】:keras:howtogetinitiallossfunctionvaluebeforetraining【发布时间】:2019-02-0419:14:09【问题描述】:在Keras中,我检查了回调机制。但是它在训练开始之前没有提供任何信息。就像输出... 查看详情

tf.keras之损失函数

参考技术Atf.keras里面有许多内置的损失函数可以使用,由于种类众多,以几个常用的为例:BinaryCrossentropy是用来进行二元分类交叉熵损失函数的,共有如下几个参数如果输入的from_logits是true,那么首先就要经过激活函数的处理。... 查看详情