pytorch 卷积神经网络-MNIST数据集

import torch
import torch.nn as nn
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader

batch_size = 64
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307, ), (0.3081, ))])
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

train_dataset = datasets.MNIST(root="/dataset", train=True, transform=transform)
train_Dataloader = DataLoader(dataset=train_dataset, shuffle=True, batch_size=batch_size, num_workers=6)
test_dataset = datasets.MNIST(root="/dataset", train=False, transform=transform)
test_Dataloader = DataLoader(dataset=test_dataset, shuffle=True, batch_size=batch_size, num_workers=6)

class Module(nn.Module):
    def __init__(self):
        super(Module, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
        self.pooling = nn.MaxPool2d(2)
        self.relu = nn.ReLU()
        self.fc = nn.Linear(320, 10)
    def forward(self, x):
        batch_size = len(x)
        x = self.relu(self.pooling(self.conv1(x)))
        x = self.relu(self.pooling(self.conv2(x)))
        x = x.view(batch_size, -1)
        x = self.fc(x)
        return x


model = Module()
model.to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.5)


def train(epoch):
    loss_running = 0.0
    for batch_Idx, data in enumerate(train_Dataloader):
        inputs, labels = data[0].to(device), data[1].to(device)
        optimizer.zero_grad()
        outputs = model(inputs)
        loos = criterion(outputs, labels)
        loos.backward()
        optimizer.step()
        loss_running += loos.item()
        if batch_Idx % 300 == 299:
            print('[%d , %5d] loss : %.3f' % (epoch+1, batch_Idx+1, loss_running/300))
            loss_running = 0.0

def test():
    correct = 0.0
    total = 0.0
    with torch.no_grad():
        for data in test_Dataloader:
            images, labels = data[0].to(device), data[1].to(device)
            outputs = model(images)
            _, predicted = torch.max(outputs, dim=1)
            total += len(labels)
            correct += (predicted == labels).sum().item()
        print('Accuracy of the network on the 10000 test images:  %d %%' % (correct*100/total))


if __name__ == '__main__':
    for epoch in range(100):
        train(epoch)
        test()

这里处理的准确率能达到98%

通过增加卷积层,池化层和全连接层还可以提升

import numpy
import torch
import torch.nn as nn
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt

batch_size = 64
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307, ), (0.3081, ))])
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

train_dataset = datasets.MNIST(root="/dataset", train=True, transform=transform)
train_Dataloader = DataLoader(dataset=train_dataset, shuffle=True, batch_size=batch_size, num_workers=6)
test_dataset = datasets.MNIST(root="/dataset", train=False, transform=transform)
test_Dataloader = DataLoader(dataset=test_dataset, shuffle=True, batch_size=batch_size, num_workers=6)

class Module(nn.Module):
    def __init__(self):
        super(Module, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = nn.Conv2d(10, 20, kernel_size=3)
        self.conv3 = nn.Conv2d(20, 30, kernel_size=4)
        self.pooling = nn.MaxPool2d(2)
        self.relu = nn.ReLU()
        self.fc1 = nn.Linear(30, 64)
        self.fc2 = nn.Linear(64, 16)
        self.fc3 = nn.Linear(16, 10)
    def forward(self, x):
        batch_size = len(x)
        x = self.relu(self.pooling(self.conv1(x)))
        x = self.relu(self.pooling(self.conv2(x)))
        x = self.relu(self.pooling(self.conv3(x)))
        x = x.view(batch_size, -1)
        x = self.relu(self.fc1(x))
        x = self.relu(self.fc2(x))
        x = self.fc3(x)
        return x


model = Module()
model.to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.5)


def train(epoch):
    loss_running = 0.0
    rem = 0
    for batch_Idx, data in enumerate(train_Dataloader):
        inputs, labels = data[0].to(device), data[1].to(device)
        optimizer.zero_grad()
        outputs = model(inputs)
        loos = criterion(outputs, labels)
        loos.backward()
        optimizer.step()
        loss_running += loos.item()
        if batch_Idx % 300 == 299:
            print('[%d , %5d] loss : %.6f' % (epoch+1, batch_Idx+1, loss_running/300))
            rem += loss_running/300
            loss_running = 0.0
    return rem/3
def test():
    correct = 0.0
    total = 0.0
    with torch.no_grad():
        for data in test_Dataloader:
            images, labels = data[0].to(device), data[1].to(device)
            outputs = model(images)
            _, predicted = torch.max(outputs, dim=1)
            total += len(labels)
            correct += (predicted == labels).sum().item()
        print('Accuracy of the network on the 900 test images:  %d %%' % (correct*100/total))
        return correct*100/total





loss_List = []
Accuracy_list = []
epoch_list = numpy.arange(100)

if __name__ == '__main__':
    for epoch in range(100):
       loss_List.append(train(epoch))
       Accuracy_list.append(test())

    print(epoch_list)
    print(loss_List)
    print(Accuracy_list)
    plt.plot(epoch_list, loss_List, c='red')
    plt.xlabel("epoch")
    plt.ylabel("loss_List")
    plt.show()


    plt.plot(epoch_list, Accuracy_list, c='blue')
    plt.xlabel("epoch")
    plt.ylabel("AC")
    plt.show()




 这样已经达到了99当然还可以优化

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小户爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值