import torch
x = torch.rand(5,3)
y = torch.rand(5,3)# 代数求和print("代数求和{}".format((x + y).shape))
add_value = torch.rand(5,3)print("添加参数的代数求和{}".format(torch.add(x, y, out=add_value)))print("代数求和{}".format(y.add_(x)))# 改变形状print("改变x的形状:改变前{0}——改变后{1}".format(x.shape, x.view(15).shape))
与Numpy交互
import numpy as np
import torch
a = torch.rand(5,3)
b = np.zeros((5,3))print("转换前:{0},转换后:{1}".format(type(a),type(a.numpy())))print("转换前:{0},转换后:{1}".format(type(b),type(torch.from_numpy(b))))
建立GPU的device
if torch.cuda.is_available():
device = torch.device("cuda")
自微分(求导)
张量激活
import torch
x = torch.ones(2,2, requires_grad=True)print(x)
y = x +2print(y)print(y.grad_fn)
z = y * y *3
out = z.mean()print(z, out)
a = torch.randn(2,2)
a =((a *3)/(a -1))print(a.requires_grad)
a.requires_grad_(True)print(a.requires_grad)
b =(a * a).sum()print(b.grad_fn)
梯度激活
v = torch.tensor([0.1,1.0,0.0001], dtype=torch.float)
y.backward(v)print(x.grad)# 停止计算微分print(x.requires_grad)print((x **2).requires_grad)with torch.no_grad():print((x **2).requires_grad)
import torch.optim as optim
# create your optimizer
optimizer = optim.SGD(net.parameters(), lr=0.01)# in your training loop:
optimizer.zero_grad()# zero the gradient buffers
output = net(input)
loss = criterion(output, target)
loss.backward()
optimizer.step()# Does the update
训练
import torch
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
transform = transforms.Compose([transforms.ToTensor(),
transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
shuffle=True, num_workers=2)
testset = torchvision.datasets.CIFAR10(root='./data', train=False,
download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
shuffle=False, num_workers=2)
classes =('plane','car','bird','cat','deer','dog','frog','horse','ship','truck')import matplotlib.pyplot as plt
import numpy as np
# functions to show an imagedefimshow(img):
img = img /2+0.5# unnormalize
npimg = img.numpy()
plt.imshow(np.transpose(npimg,(1,2,0)))
plt.show()# get some random training images
dataiter =iter(trainloader)
images, labels = dataiter.next()# show images
imshow(torchvision.utils.make_grid(images))# print labelsprint(' '.join('%5s'% classes[labels[j]]for j inrange(4)))import torch.nn as nn
import torch.nn.functional as F
classNet(nn.Module):def__init__(self):super(Net, self).__init__()
self.conv1 = nn.Conv2d(3,6,5)
self.pool = nn.MaxPool2d(2,2)
self.conv2 = nn.Conv2d(6,16,5)
self.fc1 = nn.Linear(16*5*5,120)
self.fc2 = nn.Linear(120,84)
self.fc3 = nn.Linear(84,10)defforward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1,16*5*5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)return x
net = Net()for epoch inrange(2):# loop over the dataset multiple times
running_loss =0.0for i, data inenumerate(trainloader,0):# get the inputs
inputs, labels = data
# zero the parameter gradients
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
optimizer.zero_grad()# forward + backward + optimize
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()# print statistics
running_loss += loss.item()if i %2000==1999:# print every 2000 mini-batchesprint('[%d, %5d] loss: %.3f'%(epoch +1, i +1, running_loss /2000))
running_loss =0.0print('Finished Training')
dataiter =iter(testloader)
images, labels = dataiter.next()# print images
imshow(torchvision.utils.make_grid(images))print('GroundTruth: ',' '.join('%5s'% classes[labels[j]]for j inrange(4)))
outputs = net(images)
_, predicted = torch.max(outputs,1)print('Predicted: ',' '.join('%5s'% classes[predicted[j]]for j inrange(4)))
correct =0
total =0with torch.no_grad():for data in testloader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs.data,1)
total += labels.size(0)
correct +=(predicted == labels).sum().item()print('Accuracy of the network on the 10000 test images: %d %%'%(100* correct / total))
class_correct =list(0.for i inrange(10))
class_total =list(0.for i inrange(10))with torch.no_grad():for data in testloader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs,1)
c =(predicted == labels).squeeze()for i inrange(4):
label = labels[i]
class_correct[label]+= c[i].item()
class_total[label]+=1for i inrange(10):print('Accuracy of %5s : %2d %%'%(
classes[i],100* class_correct[i]/ class_total[i]))