1.激活函数(Activation Function):
- Sigmoid函数和Tanh函数

Sigmoid函数是把一个数值压缩到[0,1],特别是个probability或者RGB值的重建,但是会存在梯度离散的问题(在函数两头位置,梯度趋向为0),因此能不使用就不使用。
Tanh函数是对Sigmoid函数经过一个缩放平移操作之后得到的,区间范围变为了[-1,1],因此中间范围的梯度相对来说更大了,但是同样会存在梯度离散的问题,但是Tanh在循环神经网络(RNN)中会使用的多些。
- ReLU函数

ReLU函数非常简单,就是当阈值小于某一值(比如0)时,就不响应;当阈值大于某一值(比如0)时,就输出为y=x。
ReLU函数从一定程度上解决了Sigmoid函数梯度离散的问题,不过在小于某一值(比如0)时梯度还是趋向于0。
- Leaky ReLU函数

为解决上述ReLU函数的问题,提出了Leaky ReLU函数,当小于0时不再是一条横线,而是一条斜率很小的斜线(y=αx,其中α可以在pytorch中设置)。
使用Leaky ReLU函数也很简单,值需要在原来使用ReLU
的位置改为Leaky ReLU
即可。
self.module = nn.Sequential(
nn.Linear(784, 200),
# 可以通过设置alpha参数来设定α的具体值,默认为0.02
nn.LeakyReLU(inplace=True,alpha=0.02),
nn.Linear(200, 200),
nn.LeakyReLU(inplace=True),
nn.Linear(200, 10),
nn.LeakyReLU(inplace=True)
)
- SELU函数:

之前我们提到ReLU函数在x=0处是不连续的(只是数学上的不连续,在工程中会认为该处梯度为0或者1),就提出了一种更加光滑的曲线SELU函数,该函数是两个函数(relu和指数函数)的合并,但是使用不是很多。

- softplus函数:

该函数是将RELU函数在x=0附近做了平滑处理,使得在x=0附近也有一个均匀的梯度变化的过程。
2.GPU加速(GPU accelerated):
Pytorch提供了接口使得很方便的使用GPU加速。不需要额外的去管理很多东西。
可以使用torch.device()
选取并返回抽象出的设备(这里选择了GPU),然后在定义的网络模块或者Tensor后面加上.to(device变量)
就可以将它们搬到设备上了。
另外.cuda()
方法为老版本方法但是不推荐使用。
device = torch.device('cuda:0') # 数字代表cuda编号
net = MLP().to(device) # 将模块搬到GPU上去
optimizer = optim.SGD(net.parameters(), lr=learning_rate)
Loss = nn.CrossEntropyLoss().to(device) # 因为loss层也需要计算,因此也搬到GPU上去
for epoch in range(epochs):
for batch_idx, (data, target) in enumerate(train_loader):
data = data.view(-1, 28 * 28)
data,target = data.to(device),target.to(device) # 记得同时将数据也搬到GPU上去,