我试图理解 TensorFlow 中的这个损失函数,但我不明白。它是SparseCategoricalCrossentropy。所有其他损失函数都需要相同形状的输出和标签,而这个特定的损失函数不需要。
源代码:
import tensorflow as tf;
scce = tf.keras.losses.SparseCategoricalCrossentropy();
Loss = scce(
tf.constant([ 1, 1, 1, 2 ], tf.float32),
tf.constant([[1,2],[3,4],[5,6],[7,8]], tf.float32)
);
print("Loss:", Loss.numpy());
Run Code Online (Sandbox Code Playgroud)
错误是:
InvalidArgumentError: Received a label value of 2 which is outside the valid range of [0, 2).
Label values: 1 1 1 2 [Op:SparseSoftmaxCrossEntropyWithLogits]
Run Code Online (Sandbox Code Playgroud)
如何为损失函数 SparseCategoricalCrossentropy 提供适当的参数?
machine-learning deep-learning tensorflow cross-entropy loss-function
为了掌握PyTorch(以及一般的深度学习),我首先研究了一些基本的分类示例。其中一个示例是对使用sklearn创建的非线性数据集进行分类(完整代码可在此处作为笔记本查看)
n_pts = 500
X, y = datasets.make_circles(n_samples=n_pts, random_state=123, noise=0.1, factor=0.2)
x_data = torch.FloatTensor(X)
y_data = torch.FloatTensor(y.reshape(500, 1))
Run Code Online (Sandbox Code Playgroud)
然后使用相当基本的神经网络将其准确分类
class Model(nn.Module):
def __init__(self, input_size, H1, output_size):
super().__init__()
self.linear = nn.Linear(input_size, H1)
self.linear2 = nn.Linear(H1, output_size)
def forward(self, x):
x = torch.sigmoid(self.linear(x))
x = torch.sigmoid(self.linear2(x))
return x
def predict(self, x):
pred = self.forward(x)
if pred >= 0.5:
return 1
else:
return 0
Run Code Online (Sandbox Code Playgroud)
当我对健康数据感兴趣时,我决定尝试使用相同的网络结构对一些基本的现实世界数据集进行分类。我从这里获取了一名患者的心率数据,并对其进行了更改,以便所有> 91的值都被标记为异常(例如a 1
,所有<= 91的值都标记为a 0
)。这是完全任意的,但是我只是想看看分类是如何工作的。此示例的完整笔记本在这里。
对我来说不直观的是,为什么第一个示例在1,000个历元后损失0.0016,而第二个示例在10,000个历元后却损失0.4296 …
python artificial-intelligence machine-learning deep-learning pytorch
在 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 …
我想根据训练期间"当前预测"与"正确标签"的接近/远距离来缩放每个图像的损失值.例如,如果正确的标签是"猫"并且网络认为它是"狗",那么惩罚(损失)应该小于网络认为它是"汽车"的情况.
我正在做的方式如下:
1-我定义了标签之间距离的矩阵,
2-将该矩阵作为底层传递给"softmaxWithLoss"
图层,
3将每个log(prob)乘以该值以根据不良情况缩放损失forward_cpu
但是我不知道该怎么做backward_cpu
.我知道渐变(bottom_diff)必须改变但不太确定,如何在这里加入比例值.根据数学,我必须按比例缩放渐变(因为它只是一个比例),但不知道如何.
此外,似乎在caffe中有loosLayer被称为"InfoGainLoss"
非常相似的工作如果我没有弄错,但是这一层的后面部分有点令人困惑:
bottom_diff[i * dim + j] = scale * infogain_mat[label * dim + j] / prob;
Run Code Online (Sandbox Code Playgroud)
我不确定为什么infogain_mat[]
要分开prob
而不是乘以!如果我使用单位矩阵infogain_mat
是不是它应该像前向和后向的softmax损失一样?
如果有人能给我一些指示,我们将不胜感激.