ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

刘二大人《PyTorch深度学习实践》多分类问题

2021-12-18 13:00:40  阅读:213  来源: 互联网

标签:plt 刘二 nn self PyTorch 深度 test data correct


课程请见 《PyTorch深度学习实践》

# PyTorch
import torch
from torch import nn
from torch.utils import data
from torchvision import datasets
from torchvision import transforms
from torch import optim
# For plotting
import matplotlib.pyplot as plt

import os

os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"

batch_size = 64
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307,), (0.3081,))
])

train_data = datasets.MNIST(root='../data', download=False, train=True, transform=transform)
test_data = datasets.MNIST(root='../data', download=False, train=False, transform=transform)
train_iter = data.DataLoader(
    dataset=train_data,
    batch_size=batch_size,
    shuffle=True
)
test_iter = data.DataLoader(
    dataset=test_data,
    shuffle=False,
    batch_size=batch_size
)


class Module(nn.Module):
    def __init__(self, activate):
        super(Module, self).__init__()
        self.l1 = nn.Linear(784, 512)
        self.l2 = nn.Linear(512, 256)
        self.l3 = nn.Linear(256, 128)
        self.l4 = nn.Linear(128, 64)
        self.l5 = nn.Linear(64, 10)
        self.activate = activate

    def forward(self, x):
        x = x.reshape(-1, 784)
        y1 = self.activate(self.l1(x))
        y2 = self.activate(self.l2(y1))
        y3 = self.activate(self.l3(y2))
        y4 = self.activate(self.l4(y3))
        y5 = self.l5(y4)
        return y5


def init_weight(m):
    if type(m) == nn.Linear:
        nn.init.normal_(m.weight, std=0.1)


def test(net, test_iter):
    total = 0
    correct = 0
    for x, y in test_iter:
        with torch.no_grad():
            _y = net(x)
            _, predicted = torch.max(_y.data, dim=1)
            total += y.shape[0]
            correct += (predicted == y).sum().item()
    return correct / total


net1 = Module(nn.ReLU())
net2 = Module(torch.sigmoid)
net1.apply(init_weight)
net2.apply(init_weight)
lr = 0.01
optimizer1 = optim.SGD(net1.parameters(), lr=lr)
optimizer2 = optim.SGD(net2.parameters(), lr=0.03)
criterion = nn.CrossEntropyLoss()
num_epoch = 25
correct_rate1 = []
correct_rate2 = []
for epoch in range(num_epoch):
    for index, data in enumerate(train_iter, 0):
        x, y = data
        _y1 = net1(x)
        _y2 = net2(x)
        loss1 = criterion(_y1, y)
        loss2 = criterion(_y2, y)

        optimizer1.zero_grad()
        loss1.backward()
        optimizer1.step()
        optimizer2.zero_grad()
        loss2.backward()
        optimizer2.step()

    rate1 = test(net1, test_iter)
    correct_rate1.append(rate1)
    rate2 = test(net2, test_iter)
    correct_rate2.append(rate2)
    print('第{}轮,正确率为{} 和{}'.format(epoch + 1, rate1, rate2))

plt.figure()
plt.plot(list(range(num_epoch)), correct_rate1, c='b', label='Relu')
plt.plot(list(range(num_epoch)), correct_rate2, c='r', label='Sigmoid')
plt.xlabel('Epoch')
plt.ylabel('Correct Rate')
plt.legend()
plt.grid()
plt.show()

在这里插入图片描述

标签:plt,刘二,nn,self,PyTorch,深度,test,data,correct
来源: https://blog.csdn.net/weixin_45688580/article/details/122010896

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有