nn.CrossEntropyLoss()的使用案例
时间: 2024-04-22 12:18:56 浏览: 193
nn.CrossEntropyLoss()是PyTorch中用于计算交叉熵损失的函数。它通常用于多分类任务中,特别是在神经网络的输出层使用softmax激活函数时。
使用案例如下:
```python
import torch
import torch.nn as nn
# 假设有一个3分类任务,输出层有3个神经元
output = torch.tensor([[0.1, 0.2, 0.7], [0.8, 0.1, 0.1], [0.3, 0.6, 0.1]])
target = torch.tensor([2, 0, 1]) # 真实标签
criterion = nn.CrossEntropyLoss()
loss = criterion(output, target)
print(loss.item()) # 打印损失值
```
在上述代码中,我们首先定义了一个输出张量`output`和一个真实标签张量`target`。`output`的形状为`(batch_size, num_classes)`,`target`的形状为`(batch_size,)`。
然后,我们创建了一个`nn.CrossEntropyLoss()`的实例作为损失函数。将`output`和`target`作为参数传递给损失函数,它会自动计算交叉熵损失。
最后,我们通过调用`loss.item()`来获取损失值。
相关问题
nn.CrossEntropyLoss()使用案例
假设你正在解决一个分类问题,有 $n$ 个类别。你的模型输出了一个 $m$ 维的向量,表示每个类别的得分。你的目标是将这个向量转换成一个概率分布,使得每个类别的概率都在 $[0,1]$ 范围内且和为 $1$。你可以使用 softmax 函数将得分向量转换成概率分布。
在使用 softmax 函数之后,你需要将真实标签转换成 one-hot 编码的形式,这样每个标签就可以表示成一个 $n$ 维的向量,其中只有一个元素为 $1$,其余元素都为 $0$。
一旦你得到了模型预测的概率分布和真实标签的 one-hot 编码,你就可以使用交叉熵损失函数来计算模型的损失。交叉熵损失函数的定义如下:
$$
\text{CE}(\mathbf{p}, \mathbf{y}) = -\sum_{i=1}^{n} y_i \log p_i
$$
其中 $\mathbf{p}$ 是模型预测的概率分布,$\mathbf{y}$ 是真实标签的 one-hot 编码。$\log$ 表示自然对数。
在 PyTorch 中,你可以使用 nn.CrossEntropyLoss() 函数来计算交叉熵损失。这个函数的输入是模型预测的得分向量和真实标签的类别索引。具体使用方法如下:
```python
import torch.nn as nn
import torch
# 假设模型输出了一个大小为 (batch_size, n) 的张量,表示每个类别的得分
scores = torch.randn(3, 5)
# 假设真实标签为一个大小为 (batch_size,) 的张量,每个元素是一个类别索引
labels = torch.tensor([2, 0, 4])
# 创建交叉熵损失函数
loss_fn = nn.CrossEntropyLoss()
# 计算损失
loss = loss_fn(scores, labels)
print(loss)
```
输出:
```
tensor(2.2438)
```
上面的例子中,我们假设模型输出了一个大小为 (3, 5) 的张量,表示三个样本在五个类别上的得分。真实标签为一个大小为 (3,) 的张量,每个元素是一个类别索引。我们创建了一个 nn.CrossEntropyLoss() 的实例,然后将模型输出的得分张量和真实标签张量传入函数中计算损失。最终输出的结果是一个标量张量。
paddle逻辑回归案例
Paddle,即PyTorch的开源版本,也是一款强大的深度学习框架。逻辑回归在Paddle上非常常见,它用于二分类问题。下面是一个简单的Paddle Paddle(飞桨)中逻辑回归的案例:
```python
import paddle
# 定义数据
x_data = paddle.to_tensor([[0., 0.], [0., 1.], [1., 0.], [1., 1.]])
y_label = paddle.to_tensor([[0], [1], [1], [0]])
# 初始化模型参数
w = paddle.ParamAttr(initializer=Constant(value=paddle.rand([1, 2])))
b = paddle.ParamAttr(initializer=Constant(value=0.))
# 创建线性层
linear = paddle.nn.Linear(in_features=2, out_features=1, weight_attr=w, bias_attr=b)
# 定义sigmoid激活函数
sigmoid = paddle.nn.Sigmoid()
# 定义损失函数
loss_fn = paddle.nn.CrossEntropyLoss()
# 定义优化器
optimizer = paddle.optimizer.SGD(learning_rate=0.01, parameters=model.parameters())
for epoch in range(100):
# 前向传播
y_pred = sigmoid(linear(x_data))
# 计算损失
loss = loss_fn(y_pred, y_label)
# 反向传播和更新权重
loss.backward()
optimizer.step()
optimizer.clear_grad()
print(f"Epoch {epoch+1}, Loss: {loss.numpy()}")
阅读全文