标签: cross-entropy

Tensorflow,在 Tensorflow 的 sparse_categorical_crossentropy 中 from_logits = True 或 False 是什么意思?

在 Tensorflow 2.0 中,有一个损失函数叫做

tf.keras.losses.sparse_categorical_crossentropy(labels, targets, from_logits = False)
Run Code Online (Sandbox Code Playgroud)

我可以问你设置 from_logits = True 或 False 之间有什么区别吗?我的猜测是,当传入值是 logits 时,您设置 from_logits = True,如果传入值是概率(由 softmax 等输出),那么您只需设置 from_logits = False(这是默认设置)。

但为什么?损失只是一些计算。为什么它的传入值需要不同?我还在谷歌的 tensorflow 教程https://www.tensorflow.org/alpha/tutorials/sequences/text_generation 中看到, 即使最后一层的传入值是 logits,它也不会设置 from_logits = True。这是代码

@tf.function
def train_step(inp, target):
  with tf.GradientTape() as tape:
    predictions = model(inp)
    loss = tf.reduce_mean(
        tf.keras.losses.sparse_categorical_crossentropy(target, predictions))
  grads = tape.gradient(loss, model.trainable_variables)
  optimizer.apply_gradients(zip(grads, model.trainable_variables))

  return loss
Run Code Online (Sandbox Code Playgroud)

模型在哪里

 model = tf.keras.Sequential([
    tf.keras.layers.Embedding(vocab_size, embedding_dim, 
                              batch_input_shape=[batch_size, None]),
    tf.keras.layers.LSTM(rnn_units, 
                        return_sequences=True, 
                        stateful=True, 
                        recurrent_initializer='glorot_uniform'),
    tf.keras.layers.Dense(vocab_size)
  ])
Run Code Online (Sandbox Code Playgroud)

没有最后一层softmax。(另外,在教程的另一部分,它设置了 from_logits = True)

那么,我是否将其设置为 True …

tensorflow cross-entropy loss-function

12
推荐指数
1
解决办法
4121
查看次数

如何使用sparse_softmax_cross_entropy_with_logits在tensorflow中实现加权交叉熵损失

我开始使用tensorflow(来自Caffe),我正在使用损失sparse_softmax_cross_entropy_with_logits.该函数接受标签,0,1,...C-1而不是onehot编码.现在,我想根据类标签使用加权; 我知道如果我使用softmax_cross_entropy_with_logits(一个热编码),可以用矩阵乘法来完成,有没有办法做同样的事情sparse_softmax_cross_entropy_with_logits

python deep-learning caffe tensorflow cross-entropy

11
推荐指数
2
解决办法
1万
查看次数

交叉熵函数(python)

我正在学习神经网络,我想cross_entropy在python中编写一个函数.在哪里定义为

交叉熵

其中N是样本的数目,k是类的数量,log是自然对数,t_i,j是1,如果样品i是在类j0否则,和p_i,j是预测的概率的样品i是在类j.要避免使用对数的数字问题,请将预测剪辑到[10^{?12}, 1 ? 10^{?12}]范围.

根据上面的描述,我通过clippint预测[epsilon, 1 ? epsilon]范围来记下代码,然后根据上面的公式计算交叉熵.

def cross_entropy(predictions, targets, epsilon=1e-12):
    """
    Computes cross entropy between targets (encoded as one-hot vectors)
    and predictions. 
    Input: predictions (N, k) ndarray
           targets (N, k) ndarray        
    Returns: scalar
    """
    predictions = np.clip(predictions, epsilon, 1. - epsilon)
    ce = - np.mean(np.log(predictions) * targets) 
    return ce
Run Code Online (Sandbox Code Playgroud)

以下代码将用于检查功能cross_entropy …

python machine-learning neural-network cross-entropy

11
推荐指数
1
解决办法
3万
查看次数

python - 日志中遇到的值无效

我有以下表达式: log = np.sum(np.nan_to_num(-y*np.log(a+ 1e-7)-(1-y)*np.log(1-a+ 1e-7)))

它给了我以下警告:

RuntimeWarning: invalid value encountered in log
  log = np.sum(np.nan_to_num(-y*np.log(a+ 1e-7)-(1-y)*np.log(1-a+ 1e-7)))
Run Code Online (Sandbox Code Playgroud)

我不明白什么可能是无效值或为什么我得到它.任何和每一个帮助表示赞赏.

注意:这是一个交叉熵成本函数,我添加1e-7以避免在日志中有零.y&a是numpy数组并numpy导入为np.

python math numpy cross-entropy

10
推荐指数
1
解决办法
3万
查看次数

二进制交叉熵损失在自动编码器上如何工作?

我只使用Dense图层编写了香草自动编码器。下面是我的代码:

iLayer = Input ((784,))
layer1 = Dense(128, activation='relu' ) (iLayer)
layer2 = Dense(64, activation='relu') (layer1)
layer3 = Dense(28, activation ='relu') (layer2)
layer4 = Dense(64, activation='relu') (layer3)
layer5 = Dense(128, activation='relu' ) (layer4)
layer6 = Dense(784, activation='softmax' ) (layer5)
model = Model (iLayer, layer6)
model.compile(loss='binary_crossentropy', optimizer='adam')

(trainX, trainY), (testX, testY) =  mnist.load_data()
print ("shape of the trainX", trainX.shape)
trainX = trainX.reshape(trainX.shape[0], trainX.shape[1]* trainX.shape[2])
print ("shape of the trainX", trainX.shape)
model.fit (trainX, trainX, epochs=5, batch_size=100)
Run Code Online (Sandbox Code Playgroud)

问题:

1)softmax提供概率分布。明白了 …

machine-learning neural-network autoencoder keras cross-entropy

10
推荐指数
1
解决办法
5469
查看次数

交叉熵和日志丢失错误有什么区别?

交叉熵和日志丢失错误有什么区别?两者的公式似乎非常相似.

classification machine-learning cross-entropy

9
推荐指数
1
解决办法
2719
查看次数

如何在theano上实现加权二元交叉熵?

如何在theano上实现加权二元交叉熵?

我的卷积神经网络只能预测0~1(sigmoid).

我想以这种方式惩罚我的预测:

成本表

基本上,我想在模型预测为0时惩罚更多,但事实是1.

问题:如何使用theano和lasagne创建此加权二进制CrossEntropy函数?

我试过这个

prediction = lasagne.layers.get_output(model)


import theano.tensor as T
def weighted_crossentropy(predictions, targets):

    # Copy the tensor
    tgt = targets.copy("tgt")

    # Make it a vector
    # tgt = tgt.flatten()
    # tgt = tgt.reshape(3000)
    # tgt = tgt.dimshuffle(1,0)

    newshape = (T.shape(tgt)[0])
    tgt = T.reshape(tgt, newshape)

   #Process it so [index] < 0.5 = 0 , and [index] >= 0.5 = 1


    # Make it an integer.
    tgt = T.cast(tgt, 'int32')


    weights_per_label = theano.shared(lasagne.utils.floatX([0.2, 0.4])) …
Run Code Online (Sandbox Code Playgroud)

python theano keras lasagne cross-entropy

8
推荐指数
1
解决办法
1845
查看次数

对损失增加的可能解释?

我有来自四个不同国家的40k图像数据集.图像包含各种主题:室外场景,城市场景,菜单等.我想使用深度学习来对图像进行地理标记.

我开始使用一个由3个conv-> relu-> pool层组成的小型网络,然后又添加了3个以加深网络,因为学习任务并不简单.

我的损失是这样做的(包括3层和6层网络):在此输入图像描述:

实际上,这种损失开始变得平滑并且几百步下降,但随后开始逐渐上升.

对于我这样增加的损失有什么可能的解释?

我的初始学习率设定得很低:1e-6,但我也试过1e-3 | 4 | 5.我对网络设计进行了理智检查,检查了两个具有类别不同主题的类的小型数据集,并且损失会根据需要不断下降.列车精度徘徊在~40%

convolution deep-learning tensorflow tensorboard cross-entropy

8
推荐指数
1
解决办法
1万
查看次数

计算TensorFlow中的交叉熵

我在计算张量流中的交叉熵时遇到了困难.特别是,我使用的功能:

tf.nn.softmax_cross_entropy_with_logits()
Run Code Online (Sandbox Code Playgroud)

使用看似简单的代码,我只能让它返回零

import tensorflow as tf
import numpy as np

sess = tf.InteractiveSession()

a = tf.placeholder(tf.float32, shape =[None, 1])
b = tf.placeholder(tf.float32, shape = [None, 1])
sess.run(tf.global_variables_initializer())
c = tf.nn.softmax_cross_entropy_with_logits(
    logits=b, labels=a
).eval(feed_dict={b:np.array([[0.45]]), a:np.array([[0.2]])})
print c
Run Code Online (Sandbox Code Playgroud)

回报

0
Run Code Online (Sandbox Code Playgroud)

我对交叉熵的理解如下:

H(p,q) = p(x)*log(q(x))
Run Code Online (Sandbox Code Playgroud)

其中p(x)是事件x的真实概率,q(x)是事件x的预测概率.

如果输入p(x)和q(x)的任何两个数字,则使用

0<p(x)<1 AND 0<q(x)<1
Run Code Online (Sandbox Code Playgroud)

应该有一个非零交叉熵.我期待我正在使用tensorflow错误.在此先感谢您的帮助.

python machine-learning tensorflow cross-entropy

8
推荐指数
2
解决办法
2万
查看次数

Keras:binary_crossentropy和categorical_crossentropy混淆

在使用TensorFlow很长一段时间之后,我已经阅读了一些Keras教程并实现了一些示例.我找到了几个keras.losses.binary_crossentropy用作损失函数的卷积自动编码器的教程.

我想binary_crossentropy应该不会是一个多级的损失函数,并最有可能使用二进制标签,但实际上Keras(TF Python的后端)称tf.nn.sigmoid_cross_entropy_with_logits,这实际上是用于与多个独立的类是分类任务不是相互排斥的.

另一方面,我的期望categorical_crossentropy是用于多类分类,其中目标类彼此依赖,但不一定是单热编码.

但是,Keras文档指出:

(...)当使用categorical_crossentropy损失时,你的目标应该是分类格式(例如,如果你有10个类,每个样本的目标应该是一个10维向量,在索引处为1的全0期望对应于样本的类别).

如果我没有记错,这只是单热编码分类任务的特例,但潜在的交叉熵损失也适用于概率分布("多类",依赖标签)?

此外,Keras使用tf.nn.softmax_cross_entropy_with_logits(TF python后端)实现,其本身指出:

注意:虽然这些类是互斥的,但它们的概率不一定是.所需要的只是每行标签是有效的概率分布.如果不是,则梯度的计算将是不正确的.

如果我错了,请纠正我,但在我看来Keras文档是 - 至少 - 不是非常"详细"?!

那么,Keras命名损失函数背后的想法是什么?文档是否正确?如果二进制交叉熵真的依赖于二进制标签,它就不适用于自动编码器,对吧?!同样,分类的交叉熵:如果文档是正确的,应该只适用于一个热门的编码标签?!

python classification keras tensorflow cross-entropy

8
推荐指数
1
解决办法
7934
查看次数