zl程序教程

您现在的位置是:首页 >  .Net

当前栏目

多分类任务中不同隐藏层层数对实验结果的影响(使用GPU)

2023-02-18 16:32:57 时间

1 导入包

import torch 
import torch.nn as nn
import numpy as np
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
from torch.utils.data import DataLoader,TensorDataset

2 导入数据

train_dataset = torchvision.datasets.MNIST('../Dataset/MNIST/',download = True,train = True,transform = transforms.ToTensor() )
test_dataset = torchvision.datasets.MNIST('../Dataset/MNIST/',download = True,train = False,transform = transforms.ToTensor() )
train_x = train_dataset.data.cuda().type(torch.float32)
train_y = train_dataset.targets.cuda()
test_x = test_dataset.data.cuda().type(torch.float32)
test_y = test_dataset.targets.cuda()
batch_size = 64
train_data = TensorDataset(train_x,train_y)
train_iter = DataLoader(
    dataset = train_data,
    shuffle = True,
    batch_size = batch_size
)
test_data = TensorDataset(test_x,test_y)
test_iter = DataLoader(
    dataset = test_data,
    shuffle = True,
    batch_size = batch_size
)

3 定义模型

class flatten(nn.Module):
    def __init__(self):
        super(flatten,self).__init__()
    def forward(self,x):
        return x.view(x.shape[0],784)

class  Linear1(nn.Module ):
    def __init__(self,num_input,num_hidden,num_output):
        super(Linear1,self).__init__()
        self.linear1 = nn.Linear(num_input,num_hidden)
        self.linear2 = nn.Linear(num_hidden,num_output)
        self.flatten = flatten()
        self.relu = nn.ReLU()
    def forward(self,input):
        out = self.flatten(input)
        out = self.relu(self.linear1(out))
        out = self.linear2(out)
        return out
class  Linear2(nn.Module ):
    def __init__(self,num_input,num_hidden1,num_hidden2,num_output):
        super(Linear1,self).__init__()
        self.linear1 = nn.Linear(num_input,num_hidden1)
        self.linear2 = nn.Linear(num_hidden1,num_hidden2)
        self.linear3 = nn.Linear(num_hidden2,num_output)
        self.flatten = flatten()
        self.relu = nn.ReLU()
    def forward(self,input):
        out = self.flatten(input)
        out = self.relu(self.linear1(out))
        out = self.relu(self.linear2(out))
        out = self.linear3(out)
        return out
class  Linear3(nn.Module ):
    def __init__(self,num_input,num_hidden1,num_hidden2,num_hidden3,num_output):
        super(Linear1,self).__init__()
        self.linear1 = nn.Linear(num_input,num_hidden1)
        self.linear2 = nn.Linear(num_hidden1,num_hidden2)
        self.linear3 = nn.Linear(num_hidden2,num_hidden3)
        self.linear4 = nn.Linear(num_hidden3,num_output)
        self.flatten = flatten()
        self.relu = nn.ReLU()
    def forward(self,input):
        out = self.flatten(input)
        out = self.relu(self.linear1(out))
        out = self.relu(self.linear2(out))
        out = self.relu(self.linear3(out))
        out = self.linear4(out)
        return out

4 定义损失函数和优化器

num_input,num_hidden,num_output = 784,256,10
lr = 0.001
net = Linear1(num_input,num_hidden,num_output).cuda()
loss = nn.CrossEntropyLoss(reduction='mean')
# optimizer = torch.optim.Adam(net.parameters(),lr = lr)
optimizer = torch.optim.SGD(net.parameters(),lr = lr)

5 定义训练模型

def train(net,train_iter,test_iter,loss,num_epochs,batch_size,optimizer):
    train_ls ,test_ls, train_acc,test_acc = [],[],[],[]
    for epoch in range(num_epochs):
        train_ls_sum,train_acc_sum,n = 0,0,0
        for x,y in train_iter:
            y_pred = net(x)
            l = loss(y_pred,y)
            optimizer.zero_grad()
            l.backward()
            optimizer.step()
            train_ls_sum +=l
            train_acc_sum += (y_pred.argmax(dim = 1) == y).sum().item()
            n += x.shape[0] 
        train_ls.append(train_ls_sum)
        train_acc.append(train_acc_sum/n)
        
        test_ls_sum,test_acc_sum ,n = 0,0,0
        for x,y in test_iter:
            y_pred = net(x)
            l = loss(y_pred,y)
            test_ls_sum +=l
            test_acc_sum += (y_pred.argmax(dim = 1) == y).sum().item()
            n += x.shape[0] 
        test_ls.append(test_ls_sum)
        test_acc.append(test_acc_sum/n)
        print('epoch: %d, train loss: %f, test loss: %f , train acc: %f, test acc: %f  '
              %(epoch+1,train_ls[-1],test_ls[-1],train_acc[-1],test_acc[-1]))
    return train_ls,test_ls

6 开始训练

num_epochs = 40
train_ls,test_ls = train(net,train_iter,test_iter,loss,num_epochs,batch_size,optimizer)