pyTorch深度学习softmax实现解析

目录
  • 用PyTorch实现linear模型
    • 模拟数据集
    • 定义模型
    • 加载数据集
    • optimizer
    • 模型训练
  • softmax回归模型
    • Fashion-MNIST
    • cross_entropy
    • 模型的实现
    • 利用PyTorch简易实现softmax

用PyTorch实现linear模型

模拟数据集

num_inputs = 2 #feature number
num_examples = 1000 #训练样本个数
true_w = torch.tensor([[2],[-3.4]]) #真实的权重值
true_b = torch.tensor(4.2) #真实的bias
samples = torch.normal(0,1,(num_examples,num_inputs))
noise = torch.normal(0,0.01,(num_examples,1))
labels = samples.matmul(true_w) + true_b + noise

定义模型

class LinearNet(nn.Module):
	def __init__(self,in_features):
		super().__init__()
		self.fc = nn.Linear(in_features=2,out_features=1)
	def forward(self,t):
		t = self.fc(t)
		return t

加载数据集

import torch.utils.data as Data
dataset = Data.TensorDataset(samples,labels)#类似于zip,把两个张量打包
data_loader = Data.DataLoader(dataset,batch_size=100,shuffle=True)

optimizer

network = LinearNet(2)
optimizer = optim.SGD(network.paramters(),lr=0.05)

模型训练

for epoch in range(10):
    total_loss = 0
    for data,label in data_loader:
        predict = network(data)
        loss = F.mse_loss(predict,label)
        total_loss += loss.item()
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    print(
        'epoch',epoch,
        'loss',total_loss,
        'weight',network.weight,
        'bias',network.bias
    )

softmax回归模型

sotfmax主要用于分类任务。regression最终得到的是一个scalar,根据input中的feature线性相加得到一个output。分类任务的结果是一个类别,是离散的。
假设现在有一批图片是2 * 2大小的灰度图片,这样图片中的每隔二像素用一个标量表示就行了。这批图片一种是三类小动物,第一类是小狗,第二类是小猫,第三类是小兔子。
每张图片总共4个像素点,我们可以看作是4个feature,假设这三类小动物的图片线性可分,每一类对应一组weight和一个bias。

可以根据输出值较大的来决定哪一类,可这样有个问题,首先输出值没有明确的意义,且可能是实数范围。其次,不好衡量输出值与真实值之间的差距。所以采用softmax操作,将三个输出值转化成概率值,这样输出结果满足概率分布。label采用one-hot编码,相当于对应类别的概率是1,这样就可以用cross_entropy来计算loss。

Fashion-MNIST

本次学习softmax模型采用torchvision.datasets中的Fashion-MNIST。

import torchvision
import torchvision.transforms as transforms
train_set = torchvision.datasets.FashionMNIST(
	root='./data',
	train=True,
	download=True,
	transform=transforms.ToTensor()
)

transforms.ToTensor()将尺寸为(H x W x C)且数据位于(0,255)的PIL图片或者数据类型为np.uint8的NumPy数组转换为尺寸为C x H x W且数据类型为torch.float32且位于(0.0,1.0)的Tensor

len(train_set),len(test_set)
> (60000,10000)

展示一下数据集中的图片

import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
for i,(image,lable) in enumerate(train_set,start=1):
	plt.subplot(1,10,i)
	plt.imshow(image.squeeze())
	plt.title(train_set.classes[lable])
	plt.axis('off')
	if i == 10:
		break
plt.show()

train_loader = torch.utils.data.DataLoader(train_set,batch_size=100,shuffle=True,num_workers=4)
test_loader = torch.utils.data.DataLoader(test_set,batch_size=100,shuffle=False,num_workers=1)

cross_entropy

def net(samples,w,b):
	samples = samples.flatten(start_dim=1) #将c,h,w三个轴展成一个feature轴,长度为28 * 28
	samples = torch.exp(samples)#全体元素取以e为底的指数
	partial_sum = samples.sum(dim=1,keepdim=True)
	samples = samples / partial_sum #归一化,得概率,这里还应用了广播机制
	return samples.matmul(w) + b

i表示label对应的种类,pi为真实种类的预测概率,log是以e为底的对数
这里gather函数的作用,就是在predict上取到对应label的概率值,注意负号不能丢,pytorch中的cross_entropy对输入先进行一次softmax操作,以保证输入都是正的。

模型的实现

def net(samples,w,b):
	samples = samples.flatten(start_dim=1) #将c,h,w三个轴展成一个feature轴,长度为28 * 28
	samples = torch.exp(samples)#全体元素取以e为底的指数
	partial_sum = samples.sum(dim=1,keepdim=True)
	samples = samples / partial_sum #归一化,得概率,这里还应用了广播机制
	return samples.matmul(w) + b

利用PyTorch简易实现softmax

import torch
import torchvision
import torch.nn as nn
import torch.nn.functional as F
import torch.utils.data as Data
import torchvision.transforms as transforms
import torch.optim as optim
import torch.nn.init as init
class SoftmaxNet(nn.Module):
    def __init__(self,in_features,out_features):
        super().__init__()
        self.fc = nn.Linear(in_features=in_features,out_features=out_features)
    def forward(self,t):
        t = t.flatten(start_dim=1)
        t = self.fc(t)
        return t
train_set = torchvision.datasets.FashionMNIST(
    root='E:\project\python\jupyterbook\data',
    train=True,
    download=True,
    transform=transforms.ToTensor()
)
test_set = torchvision.datasets.FashionMNIST(
    root='E:\project\python\jupyterbook\data',
    train=False,
    download=True,
    transform=transforms.ToTensor()
)
train_loader = Data.DataLoader(
    train_set,
    batch_size=100,
    shuffle=True,
    #num_workers=2
)
test_loader = Data.DataLoader(
    test_set,
    batch_size=100,
    shuffle=False,
    #num_workers=2
)
@torch.no_grad()
def get_correct_nums(predict,labels):
    return predict.argmax(dim=1).eq(labels).sum().item()
@torch.no_grad()
def evaluate(test_loader,net,total_num):
    correct = 0
    for image,label in test_loader:
        predict = net(image)
        correct += get_correct_nums(predict,label)
        pass
    return correct / total_num
network = SoftmaxNet()
optimizer = optim.SGD(network.parameters(),lr=0.05)
for epoch in range(10):
    total_loss = 0
    total_correct = 0
    for image,label in train_loader:
        predict = network(image)
        loss = F.cross_entropy(predict,label)
        total_loss += loss.item()
        total_correct += get_correct_nums(predict,label)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        pass
    print(
        'epoch',epoch,
        'loss',total_loss,
        'train_acc',total_correct / len(train_set),
        'test_acc',evaluate(test_loader,network,len(test_set))
    )

以上就是pytorch深度学习softmax实现解析的详细内容,更多关于pytorch深度学习的资料请关注我们其它相关文章!

(0)

相关推荐

  • TensorFlow实现Softmax回归模型

    一.概述及完整代码 对MNIST(MixedNational Institute of Standard and Technology database)这个非常简单的机器视觉数据集,Tensorflow为我们进行了方便的封装,可以直接加载MNIST数据成我们期望的格式.本程序使用Softmax Regression训练手写数字识别的分类模型. 先看完整代码: import tensorflow as tf from tensorflow.examples.tutorials.mnist imp

  • softmax及python实现过程解析

    相对于自适应神经网络.感知器,softmax巧妙低使用简单的方法来实现多分类问题. 功能上,完成从N维向量到M维向量的映射 输出的结果范围是[0, 1],对于一个sample的结果所有输出总和等于1 输出结果,可以隐含地表达该类别的概率 softmax的损失函数是采用了多分类问题中常见的交叉熵,注意经常有2个表达的形式 经典的交叉熵形式:L=-sum(y_right * log(y_pred)), 具体 简单版本是: L = -Log(y_pred),具体 这两个版本在求导过程有点不同,但是结果

  • Softmax函数原理及Python实现过程解析

    Softmax原理 Softmax函数用于将分类结果归一化,形成一个概率分布.作用类似于二分类中的Sigmoid函数. 对于一个k维向量z,我们想把这个结果转换为一个k个类别的概率分布p(z).softmax可以用于实现上述结果,具体计算公式为: 对于k维向量z来说,其中zi∈R,我们使用指数函数变换可以将元素的取值范围变换到(0,+∞),之后我们再所有元素求和将结果缩放到[0,1],形成概率分布. 常见的其他归一化方法,如max-min.z-score方法并不能保证各个元素为正,且和为1. S

  • pyTorch深度学习softmax实现解析

    目录 用PyTorch实现linear模型 模拟数据集 定义模型 加载数据集 optimizer 模型训练 softmax回归模型 Fashion-MNIST cross_entropy 模型的实现 利用PyTorch简易实现softmax 用PyTorch实现linear模型 模拟数据集 num_inputs = 2 #feature number num_examples = 1000 #训练样本个数 true_w = torch.tensor([[2],[-3.4]]) #真实的权重值 t

  • pyTorch深度学习多层感知机的实现

    目录 激活函数 多层感知机的PyTorch实现 激活函数 前两节实现的传送门 pyTorch深度学习softmax实现解析 pyTorch深入学习梯度和Linear Regression实现析 前两节实现的linear model 和 softmax model 是单层神经网络,只包含一个输入层和一个输出层,因为输入层不对数据进行transformation,所以只算一层输出层. 多层感知机(mutilayer preceptron)加入了隐藏层,将神经网络的层级加深,因为线性层的串联结果还是线

  • Pytorch深度学习之实现病虫害图像分类

    目录 一.pytorch框架 1.1.概念 1.2.机器学习与深度学习的区别 1.3.在python中导入pytorch成功截图 二.数据集 三.代码复现 3.1.导入第三方库 3.2.CNN代码 3.3.测试代码 四.训练结果 4.1.LOSS损失函数 4.2. ACC 4.3.单张图片识别准确率 四.小结 一.pytorch框架 1.1.概念 PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序. 2017年1月,由Facebook人工智能研究院(FA

  • Pytorch深度学习gather一些使用问题解决方案

    目录 问题场景描述 问题的思考 gather的说明 问题的解决 问题场景描述 我在复现Faster-RCNN模型的过程中遇到这样一个问题: 有一个张量,它的形状是 (128, 21, 4) roi_loc.shape = (128, 21, 4) 与之对应的还有一个label数据 gt_label.shape = (128) 我现在的需求是将label当作第一个张量在dim=1上的索引,将其中的数据拿出来. 具体来说就是,现在有128个样本数据,每个样本中有21个长度为4的向量.label也是1

  • PyTorch深度学习模型的保存和加载流程详解

    一.模型参数的保存和加载 torch.save(module.state_dict(), path):使用module.state_dict()函数获取各层已经训练好的参数和缓冲区,然后将参数和缓冲区保存到path所指定的文件存放路径(常用文件格式为.pt..pth或.pkl). torch.nn.Module.load_state_dict(state_dict):从state_dict中加载参数和缓冲区到Module及其子类中 . torch.nn.Module.state_dict()函数

  • Pytorch深度学习经典卷积神经网络resnet模块训练

    目录 前言 一.resnet 二.resnet网络结构 三.resnet18 1.导包 2.残差模块 2.通道数翻倍残差模块 3.rensnet18模块 4.数据测试 5.损失函数,优化器 6.加载数据集,数据增强 7.训练数据 8.保存模型 9.加载测试集数据,进行模型测试 四.resnet深层对比 前言 随着深度学习的不断发展,从开山之作Alexnet到VGG,网络结构不断优化,但是在VGG网络研究过程中,人们发现随着网络深度的不断提高,准确率却没有得到提高,如图所示: 人们觉得深度学习到此

  • PyTorch深度学习LSTM从input输入到Linear输出

    目录 LSTM介绍 LSTM参数 Inputs Outputs batch_first 案例 LSTM介绍 关于LSTM的具体原理,可以参考: https://www.jb51.net/article/178582.htm https://www.jb51.net/article/178423.htm 系列文章: PyTorch搭建双向LSTM实现时间序列负荷预测 PyTorch搭建LSTM实现多变量多步长时序负荷预测 PyTorch搭建LSTM实现多变量时序负荷预测 PyTorch搭建LSTM

  • 如何在conda虚拟环境中配置cuda+cudnn+pytorch深度学习环境

    首先,我们要明确,我们是要在虚拟环境中安装cuda和cuDNN!!!只需要在虚拟环境中安装就可以了. 下面的操作默认你安装好了python 一.conda创建并激活虚拟环境 前提:确定你安装好了anaconda并配置好了环境变量,如果没有,网上有很多详细的配置教程,请自行学习 在cmd命令提示符中输入conda命令查看anaconda 如果显示和上图相同,那么可以继续向下看 1.进入anaconda的base环境 方法1 在cmd命令提示符中输入如下命令 activate 方法2 直接在搜索栏里

  • Pytorch深度学习addmm()和addmm_()函数用法解析

    目录 一.函数解释 二.代码范例 三.代码运行结果 一.函数解释 在torch/_C/_VariableFunctions.py的有该定义,意义就是实现一下公式: 换句话说,就是需要传入5个参数,mat里的每个元素乘以beta,mat1和mat2进行矩阵乘法(左行乘右列)后再乘以alpha,最后将这2个结果加在一起.但是这样说可能没啥概念,接下来博主为大家写上一段代码,大家就明白了~ def addmm(self, beta=1, mat, alpha=1, mat1, mat2, out=No

  • Python Pytorch深度学习之数据加载和处理

    目录 一.下载安装包 二.下载数据集 三.读取数据集 四.编写一个函数看看图像和landmark 五.数据集类 六.数据可视化 七.数据变换 1.Function_Rescale 2.Function_RandomCrop 3.Function_ToTensor 八.组合转换 九.迭代数据集 总结 一.下载安装包 packages: scikit-image:用于图像测IO和变换 pandas:方便进行csv解析 二.下载数据集 数据集说明:该数据集(我在这)是imagenet数据集标注为fac

随机推荐