PyTorch深度学习实战第七章代码交互式编程转普通py脚本(带注释) Jupyter Notebook代码转普通py代码
·
7.1微小图像数据集
from torchvision import datasets,transforms
import torch
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
data_path = '../data-unversioned/p1ch7/'
# cifar10 = datasets.CIFAR10(data_path, train=True, download=True)
# cifar10_val = datasets.CIFAR10(data_path, train=False, download=True)
cifar10 = datasets.CIFAR10(data_path, train=True, download=True,transform=transforms.ToTensor())
cifar10_val = datasets.CIFAR10(data_path, train=False, download=True,transform=transforms.ToTensor())
# print(type(cifar10).__mro__)
# print(len(cifar10))
# img,label = cifar10[99]
# print(img,label)
# print(cifar10.classes)
# cv.imshow('img',cv.cvtColor(np.array(img),cv.COLOR_RGB2BGR))
# cv.waitKey(0)
# plt.imshow(img)
# plt.show()
# to_tensor = transforms.ToTensor()
# img_t = to_tensor(img)
imgs = torch.stack([img_t for img_t,_ in cifar10],dim=3)
print(imgs.shape) # torch.Size([3, 32, 32, 50000])
ave = imgs.view(3,-1).mean(1)
std = imgs.view(3,-1).std(1)
print(ave,std) # tensor([0.4914, 0.4822, 0.4465]) tensor([0.2470, 0.2435, 0.2616])
transforms_norm = transforms.Normalize(mean=ave,std=std)
transformed_cifar10 = datasets.CIFAR10(data_path, train=True, download=False,
transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean=ave,std=std)
]))
img_t,_ = transformed_cifar10[99]
plt.imshow(img_t.permute(1,2,0))
plt.show()
7.2区分鸟和飞机:
CPU训练:
from torchvision import datasets,transforms
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import torch.nn as nn
import torch
data_path = '../data-unversioned/p1ch7/'
cifar10 = datasets.CIFAR10(data_path, train=True, download=True,transform=transforms.ToTensor())
cifar10_val = datasets.CIFAR10(data_path, train=False, download=True,transform=transforms.ToTensor())
# print(type(cifar10).__mro__)
# print(len(cifar10))
# img,label = cifar10[99]
# print(img,label)
# print(cifar10.classes)
# cv.imshow('img',cv.cvtColor(np.array(img),cv.COLOR_RGB2BGR))
# cv.waitKey(0)
# plt.imshow(img)
# plt.show()
# to_tensor = transforms.ToTensor()
# img_t = to_tensor(img)
label_map = {0:0,2:1}
class_names = ["airplane","bird"]
cifar2 = [(img,label_map[label])for img,label in cifar10 if label in [0,2]]
cifar2_val = [(img,label_map[label])for img,label in cifar10_val if label in [0,2] ]
train_loader = torch.utils.data.DataLoader(cifar2,batch_size=64,shuffle=True)
val_loader = torch.utils.data.DataLoader(cifar2_val,batch_size=64,shuffle=False)
n_out = 2
# model = nn.Sequential(
# nn.Linear(
# 3072,
# 512,
# ),
# nn.Tanh(),
# nn.Linear(
# 512,
# n_out,
# ),
# nn.LogSoftmax(dim=1)
# )
# model = nn.Sequential(
# nn.Linear(
# 3072,
# 1024,
# ),
# nn.Tanh(),
# nn.Linear(
# 1024,
# 512,
# ),
# nn.Tanh(),
# nn.Linear(
# 512,
# 128,
# ),
# nn.Linear(
# 128,
# n_out,
# ),
# nn.LogSoftmax(dim=1)
# )
model = nn.Sequential(
nn.Linear(
3072,
1024,
),
nn.Tanh(),
nn.Linear(
1024,
512,
),
nn.Tanh(),
nn.Linear(
512,
128,
),
nn.Linear(
128,
n_out,
),
)
# loss_fn = nn.NLLLoss()
loss_fn = nn.CrossEntropyLoss()
learning_rate = 1e-2
opertimizer = torch.optim.SGD(model.parameters(),lr=learning_rate)
n_epochs = 100
for epoch in range(n_epochs):
for imgs,labels in train_loader:
batch_size = imgs.shape[0]
outputs = model(imgs.view(batch_size,-1))
loss = loss_fn(outputs,labels)
opertimizer.zero_grad()
loss.backward()
opertimizer.step()
if epoch %10 ==0 or epoch == 1:
print(f"epoch {epoch}, loss:{loss.item():.4f}")
correct = 0
total = 0
with torch.no_grad():
for img,label in val_loader:
batch_size = img.shape[0]
outputs = model(img.view(batch_size,-1))
_,predicted = torch.max(outputs,1)
total += label.shape[0]
correct += int((predicted == label).sum())
print(f"Accuracy: {correct/total:.4f}")
GPU训练:
from torchvision import datasets,transforms
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import torch.nn as nn
import torch
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print("Using device:", device)
data_path = '../data-unversioned/p1ch7/'
cifar10 = datasets.CIFAR10(data_path, train=True, download=True, transform=transforms.ToTensor())
cifar10_val = datasets.CIFAR10(data_path, train=False, download=True, transform=transforms.ToTensor())
label_map = {0:0, 2:1}
cifar2 = [(img, label_map[label]) for img, label in cifar10 if label in [0,2]]
cifar2_val = [(img, label_map[label]) for img, label in cifar10_val if label in [0,2]]
train_loader = torch.utils.data.DataLoader(cifar2, batch_size=64, shuffle=True, pin_memory=True)
val_loader = torch.utils.data.DataLoader(cifar2_val, batch_size=64, shuffle=False, pin_memory=True)
n_out = 2
# model = nn.Sequential(
# nn.Linear(3072, 512),
# nn.Tanh(),
# nn.Linear(512, n_out),
# nn.LogSoftmax(dim=1)
# ).to(device)
# model = nn.Sequential(
# nn.Linear(
# 3072,
# 1024,
# ),
# nn.Tanh(),
# nn.Linear(
# 1024,
# 512,
# ),
# nn.Tanh(),
# nn.Linear(
# 512,
# 128,
# ),
# nn.Linear(
# 128,
# n_out,
# ),
# nn.LogSoftmax(dim=1)
# ).to(device)
model = nn.Sequential(
nn.Linear(
3072,
1024,
),
nn.Tanh(),
nn.Linear(
1024,
512,
),
nn.Tanh(),
nn.Linear(
512,
128,
),
nn.Linear(
128,
n_out,
),
).to(device)
# loss_fn = nn.NLLLoss().to(device)
loss_fn = nn.CrossEntropyLoss().to(device)
learning_rate = 1e-2
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
n_epochs = 100
for epoch in range(n_epochs):
for imgs, labels in train_loader:
imgs = imgs.to(device, non_blocking=True)
labels = labels.to(device, non_blocking=True)
batch_size = imgs.shape[0]
outputs = model(imgs.view(batch_size, -1))
loss = loss_fn(outputs, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if epoch % 10 == 0 or epoch == 1:
print(f"epoch {epoch}, loss:{loss.item():.4f}")
correct = 0
total = 0
with torch.no_grad():
for imgs, labels in val_loader:
imgs = imgs.to(device, non_blocking=True)
labels = labels.to(device, non_blocking=True)
batch_size = imgs.shape[0]
outputs = model(imgs.view(batch_size, -1))
_, predicted = torch.max(outputs, 1)
total += labels.shape[0]
correct += int((predicted == labels).sum())
print(f"Accuracy: {correct/total:.4f}")
更多推荐
所有评论(0)