from future import print_function
import torch
x=torch.Tensor(5,3)#创造未初始化矩阵
x=torch.rand(5,3)#创造随机5*3矩阵
print(x.size())
y=torch.rand(5,3)
print(x+y)
print(torch.add(x,y))
输出Tensor
result=torch.Tensor(5,3)
torch.add(x,y,out=result)
print(y.add_(x))
改变tensor内容的方法都要加下划线
print(x[:,1])#输出第二列
Tensor与numpy array共享存储空间
import numpy as np
a=np.ones(5)
b=torch.from_numpy(a)
np.add(a,1,out=a)
print(a)
print(b)#b随着a被改变
启用2019年甜品级显卡1660Ti
if torch.cuda.is_available():
x=x.cuda()
y=y.cuda()
print(x+y)
Tensor自动求导运行Autograd包,运行时定义
Variable是其核心类,一旦完成了运算,可以调用.backward()计算梯度
梯度记录在.grad属性中
每个Variable拥有一个.grad_fn属性,引用了一个创建Variable的Function,
除了用户创建的Variable其grad_fn是None
除标量外,求导方法必须传入参数grad_output,和tensor形状匹配
from torch.autograd import Variable
x=Variable(torch.ones(2,2),requires_grad=True)
y=x+2
print(y.grad_fn)
z=yy3
out=z.mean()#求和再除以面积
out.backward()
print(x.grad)#输出对x的导数
定义并使用神经网络
使用最简单的GD优化
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def init(self):
super(Net,self).init()
self.conv1=nn.Conv2d(1,6,5)#1个输入channel,6个输出channel,55卷积核
self.conv2=nn.Conv2d(6,16,5)
self.fc1=nn.Linear(165*5,120)
self.fc2=nn.Linear(120,84)
self.fc3=nn.Linear(84,10)
def forward(self,x):
x=F.max_pool2d(F.relu(self.conv1(x)),(2,2))
x=F.max_pool2d(F.relu(self.conv2(x)),2)#size写2等价于(2,2)
x=x.view(-1,self.num_flat_features(x))#view()相当于numpy的reshape(),写-1表示不确定
x=F.relu(self.fc1(x))
x=F.relu(self.fc2(x))
x=self.fc3(x)
return x
def num_flat_features(self,x):
size=x.size()[1:]
num_features=1
for s in size:
num_features*= s
return num_features
net=Net()
print(net)
NN的backward自动生成,模型中可学习的参数net.parameters()
params=list(net.parameters())
print(len(params))
print(params[0].size())
input=Variable(torch.randn(1,1,32,32))
out=net(input)
print(out)
out.backward(torch.randn(1,10))
output=net(input)
target=Variable(torch.range(1,10))
criterion=nn.MSELoss()
loss=criterion(output,target)
print(loss)
net.zero_grad()
loss.backward(retain_graph=True)#更新所有梯度
GD法更新权重
lr=0.001
for f in net.parameters():
f.data.sub_(f.grad.data*lr)
使用RMSProp更新梯度
import torch.optim as optim
optimizer=optim.RMSprop(net.parameters(),lr=0.001)
output=net(input)
loss=criterion(output,target)
loss.backward()
optimizer.step()