pytorch示例(多项式拟合,iris,mnist-dnn,mnist-cnn)

1.多项式拟合

import numpy as np
import torch
import torch.autograd
import torch.nn.functional as F
from torch.autograd import Variable
import matplotlib.pyplot as plt
from itertools import count

torch.manual_seed(1)
POLY_DEGREE=4
W_target=torch.randn(POLY_DEGREE,1)*5
b_target=torch.randn(1)*5

def get_batch(batch_size=128):
    random=torch.from_numpy(np.sort(torch.randn(batch_size)))
    x=random.unsqueeze(1)
    x=torch.cat([x**i for i in range(1,POLY_DEGREE+1)],1)
    y=x.mm(W_target)+b_target[0]
    return Variable(x),Variable(y)

fc=torch.nn.Linear(W_target.size(0),1)

for batch_index in count(1):
    
    batch_x,batch_y=get_batch()

    fc.zero_grad()

    output=F.smooth_l1_loss(fc(batch_x),batch_y)
    loss=output.data

    output.backward()

    for param in fc.parameters():
        param.data.add_(-0.1*param.grad.data)

    if loss<1e-3:
        plt.cla()
        plt.scatter(batch_x.data.numpy()[:,0],batch_y.data.numpy()[:,0],label="real curve",color="b")
        plt.plot(batch_x.data.numpy()[:,0],fc(batch_x).data.numpy()[:,0],label="fitting curve",color="r")
        plt.legend()
        plt.show()
        break

2.iris

import torch
import torch.nn.functional as F
from torch.autograd import Variable
from torch.optim import SGD
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt

use_cuda=torch.cuda.is_available()
print("use_cuda:",use_cuda)

iris=load_iris()
x=iris["data"]
y=iris["target"]
print(iris.keys())
print("x.shape:",x.shape)
print("y.shape:",y.shape)

x=torch.FloatTensor(x)
y=torch.LongTensor(y)

x,y=Variable(x),Variable(y)

class Net(torch.nn.Module):
    def __init__(self,n_feature,n_hidden,n_output):
        super(Net,self).__init__()
        self.hidden=torch.nn.Linear(n_feature,n_hidden)
        self.predict=torch.nn.Linear(n_hidden,n_output)

    def forward(self,x):
        x=torch.sigmoid(self.hidden(x))
        x=self.predict(x)
        out=torch.log_softmax(x,dim=1)
        return out
    
net=Net(n_feature=4,n_hidden=5,n_output=4)
print(net)

if use_cuda:
    x=x.cuda()
    y=y.cuda()
    net=net.cuda()

optimizer=SGD(net.parameters(),lr=0.5)

px,py=[],[]
for i in range(1000):
    prediction=net(x)

    loss=F.nll_loss(prediction,y)
    optimizer.zero_grad()
    loss.backward()

    optimizer.step()

    px.append(i)
    py.append(loss.data)
    print(i,"loss:",loss.data)

    if i%10==0:
        print(i,"loss:",loss.data)
        plt.cla()
        plt.plot(px,py,"r-",lw=1)
        plt.text(0,0,"loss=%.4f"%loss.data,fontdict={"size":20,"color":"red"})
        plt.pause(0.1)

3.mnist—DNN

若数据集下载慢,在AI Studio下载,放在mnist_data\MNIST\raw目录即可

#coding=utf-8
import torch
import torch.nn as nn
import torchvision.datasets as dsets
import torchvision.transforms as transforms
from torch.autograd import Variable

#设置参数
torch.manual_seed(1)
input_size=784
hidden_size=500
num_classes=10
num_epochs=5
batch_size=100
learning_rate=0.001

#加载数据
train_dataset=dsets.MNIST(root="./mnist_data",
                          train=True,
                          transform=transforms.ToTensor(),
                          download=True)
test_dataset=dsets.MNIST(root="./mnist_data",
                         train=False,
                         transform=transforms.ToTensor())

#数据批处理
train_loader=torch.utils.data.DataLoader(dataset=train_dataset,
                                         batch_size=batch_size,
                                         shuffle=True)
test_loader=torch.utils.data.DataLoader(dataset=test_dataset,
                                        batch_size=batch_size,
                                        shuffle=False)

#定义DNN模型
class Net(torch.nn.Module):
    def __init__(self,input_size,hidden_size,num_classes):
        super(Net,self).__init__()
        self.fc1=nn.Linear(input_size,hidden_size)
        self.relu=nn.ReLU()
        self.fc2=nn.Linear(hidden_size,num_classes)

    def forward(self,x):
        out=self.fc1(x)
        out=self.relu(out)
        out=self.fc2(out)
        return out

#
net=Net(input_size,hidden_size,num_classes)
print(net)

#训练模型
criterion=nn.CrossEntropyLoss()
optimizer=torch.optim.Adam(net.parameters(),lr=learning_rate)

for epoch in range(num_epochs):
    for i,(images,labels) in enumerate(train_loader):
        images=Variable(images.view(-1,28*28))
        labels=Variable(labels)

        optimizer.zero_grad()
        outputs=net(images)
        loss=criterion(outputs,labels)

        loss.backward()
        optimizer.step()
    print(epoch,"loss:",loss.item())

#测试模型
correct=0
total=0
for images,labels in test_loader:
    images=Variable(images.view(-1,28*28))
    outputs=net(images)
    _,predicted=torch.max(outputs.data,dim=1)
    total+=labels.size(0)
    correct+=(predicted==labels).sum()
print('Accuracy of the network on the test images: %d%%'%(100*(correct/total)))

4.mnist-CNN

import torch
from torch import nn,optim
import torch.nn.functional as F
from torch.utils.data import DataLoader
from torchvision import transforms
from torchvision import datasets

#预置参数
torch.manual_seed(1)
batch_size=128
learning_rate=1e-2
num_epoches=10

#加载数据
train_dataset=datasets.MNIST(root="./mnist_data",
                             train=True,
                             transform=transforms.ToTensor(),
                             download=True)
test_dataset=datasets.MNIST(root="./mnist_data",
                            train=False,
                            transform=transforms.ToTensor(),
                            download=True)
train_loader=DataLoader(train_dataset,batch_size=batch_size,shuffle=True)
test_loader=DataLoader(test_dataset,batch_size=batch_size,shuffle=False)

#创建模型
class Cnn(nn.Module):
    def __init__(self,in_dim,n_class):#28*28
        super(Cnn,self).__init__()
        self.conv=nn.Sequential(nn.Conv2d(in_dim,6,3,stride=1,padding=1),#(28-3+2*1)/1+1=28                                nn.ReLU(True),
                                nn.MaxPool2d(2,2),#14*14
                                nn.Conv2d(6,16,5,stride=1,padding=0),#(14-5+2*0)/1+1=10
                                nn.ReLU(True),
                                nn.MaxPool2d(2,2))  #5*5*16=400

        self.fc=nn.Sequential(nn.Linear(400,120),
                               nn.Linear(120,84),
                               nn.Linear(84,n_class))

    def forward(self,x):
        out=self.conv(x)
        out=out.view(out.size(0),400)
        out=self.fc(out)
        return out

model=Cnn(1,10)
print(model)

#训练模型
criterion=nn.CrossEntropyLoss()
optimizer=torch.optim.SGD(model.parameters(),lr=learning_rate)

print("train: ")
for epoch in range(num_epoches):
    running_loss=0.0
    running_acc=0.0
    for i,data in enumerate(train_loader,1):
        img,label=data
        out=model(img)
        loss=criterion(out,label)
        running_loss+=loss.item()*label.size(0)
        _,pred=torch.max(out,1)
        num_correct=(pred==label).sum()
        running_acc+=num_correct.item()

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    print(epoch+1," loss:",running_loss/len(train_dataset)," acc:",running_acc/len(train_dataset))

#模型测试
model.eval()
eval_loss=0
eval_acc=0
for data in test_loader:
    img,label=data
    out=model(img)
    loss=criterion(out,label)
    eval_loss+=loss.item()*label.size(0)
    _,pred=torch.max(out,1)
    num_correct=(pred==label).sum()
    eval_acc+=num_correct.item()

print(" test loss:",eval_loss/len(test_dataset)," acc:",eval_acc/len(test_dataset))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch-MNIST-MLP是一个使用PyTorch库和多层感知器(MLP)来训练和测试MNIST手写数字数据集的项目。 MNIST是一个经典的手写数字识别数据集,包含了大量的手写数字图片和对应的标签。通过训练一个模型,我们可以实现自动识别手写数字的功能。 MLP是一种基本的人工神经网络模型,包含了多个全连接的神经网络层,并且每个神经元都与相邻层的所有神经元连接。通过多层的非线性变换和权重调整,MLP可以处理复杂的分类和回归任务。 PyTorch是一个开源的机器学习框架,提供了丰富的工具和函数来简化神经网络模型的构建和训练过程。通过PyTorch,我们可以轻松地搭建和训练MLP模型,并在MNIST数据集上进行实验。 在PyTorch-MNIST-MLP项目中,我们首先加载MNIST数据集,并将其转换成适MLP模型的格式。然后,我们定义MLP模型的结构,包括输入层、隐藏层和输出层,并使用PyTorch提供的函数来定义损失函数和优化器。 接下来,我们使用训练数据集对MLP模型进行训练,通过反向传播算法和优化器来逐步调整模型的权重和偏置。在训练过程中,我们可以监控模型的精确度和损失值,以评估模型的性能。 最后,我们使用测试数据集对训练好的模型进行测试,并计算模型在测试集上的准确率。通过比较预测结果和真实标签,我们可以评估模型在手写数字识别任务上的表现。 总之,PyTorch-MNIST-MLP是一个基于PyTorch库和MLP模型的项目,用于训练和测试MNIST手写数字数据集。通过该项目,我们可以学习和掌握使用PyTorch构建神经网络模型的基本方法,并实现手写数字识别的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值