1.机器搭建
GPU:2080 TI, Ubuntu16.04.
CUDA10, OPENCV 3.4.0, PATHON 2.7(系统原装),Anaconda2.7, pyCharm.下面两个安装指南很靠谱。
2.Pytorch入门
Tensor operations
x=torch.empty() torch.zeros(5,3,dtype=torch.long) y=torch.rand()
x=torch.randn_like(x,dtype=torch.float) #reuse properties of the input tensor
print(x+y) print(torch.add(x,y)) x.add_(y) #add y to x
result = torch.empth(), torch.add(x,y,out=result) #相同的size 和 dtype
resize: torch.view
NumPy Bridge
把nampy的数据转成tensor。
import numpy as np
a=np.ones(5)
b=torch.from_numpy(a)
np.add(a,1,out=a)
print(a)
print(b)
CUDA Tensor
device=torch.device("cuda")
y=torch.ones_like(x,device=device)
x=x.to(device)
z=x+y
print (z)
print(z.to("cpu",torch.double)) ##.to 可以为CUDA转变数据
Autograd 与 Function
构建Tensor,并且进行求导。
3.Minist 数据集
网络训练的过程在不同的framework上是相同的.在pytorch上如何训练深度学习界的Helloworld呢?首先是看一下构建网络的基础模块:
nn.Conv2d() 处理nSamples
nChannels
Height
Width.
torch.Tensor:就是用来支持autograd.Function的多维的数列(multi-dimensional array)
torch.Module:神经网络模块,把参数传到GPU
nn.Parameters:也是一种Tensor,为网络自动注册参数
autograd.Funtion:前向传输计算和反向传输中自动求导
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# 1 input image channel, 6 output channels, 5x5 square convolution
# kernel
self.conv1 = nn.Conv2d(1, 6, 5)
self.conv2 = nn.Conv2d(6, 16, 5)
# an affine operation: y = Wx + b
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
# Max pooling over a (2, 2) window
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
# If the size is a square you can only specify a single number
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
x = x.view(-1, self.num_flat_features(x))
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:] # all dimensions except the batch dimension
num_features = 1
for s in size:
num_features *= s
return num_features
net = Net()
print(net)
此时,我们就可以建立LeNet的网络结构。下面就要讨论LossFunction,并且实现参数的更新。使用loss.backward来 backpropagate.
设置学习率,并更新参数,weight=weight-gradient*lr.
learning_rate=0.01
for f in net.parameters();
f.data.sub_(f.grad.data*learning_rate)
反向传输过程中,我们要选择梯度下降的方法。torch.optim
optimizer = torch.optim.SGD(net.parameters(), lr=0.01)
out=net(input)
loss=criterion(output, target)
loss.backward()
optimizer.step()
3. Epoch,batch size, iteration
Epoch就是使用整体数据集进行一次网络训练,由于不能通过一次训练,获得较好的结果,因此大多是需要几个Epoch才能完成训练。
Batch size 一个Epoch比较大,因此分成几个小块,这样的小块就是Batch.
迭代是 batch 需要完成一个 epoch 的次数。在一个 epoch 中,batch 数和迭代数是相等的。
4.Python基础知识
数字
int 和 float,Python 还支持其它数字类型,例如 Decimal 和 Fraction。Python 还内建支持 复数 ,使用后缀 j 或 J 表示虚数部分(例如,3+5j)。切片的索引有非常有用的默认值;省略的第一个索引默认为零,省略的第二个索引默认为切片的字符串的大小。python中文文档。
索引用于获得单个字符,切片 让你获得一个子字符串:索引也可以是负数,
word[-1] #从右边开始计算,-0就是0,不会导致右边计算。
word[0:3] #包含起始字符,不包含末尾,0,1,2
流程控制
if
if x<0:
x=0
elif x==0:
print('Gut')
for
word=['cat','wiondow']
for w in words:
print(w,len(w))
range() 生成一个等差链表
for i in range(5):
print(i)
复杂的数据类型
list列表,列表元素不必是同一类型,内置函数有:append(), len(),
set (集合):集合是一个无序不重复元素的集。基本功能包括关系测试和消除重复元素。想要创建空集合,你必须使用 set() 而不是 {}。后者用于创建空字典。
字典:理解字典的最佳方式是把它看做无序的键: 值对 (key:value 对)集合,键必须是互不相同的(在同一个字典之内)。一对大括号创建一个空的字典: {} ,list(d.keys())返回一个无需列表;in 可以检查字典中是否含有 某一个关键字。
循环技巧
items( ) , enumerate(), zip().
需要逆向循环,然后调用 reversed()函数。
knights={'go':'the pure','ro':'the brave'}
for k,v in knights.items():
print(k,v) ## 键 和 值 可以使用items()同时解读
for i,v in enumerate(['tic','tac','toe']):
print(i,v) ##索引位置和对应值 可以使用enumerate()
questions=['name','quest']
answers=['lancelot','the']
for q,a in zip(questions,answers):
print('What is your {0}? It is {1}.'.format(q, a)) ##zip(), format()
Ref.