在 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(来自Caffe),我正在使用损失sparse_softmax_cross_entropy_with_logits.该函数接受标签,0,1,...C-1而不是onehot编码.现在,我想根据类标签使用加权; 我知道如果我使用softmax_cross_entropy_with_logits(一个热编码),可以用矩阵乘法来完成,有没有办法做同样的事情sparse_softmax_cross_entropy_with_logits?
我正在学习神经网络,我想cross_entropy在python中编写一个函数.在哪里定义为
其中N是样本的数目,k是类的数量,log是自然对数,t_i,j是1,如果样品i是在类j和0否则,和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 …
我有以下表达式:
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.
我只使用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
交叉熵和日志丢失错误有什么区别?两者的公式似乎非常相似.
如何在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) 我有来自四个不同国家的40k图像数据集.图像包含各种主题:室外场景,城市场景,菜单等.我想使用深度学习来对图像进行地理标记.
我开始使用一个由3个conv-> relu-> pool层组成的小型网络,然后又添加了3个以加深网络,因为学习任务并不简单.
实际上,这种损失开始变得平滑并且几百步下降,但随后开始逐渐上升.
对于我这样增加的损失有什么可能的解释?
我的初始学习率设定得很低:1e-6,但我也试过1e-3 | 4 | 5.我对网络设计进行了理智检查,检查了两个具有类别不同主题的类的小型数据集,并且损失会根据需要不断下降.列车精度徘徊在~40%
convolution deep-learning tensorflow tensorboard cross-entropy
我在计算张量流中的交叉熵时遇到了困难.特别是,我使用的功能:
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错误.在此先感谢您的帮助.
在使用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命名损失函数背后的想法是什么?文档是否正确?如果二进制交叉熵真的依赖于二进制标签,它就不适用于自动编码器,对吧?!同样,分类的交叉熵:如果文档是正确的,应该只适用于一个热门的编码标签?!
cross-entropy ×10
python ×6
tensorflow ×5
keras ×3
autoencoder ×1
caffe ×1
convolution ×1
lasagne ×1
math ×1
numpy ×1
tensorboard ×1
theano ×1