pytorch可以自动求导梯度,不过要对需要求梯度的tensor设置为“requires grad = TRUE"。同时,pytorch可以对神经网络进行灵活训练,主要同通过Optimazer的设计来实现的。
以下针对不同的应用场景需要对optimizer的使用进行总结。
1. 多个神经网络联合训练
应用场景
(1)Autoencoder网络分为encoder与decoder两部分组成,中间加入了AWGN噪声。首先两部分进行联合训练,得到压缩编码,然后再单独将接收端进行训练,观看性能是否有所提升。
(2)GAN网络的discriminator需要单独进行training,generator需要经过discriminator后,再进行参数更新,同时,discriminator锁死,不进行参数更新,只进行梯度反传。
具体实现
(1)Autoencoder只进行接收端的训练时,网络结构如下,定义一个encoder的网络参数,再定义一个decoder的网络参数
super(AutoEncoder, self).__init__()
self.encoder = nn.Sequential(
nn.Linear(InputNum, 128),
nn.LeakyReLU(),
nn.Linear(128,OutputBit),
)
self.decoder = nn.Sequential(
nn.Linear(OutputBit,128),
nn.LeakyReLU(),
nn.Linear(128, InputNum),
)
Optimizer定义为:
net = AutoEncoder()
net.apply(weight_init)
optimizer = optim.Adam(net.parameters(), lr = LR)
decoder_optimizer = optim.Adam(net.decoder.parameters(), lr=LR)
criterion = nn.CrossEntropyLoss()
第一个optimaizer为整个net的parameters,第二个decoder_optimizer的参数只传入了net.decoder.parameters(),所以
decoder_optimizer.step()
只更新decoder的参数。
(2)GAN在训练网络时如下图:
pytorch网络结构实现为:
class discriminator(nn.Module):
def __init__(self):
super(discriminator,self).__init__()
self.dis=nn.Sequential(
nn.Linear(784,256),#输入特征数为784,输出为256
nn.LeakyReLU(0.2),#进行非线性映射
nn.Linear(256,256),#进行一个线性映射
nn.LeakyReLU(0.2),
nn.Linear(256,1),
nn.Sigmoid()#也是一个激活函数,二分类问题中,
# sigmoid可以班实数映射到【0,1】,作为概率值,
# 多分