Bonky Zhu
If someone is able to show me that what I think or do is not right, I will happily change, for I seek the truth, by which no one was ever truly harmed. It is the person who continues in his self-deception and ignorance who is harmed.

训练神经网络的一些技巧(2)

训练神经网络的一些技巧(2)

消除所有为1的维度

直接对于tensor使用 squeeze 函数:

>>> import torch
>>> a = torch.ones(1,1,5)
>>> print(a.squeeze())
tensor([1., 1., 1., 1., 1.])
>>> print(a.squeeze().shape)
torch.Size([5])
>>> a.shape
torch.Size([1, 1, 5])


当然unsqueeze 是加维度,参数为多少,就在那个维度上设置为1。(注意不能超过范围)

>>> a = torch.ones(5)
>>> a.unsqueeze(0).shape
torch.Size([1, 5])
>>> a.unsqueeze(1).shape
torch.Size([5, 1])
>>> a.unsqueeze(2).shape
Traceback (most recent call last):
  File "", line 1, in 
RuntimeError: Dimension out of range (expected to be in range of [-2, 1], but got 2)

假如我们想要把一个维度为 (1,B,D) 转换为 (B,D,1) 怎么办呢?可以利用先压缩,再解压的方法。

hidden = hidden.squeeze(0).unsqueeze(2)


利用zip构建训练集

zip 的使用方法如下:

>>> a = [1,2,3]
>>> b = [1,2,3]
>>> c = zip(a,b)
>>> list(c)
[(1, 1), (2, 2), (3, 3)]


因此,我们可以传给zip 输入输出,然后构造训练集

train = list(zip(in, out)


tensor.clone()

复制tensor,和 copy() 不同的是,clone()得到的Tensor不仅拷贝了原始的value,而且会计算梯度传播信息,copy_()只拷贝数值

a = torch.tensor([1,2,3,4,5], dtype=torch.float32, requires_grad=True)
b = a.clone()#a经过克隆得到b,
c = (b ** 2).mean()#
c.backward()
print('a_grad:', a.grad)#但是梯度传播没有因此中断
a_grad: tensor([ 0.4000,  0.8000,  1.2000,  1.6000,  2.0000])


进行三维以上的转置

直接使用 a.t_() 会报错,应该使用 transpose_()

# 一开始a的维度为  torch.Size([100, 10, 25907])

a.transpose_(0, 1)

# 转换后的维度为 torch.Size([100, 10, 25907])


进行Tensor中的 “1” 的定位

在编码方式为onehot的时候,定位 “1” 是非常重要的。我的思路是先转换为列表,然后利用 index() 函数进行找到 “1”

list(a[1][2]).index(1.0)


如果要选出 softmax 最大的一个,可以用 argmax 函数。简单的例子如下

>>> a = torch.randn(4, 4)
>>> a
tensor([[ 1.3398,  0.2663, -0.2686,  0.2450],
        [-0.7401, -0.8805, -0.3402, -1.1936],
        [ 0.4907, -1.3948, -1.0691, -0.3132],
        [-1.6092,  0.5419, -0.2993,  0.3195]])
>>> torch.argmax(a)
tensor(0)

Share

You may also like...

发表评论