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可以看到創建的網絡框架圖