【Pytorch基础】torch基础介绍与简单卷积神经网络建模

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(16
5*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()

图像Pillow,openCV,声音scipy librosa,文本 nltk spacy转numpy.array

你可能感兴趣的:(【Pytorch基础】torch基础介绍与简单卷积神经网络建模)