Pytorch中Softmax与LogSigmoid的对比分析

下面是关于PyTorch中Softmax与LogSigmoid的对比分析的完整攻略。

Softmax与LogSigmoid的介绍

在PyTorch中,Softmax和LogSigmoid是两种常用的激活函数。Softmax函数可以将一个向量映射到一个概率分布,而LogSigmoid函数可以将一个实数映射到一个介于0和1之间的值。

Softmax函数的公式如下:

$$
\text{softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^n e^{x_j}}
$$

其中,$x_i$表示输入向量中的第$i$个元素,$n$表示向量的长度。

LogSigmoid函数的公式如下:

$$
\text{logsigmoid}(x) = \log\left(\frac{1}{1+e^{-x}}\right)
$$

Softmax与LogSigmoid的对比分析

Softmax和LogSigmoid函数在神经网络中的应用有所不同。Softmax函数通常用于多分类问题,可以将输出向量映射到一个概率分布,从而方便计算交叉熵损失。而LogSigmoid函数通常用于二分类问题,可以将输出值映射到一个介于0和1之间的值,从而方便计算二元交叉熵损失。

以下是一个使用Softmax函数的示例,用于对MNIST数据集进行分类:

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms

# 定义模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(784, 256)
        self.fc2 = nn.Linear(256, 10)

    def forward(self, x):
        x = x.view(-1, 784)
        x = nn.functional.relu(self.fc1(x))
        x = nn.functional.softmax(self.fc2(x), dim=1)
        return x

# 加载数据集
train_dataset = datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor(), download=True)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False)

# 训练模型
model = Net()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)

for epoch in range(10):
    for i, (inputs, labels) in enumerate(train_loader):
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

# 测试模型
correct = 0
total = 0
with torch.no_grad():
    for inputs, labels in test_loader:
        outputs = model(inputs)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy: %d %%' % (100 * correct / total))

在这个示例中,我们定义了一个包含两个全连接层和Softmax激活函数的神经网络,用于对MNIST数据集进行分类。在训练过程中,我们使用交叉熵损失和随机梯度下降优化器来训练模型。在测试过程中,我们使用准确率来评估模型的性能。

以下是一个使用LogSigmoid函数的示例,用于对二分类问题进行分类:

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms

# 定义模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(784, 256)
        self.fc2 = nn.Linear(256, 1)

    def forward(self, x):
        x = x.view(-1, 784)
        x = nn.functional.relu(self.fc1(x))
        x = nn.functional.logsigmoid(self.fc2(x))
        return x

# 加载数据集
train_dataset = datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor(), download=True)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False)

# 训练模型
model = Net()
criterion = nn.BCEWithLogitsLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)

for epoch in range(10):
    for i, (inputs, labels) in enumerate(train_loader):
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels.float())
        loss.backward()
        optimizer.step()

# 测试模型
correct = 0
total = 0
with torch.no_grad():
    for inputs, labels in test_loader:
        outputs = model(inputs)
        predicted = (outputs > 0).float()
        total += labels.size(0)
        correct += (predicted == labels.float()).sum().item()

print('Accuracy: %d %%' % (100 * correct / total))

在这个示例中,我们定义了一个包含两个全连接层和LogSigmoid激活函数的神经网络,用于对二分类问题进行分类。在训练过程中,我们使用二元交叉熵损失和随机梯度下降优化器来训练模型。在测试过程中,我们使用准确率来评估模型的性能。

总结

Softmax和LogSigmoid函数在神经网络中的应用有所不同。Softmax函数通常用于多分类问题,可以将输出向量映射到一个概率分布,而LogSigmoid函数通常用于二分类问题,可以将输出值映射到一个介于0和1之间的值。在实际应用中,我们需要根据具体的问题选择合适的激活函数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Pytorch中Softmax与LogSigmoid的对比分析 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 什么是卷积?

    以离散信号为例,连续信号同理。  已知 x[0] = a, x[1] = b, x[2]=c   已知 y[0] = i, y[1] = j, y[2]=k     下面通过演示求 x[n] * y[n]的过程,揭示卷积的物理意义。  第一步,x[n]乘以 y[0]并平移到位置 0:  第二步,x[n]乘以 y[1]并平移到位置 1:  第三步,x[n]乘以…

    2023年4月8日
    00
  • 三维CNN:收集一些最近的3d卷积网络PointNet++

            PointNet++是在PointNet上做出了改进,考虑了点云局部特征提取,从而更好地进行点云分类和分割。 先简要说一下PointNet: PointNet,其本质就是一种网络结构,按一定的规则输入点云数据,经过一层层地计算,得出分类结果或者分割结果。其中比较特殊的地方在于两个转换矩阵(input transform & featu…

    2023年4月8日
    00
  • 『cs231n』卷积神经网络工程实践技巧_上

    数据增强 思路:在训练的时候引入干扰,在测试的时候避免干扰。 翻转图片增强数据。       随机裁切图片后调整大小用于训练,测试时先图像金字塔制作不同尺寸,然后对每个尺寸在固定位置裁切固定大小进入训练,最后对所有结果取平均值。   对颜色信息进行主成分分析并重建   迁移学习 三种网络训练思路: 中量数据的训练思路:先训练附加层,收敛后整体整体微调(fun…

    卷积神经网络 2023年4月7日
    00
  • 自相关函数怎么理解,为什么定义中有共轭,卷积呢。定义中的卷积,共轭有什么意义?尤其是在信号处理方面

    知乎上有解答,相当经典:https://www.zhihu.com/question/24687047   简洁地解释如下: 1) 首先我们仅考虑实信号。 自相关的直观含义就是:把一个信号平移一段距离,跟原来有多相似。 于是就有了自相关的定义: 它代表了“移、乘、积”这三步操作。   如果只谈自相关,其实到此就可以结束了。 只不过,在信号处理领域中还有一个叫…

    2023年4月5日
    00
  • 一个人的高三楼:多项式卷积,生成函数

    Description: 一天的学习快要结束了,高三楼在晚自习的时候恢复了宁静。不过,HSD 桑还有一些作业没有完成,他需要在这个晚自习写完。比如这道数学题: 1、给出一个数列,求它的前i项和$S_i$ HSD 桑擅长数学,很快就把这题秒了……然而还有第二题: 2、如果把上一问的前n项和看成一个新数列,请求出它的i项和   看完第二题,还有第三题……HSD …

    卷积神经网络 2023年4月7日
    00
  • 讯飞智能录音笔SR301开箱评测

    讯飞智能录音笔SR301开箱评测攻略 一、背景说明 随着科技的不断进步,现在市面上的录音设备越来越多样化和智能化。作为一款新型的录音设备,讯飞智能录音笔SR301引起了广泛关注。本文将详细讲解如何进行SR301的开箱和评测。 二、讯飞智能录音笔SR301开箱 确认包装是否完好 打开SR301的包装盒,确认外观和配件是否完好。包装外面会标注型号和产品介绍,里面…

    卷积神经网络 2023年5月15日
    00
  • 我对卷积神经网络的一点粗浅的理解

    Convolutional Neural Network,卷积神经网络,简称CNN,最近几年再次流行起来。 CNN和普通的机器学习算法有什么相同,有什么不同? 简单说,CNN=A+B,即CNN包括两个方面的功能: A:feature extactor 特征提取器 普通的机器学习算法,比如决策树、随机森林、svm、逻辑回归/softmax等,它的输入通常就是若…

    卷积神经网络 2023年4月8日
    00
  • 关于卷积的一个实例

      对于卷积的计算需要把握住两个方向点,第一个是在n点处的累积范围 , 第二个是用来做累积的变量的范围。用下面的实例来说明: 例子1 :   求两个信号的卷积?     解 :  xn和hn的图像分别如下所示 :      这里需要分情况考虑他们各自的卷积过程分别是在 0<=n<=4 ; 5<=n<=6 ; 7<=n<=1…

    2023年4月6日
    00
合作推广
合作推广
分享本页
返回顶部