0%

Pytorch的零碎笔记

最近在学pytorch,虽然与TF2很类似了,但是感觉很多地方还是不太一样,这篇文章主要就是记录一下学习pytorch中遇到的api。

torch.tensor与torch.from_numpy

Torch.tensor可以将numpy对象转化为tensor,但是得到的tensor与原来的数据不共享内存;

torch.from_numpy也可以将numpy对象转化为tensor,但是得到的tensor与原来的数据共享内存。

nn.Conv2d

nn.Conv2d(in_channels,out_channels,kernel_size,strides=1,padding=0)

其中,in_channels表示输入的channels数目,out_channels表示输出的channels数目,kernel_size表示卷积核大小,一般是一个数字或者一个tuple。注意:在nn.conv2d中,无激活函数,需要使用nn.functional中的函数来激活。输入的维度是(batch_size,channels,height,width),与tensorflow不太一样。

nn.MaxPool2d

nn.MaxPool2d(kernel_size,stride=0,padding=1)

输入维度是(batch_size,channels,height,width),输出维度是:(batch_size,channels,height_out,width_out)。

nn.Linear

输入的维度是:(batch_size,seq_length,hidden_size),这个与卷积层的输入是不一样的!

nn.LSTM(input_size=10,hidden_size=20,num_layers=1,batch_first=False,bidirectional=False)

Input_size表示输入的张量的最后一个维度

hidden_size表示输出的张量的最后一个维度

num_layers表示叠加的LSTM的数目,默认为1

batch_first=True表示batch_size放在第0维,那么输入的维度是:(batch_size,seq_length,input_size);默认为false,即输入的维度是:(seq_length,batch_size,input_size)

bidirectional=True表示是BILSTM;默认为false。

pytorch中的各种loss function链接

nn.NLLLoss()表示负对数似然函数,适用于多分类,在使用这个之前,需要使用nn.LogSoftmax;

nn.CrossEntropyLoss表示交叉熵损失函数,适用于多分类,在使用这个之前,不需要使用softmax,只需要得到logits就可以了,结果与nn.NLLLoss结果一样;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import torch
import torch.nn as nn
import torch.optim as optim
import torch.functional as F
import numpy as np

x_input=torch.randn(3,3)#随机生成输入
print('x_input:\n',x_input)
y_target=torch.tensor([1,2,0])#设置输出具体值 print('y_target\n',y_target)

#计算输入softmax,此时可以看到每一行加到一起结果都是1
softmax_func=nn.Softmax(dim=1)
soft_output=softmax_func(x_input)
print('soft_output:\n',soft_output)

#在softmax的基础上取log
log_output=torch.log(soft_output)
print('log_output:\n',log_output)

#对比softmax与log的结合与nn.LogSoftmaxloss(负对数似然损失)的输出结果,发现两者是一致的。
logsoftmax_func=nn.LogSoftmax(dim=1)
logsoftmax_output=logsoftmax_func(x_input)
print('logsoftmax_output:\n',logsoftmax_output)

#pytorch中关于NLLLoss的默认参数配置为:reducetion=True、size_average=True
nllloss_func=nn.NLLLoss()
nlloss_output=nllloss_func(logsoftmax_output,y_target)
print('nlloss_output:\n',nlloss_output)

#直接使用pytorch中的loss_func=nn.CrossEntropyLoss()看与经过NLLLoss的计算是不是一样
crossentropyloss=nn.CrossEntropyLoss()
crossentropyloss_output=crossentropyloss(x_input,y_target)
print('crossentropyloss_output:\n',crossentropyloss_output)

np.random中的各种api

  • np.random.normal(size=(3,4,5))
  • np.random.randint(low=1,high=10,size=(3,4,5))
  • np.random.randn(3,4,5)
  • np.random.choice(tensor,size=(3,4,5))
  • np.random.rand(3,4,5)

permute

一般我们都是使用permute来交换维度,一般不用transpose,注意在使用permute的时候,我们是:x.permute(1,2,3)。

view与reshape讲解

如果我们在使用view之前,使用了transpose与permute等操作,我们一般要紧跟着contiguous(),然后再调用view,要不然会报错;

如果我们不想使用contiguous+view这样的操作,我们也可以使用reshape,但是我们会创建新的tensor。

Would you like to buy me a cup of coffee☕️~