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深度学习的资料请关注猪先飞其它相关文章!
相关文章
pytorch nn.Conv2d()中的padding以及输出大小方式
今天小编就为大家分享一篇pytorch nn.Conv2d()中的padding以及输出大小方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27- 这篇文章主要介绍了PyTorch一小时掌握之迁移学习篇,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-08
Linux安装Pytorch1.8GPU(CUDA11.1)的实现
这篇文章主要介绍了Linux安装Pytorch1.8GPU(CUDA11.1)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-25- 这篇文章主要介绍了Pytorch之扩充tensor的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-05
- 今天小编就为大家分享一篇pytorch 自定义卷积核进行卷积操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-06
- 这篇文章主要介绍了解决pytorch 交叉熵损失输出为负数的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-08
- 这篇文章主要介绍了pytorch 实现冻结部分参数训练另一部分,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-27
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
今天小编就为大家分享一篇pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-02Pytorch 的损失函数Loss function使用详解
今天小编就为大家分享一篇Pytorch 的损失函数Loss function使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-02从Pytorch模型pth文件中读取参数成numpy矩阵的操作
这篇文章主要介绍了从Pytorch模型pth文件中读取参数成numpy矩阵的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-04pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
今天小编就为大家分享一篇pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-02- 今天小编就为大家分享一篇pytorch中的上采样以及各种反操作,求逆操作详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-30
- 这篇文章主要介绍了基于Pytorch版yolov5的滑块验证码破解思路详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-25
- 这篇文章主要介绍了pytorch深度学习中对softmax实现进行了详细解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步...2021-09-30
- 今天小编就为大家分享一篇Pytorch 计算误判率,计算准确率,计算召回率的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
- 今天小编就为大家分享一篇Pytorch实现LSTM和GRU示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
- 这篇文章主要介绍了Pytorch如何切换 cpu和gpu的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-01
- 今天小编就为大家分享一篇pytorch动态网络以及权重共享实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-29
- 这篇文章主要介绍了pytorch中的squeeze函数、cat函数使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-05-20
- 这篇文章主要介绍了解决Pytorch修改预训练模型时遇到key不匹配的情况,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-05