Re:从零开始的PyTorch生活
Day1 6月28
一、关于tensor
辨析-1
-1可以表示最后一行/列
x=tensor([[-0.1859, 1.3970, 0.5236],
[ 2.3854, 0.0707, 2.1970],
[-0.3587, 1.2359, 1.8951],
[-0.1189, -0.1376, 0.4647],
[-1.8968, 2.0164, 0.1092]])
print(x[:, -1])
会打印最后一列:tensor([0.5236, 2.1970,1.8951, 0.4647, 0.1092])
-1也可以表示缺省
在view()函数里
x=torch.randn(4,4)#4行4列
y=x.view(16)#形成16维的向量
z=x.view(-1,8)#view的-1缺省行数,但是已知列数是8,所以行数是2
print(x)
print(y)
print(z)
tensor([[ 0.5618, 0.6179, -0.6277, 0.3646],
[ 0.9595, -0.9613, -0.6899, -0.2878],
[-1.1062, -0.6001, 0.4027, 0.4323],
[ 0.0840, 0.1004, 0.9699, -0.5401]])
tensor([ 0.5618, 0.6179, -0.6277, 0.3646, 0.9595, -0.9613, -0.6899, -0.2878,
-1.1062, -0.6001, 0.4027, 0.4323, 0.0840, 0.1004, 0.9699, -0.5401])
tensor([[ 0.5618, 0.6179, -0.6277, 0.3646, 0.9595, -0.9613, -0.6899, -0.2878],
[-1.1062, -0.6001, 0.4027, 0.4323, 0.0840, 0.1004, 0.9699, -0.5401]])
辨析randn和rand
torch.rand(*sizes, out=None) → Tensor
- randn:正态分布, μ \mu μ=0, σ \sigma σ=1
- rand:包含了从区间[0, 1)的均匀分布中抽取的一组随机数。张量的形状由参数sizes定义。
Day2 6月29
早上:看到一篇好的文章,讲的是python的切片操作,重点掌握的是切片的3个参数[start:\end:step]
step:正负数均可,其绝对值大小决定了切取数据时的“步长”,而正负号决定了“切取方向”,正表示“从左往右”取值,负表示“从右往左”取值。当step省略时,默认为1,即从左往右以增量1取值。
下午:看了Autograd
一、requires_grad
这是每个Tensor都有的参数,默认是False。
x = torch.ones(2, 2, requires_grad=True)
设置为True之后,会追踪与它相关的计算
所以,求导的时候,x.grad会一直回溯到设置为True的地方,中间的过程比如y=x^3,z=3y…会算在导数里
二、backward()
torch.autograd.backward(tensors, grad_tensors=None, retain_graph=None, create_graph=False, grad_variables=None)
传入的参数tensors表示雅可比向量积中,作为相乘向量的v
backward会自动对tensor计算雅克比矩阵,而v是用来确定最终输出的是哪个变量的偏导向量(Page25)
实际上,自己用草稿纸推一下就很明白了。
三、神经网络
一个典型的神经网络训练过程包括以下几点:(page27)
1.定义一个包含可训练参数的神经网络(class Net(nn.Module)😃
2.迭代整个输入(循环)
3.通过神经网络处理输入(optimizer.zero_grad()清零梯度缓存器 output = net(input))
4.计算损失(loss)(loss = criterion(output, target) )
5.反向传播梯度到神经网络的参数( loss.backward() )
6.更新网络的参数,典型的用一个简单的更新方法(Optimize包 optimizer.step())
Day3 6月30
一、Net
-
激励函数: leakyReLU和Tanh是比较流行的,提供好的非线性特征
-
隐藏层与输入层的大小不要相差太多(待探究原因)
-
损失函数:
- 交叉熵损失函数:适合期望标签值为0/1的情况
- MSE:(待探究)
二、CNN
卷积神经网络
卷积:一般是提取图片特征
-
padding : 在图片四周补上0,可以使得feature map 和输入的图片尺寸相同,也可以使边缘的数据被扫描的次数增多
- 如果边缘的东西不重要(比如正方形照片识别圆形标志,四周是边角料),就不用padding了
-
Batch Normalization:批归一化,防止梯度消失
-
Pooling层: 降维操作,比如2x2的pool可以把2nx2n的图片降维成为nxn的。
而且还与激励函数比较相似,都没有待定系数,跟在卷积后面,是产生非线性的效果(待探究)
- Max Pooling:取最大
- Average Pooling:取平均
- 二者都各有好处,具体到任务里要实验
三、RNN
循环神经网络
循环层
- 特点:把前一次输入的内容或其中间的激励值,以及当前这一次的输入值,一起作为网络的输入
- 好处:时序上,前一次的内容对这一次的输入有影响,就可以被学习
现在比较流行的是LSTM与GRU
LSTM
- 实际上有超多的参数,所以实际工作里,大多只使用一层LSTM,2层就非常多了
- 一个以时序输入的Sequence,如果其前后有联系,就可以根据上文对下文进行提示或限制,那么,用LSTM网络可以去记忆时序之间的概率关系
Day4 7月3日 摸了2天鱼QAQ
今天开始学习seq2seq模型(太难了)
还是学习字符级RNN名字分类吧
首先,这是一个字符级的,应该是用abcd看成独热向量,所以可以用一个max_lenth作为固定的input_size去训练吧
其次,怎么设置这个RNN的层呢,设置一个隐藏层和输出层就好
貌似这周得断更了,好多论文要看(留下了不学无术的泪水)