10 案例:搭建分類神經網絡(基於CIFAR10) 小實戰 及 sequential使用

 

CIFAR10模型結構

 

import torch
import torchvision
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter


# class MyNN(nn.Module):
#     def __init__(self):
#         super(MyNN, self).__init__()
#         self.conv1 = Conv2d(in_channels=3, out_channels=32, kernel_size=5, padding=2, stride=1)
#         self.maxpool1 = MaxPool2d(kernel_size=2)
#         self.conv2 = Conv2d(in_channels=32, out_channels=32, kernel_size=5, padding=2, stride=1)
#         self.maxpool2 = MaxPool2d(kernel_size=2)
#         self.conv3 = Conv2d(in_channels=32, out_channels=64, kernel_size=5, padding=2, stride=1)
#         self.maxpool3 = MaxPool2d(kernel_size=2)
#         self.flatten = Flatten()
#         self.linear1 = Linear(1024, 64)
#         self.linear2 = Linear(64, 10)  # 因爲CIFAR10是分10個類別,所以最後線性層輸出是10
#
#     def forward(self, x):
#         x = self.conv1(x)
#         x = self.maxpool1(x)
#         x = self.conv2(x)
#         x = self.maxpool2(x)
#         x = self.conv3(x)
#         x = self.maxpool3(x)
#         x = self.flatten(x)
#         x = self.linear1(x)
#         x = self.linear2(x)
#         return x


# sequential寫法
class MyNN_seq(nn.Module):
    def __init__(self):
        super(MyNN_seq, self).__init__()
        self.model1 = Sequential(
            Conv2d(in_channels=3, out_channels=32, kernel_size=5, padding=2, stride=1),
            MaxPool2d(kernel_size=2),
            Conv2d(in_channels=32, out_channels=32, kernel_size=5, padding=2, stride=1),
            MaxPool2d(kernel_size=2),
            Conv2d(in_channels=32, out_channels=64, kernel_size=5, padding=2, stride=1),
            MaxPool2d(kernel_size=2),
            Flatten(),
            Linear(1024, 64),
            Linear(64, 10)
        )

    def forward(self, x):
        x = self.model1(x)
        return x




# mynn = MyNN()
mynn = MyNN_seq()
print(mynn)

input = torch.ones(64, 3, 32, 32)
output = mynn(input)
print(output.shape)

writer = SummaryWriter("logs")
writer.add_graph(mynn, input)
writer.close()



dataset = torchvision.datasets.CIFAR10(root="D:/Learn/dataSet/Pytorch", train=False, transform=torchvision.transforms.ToTensor(), download=False)
dataloader = DataLoader(dataset, batch_size=1)
# writer = SummaryWriter("logs_NonLinearActivation")

mynn = MyNN_seq()

loss = nn.CrossEntropyLoss()

# 設置優化器
# 一般在學習剛開始時候用大的學習速度,到後期用小的學習速率
optim = torch.optim.SGD(mynn.parameters(), lr=0.01)  # SGD隨機梯度下降

# 循環20次(實際,訓練都是成百上千甚至上萬次)
for epoch in range(20):
    running_loss = 0.0
    for data in dataloader:
        imgs, targets = data
        outputs = mynn(imgs)
        # print(outputs)
        # print(targets)

        # 計算損失函數
        result_loss = loss(outputs, targets)
        # 打印輸出,計算得到的實際輸出和目標之間的差距
        # print(result_loss)

        # 將網絡參數中每一個可以調節參數的梯度調爲0
        optim.zero_grad()

        # 反向傳播,計算梯度
        result_loss.backward()

        # 調用優化器,進行調優
        optim.step()

        # print(result_loss)
        running_loss = running_loss + result_loss

    # 看每一次循環loss之和
    print(running_loss)


 

輸出每次損失函數計算結果(這裏沒有計算完)

 

打開tensorboard可以看到創建的網絡框架圖

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章