Pytorch中怎么实现softmax回归
发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,本篇文章给大家分享的是有关Pytorch中怎么实现softmax回归,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。如果采用自定义方式搭建
千家信息网最后更新 2025年12月01日Pytorch中怎么实现softmax回归
本篇文章给大家分享的是有关Pytorch中怎么实现softmax回归,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
如果采用自定义方式搭建网络方式:
import torchimport torchvisionimport torchvision.transforms as transformsimport matplotlib.pyplot as pltimport timeimport sysimport numpy as npimport requests#设置训练集和测试集,下载在本地mnist_train = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST', train=True, download=True, transform=transforms.ToTensor())mnist_test = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST', train=False, download=True, transform=transforms.ToTensor())batch_size = 256if sys.platform.startswith('win'): num_workers = 0 # 0表示不用额外的进程来加速读取数据else: num_workers = 4train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True, num_workers=num_workers)test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False, num_workers=num_workers)num_inputs=784#图片为1*28*28,单通道,所以输入为28*28=784num_outputs=10#最终的类别为10个类别,所以输出是10;w=torch.tensor(np.random.normal(0,0.01,(num_inputs,num_outputs)),dtype=torch.float)b=torch.zeros(num_outputs,dtype=torch.float)#使得w,b可以反向传播w.requires_grad_(requires_grad=True)b.requires_grad_(requires_grad=True)def cross_entropy(y_hat, y): return - torch.log(y_hat.gather(1, y.view(-1, 1)))def accuracy(y_hat,y): return (y_hat.argmax(dim=1)==y).float().mean().item()'''这里注意下正确率计算的写法;对于y_hat,返回的是batch_size*10的一个矩阵,argemax(dim=1)为选择一个维度上的最大数的索引;所以y_hat.argmax(dim=1)返回一个batch_size*1的向量;针对于返回的向量和y进行诸位比较,平均化取值,即可得到该批次的正确率'''def sgd(params, lr, batch_size): # 本函数已保存在d2lzh_pytorch包中方便以后使用 for param in params: param.data -= lr * param.grad / batch_size # 注意这里更改param时用的param.datadef evalute_accuracy(data_iter,net): acc_sum,n=0.0,0 for X,y in data_iter: acc_sum+=(net(X).argmax(dim=1)==y).float().sum().item() n+=y.shape[0] return acc_sum/nnum_epochs,lr=30,0.1def softmax(X): X_exp = X.exp() partition = X_exp.sum(dim=1, keepdim=True) return X_exp / partition # 这里应用了广播机制def net(X): return softmax(torch.mm(X.view((-1, num_inputs)), w) + b)def train(net,train_iter,test_iter,loss,num_epochs,batch_size,params=None,lr=None,optimizer=None): for epoch in range(num_epochs): train_l_sum,train_acc_sum,n=0.0,0.0,0 for X,y in train_iter: y_hat=net(X) l=loss(y_hat,y).sum() if optimizer is not None: optimizer.zero_grad() elif params is not None and params[0].grad is not None: for param in params: param.grad.data.zero_() l.backward() if optimizer is None: sgd(params, lr, batch_size) else: optimizer.step() # "softmax回归的简洁实现"一节将用到 train_l_sum+=l.item() train_acc_sum+=(y_hat.argmax(dim=1)==y).sum().item() n+=y.shape[0] test_acc=evalute_accuracy(test_iter,net); print('epoch %d, loss %.4f, train acc %.3f, test acc %.3f' % (epoch + 1, train_l_sum / n, train_acc_sum / n, test_acc))if __name__ == '__main__': print(mnist_train) X, y = [], [] ''' for i in range(10): X.append(mnist_train[i][0]) y.append(mnist_train[i][1]) show_fashion_mnist(X, get_fashion_mnist_labels(y)) ''' train(net, train_iter, test_iter, cross_entropy, num_epochs, batch_size, [w, b], lr)如果采用典型的层数搭建函数,能有更加简洁的实现版本:
import torchimport torchvisionimport torchvision.transforms as transformsfrom torch import nnfrom collections import OrderedDictimport matplotlib.pyplot as pltimport timeimport sysimport numpy as npimport requests#设置训练集和测试集,下载在本地from torch.nn import initmnist_train = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST', train=True, download=True, transform=transforms.ToTensor())mnist_test = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST', train=False, download=True, transform=transforms.ToTensor())batch_size = 256train_iter = torch.utils.data.DataLoader(mnist_train, batch_size=batch_size, shuffle=True)test_iter = torch.utils.data.DataLoader(mnist_test, batch_size=batch_size, shuffle=False)num_inputs=784#图片为1*28*28,单通道,所以输入为28*28=784num_outputs=10#最终的类别为10个类别,所以输出是10;class LinearNet(nn.Module): def __init__(self,num_inputs,num_outputs): super(LinearNet,self).__init__() self.linear=nn.Linear(num_inputs,num_outputs) def forward(self,x): y=self.linear(x.view(x.shape[0],-1)) return ydef evalute_accuracy(data_iter,net): acc_sum,n=0.0,0 for X,y in data_iter: acc_sum+=(net(X).argmax(dim=1)==y).float().sum().item() n+=y.shape[0] return acc_sum/nclass FlattenLayer(nn.Module): def __init__(self): super(FlattenLayer, self).__init__() def forward(self,x): return x.view(x.shape[0],-1) #把1*28*28转化为1*784net=LinearNet(num_inputs,num_outputs)#使用orderdict来进行网络结构搭建#第一层flatten层把1*28*28转化为1*784#第二层为实际工作层net=nn.Sequential( OrderedDict( [ ('flatten',FlattenLayer()), ('linear',nn.Linear(num_inputs,num_outputs)) ] ))init.normal_(net.linear.weight, mean=0, std=0.01)init.constant_(net.linear.bias, val=0)loss=nn.CrossEntropyLoss()optimizer=torch.optim.SGD(net.parameters(),lr=0.1)num_epochs=10def train(net,train_iter,test_iter,loss,num_epochs,batch_size,params=None,lr=None,optimizer=None): for epoch in range(num_epochs): train_l_sum,train_acc_sum,n=0.0,0.0,0 for X,y in train_iter: y_hat=net(X) l=loss(y_hat,y).sum() if optimizer is not None: optimizer.zero_grad() elif params is not None and params[0].grad is not None: for param in params: param.grad.data.zero_() l.backward() optimizer.step() # "softmax回归的简洁实现"一节将用到 train_l_sum+=l.item() train_acc_sum+=(y_hat.argmax(dim=1)==y).sum().item() n+=y.shape[0] test_acc=evalute_accuracy(test_iter,net); print('epoch %d, loss %.4f, train acc %.3f, test acc %.3f' % (epoch + 1, train_l_sum / n, train_acc_sum / n, test_acc))if __name__ == '__main__': print(mnist_train) X, y = [], [] ''' for i in range(10): X.append(mnist_train[i][0]) y.append(mnist_train[i][1]) show_fashion_mnist(X, get_fashion_mnist_labels(y)) ''' train(net, train_iter, test_iter, loss, num_epochs, batch_size,None,None,optimizer)以上就是Pytorch中怎么实现softmax回归,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。
类别
简洁
函数
向量
图片
方式
更多
正确率
知识
篇文章
网络
单通道
工作
测试
训练
输入
输出
实用
网络结构
不用
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
番禺网络安全运维
数据库字段名称
使用数据库表替代配置文件
河南综合软件开发收费
西藏智慧土地资产管理软件开发
厦门优勋网络技术有限公司
给数据库添加用户 2008
关于网络技术的工作经历
山西省通信管理局网络安全管理处
瑞丽航空软件开发部
边缘云服务器数量
软件开发公司产品多次销售做账
平度软件开发哪家便宜
成都网络安全论坛
网络安全宣传周是在几月
学网络安全技术
泰兴自动网络技术大概费用
软件开发行业账务实操
数据库中什么是代数运算
战德臣 数据库
c 安卓软件开发
管理项目文档服务器
服务器的小电风扇三线怎样接线
服务器安全防止频繁访问
信息安全技术网络技术
psql删除数据库语句
搭建机房是单个pc还是服务器
php 本地数据库
天津hp服务器虚拟化建设云空间
软件开发保价怎么写