小白学GAN系列2——nn.ReLU与nn.LeakyReLU的区别

nn.ReLU与nn.LeakyReLU的区别

因为之前从未接触过这方面,直接接手GAN,有点吃力,如有明显漏洞,请指正,我会感激不尽。

昨晚查阅了ReLU的含义,结果今天发现高老师给的代码中又有一个LeakyReLU,所以今天这个小白贴来对比下两者:

下图是ReLU、Leaky ReLU、PReLU和RReLU的比较:

ReLU是将所有的负值都设为零,相反,Leaky ReLU是给所有负值赋予一个非零斜率。

img

可以看到,ReLU函数即小于0的就等于0,大于0的就等于原函数.=max(0,x)=img

LeakyReLu的函数为img

参考链接:https://blog.csdn.net/aizhouqian5537/article/details/101684418?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

https://blog.csdn.net/u011630472/article/details/90210041https://blog.csdn.net/u011630472/article/details/90210041

class Generator(nn.Module): def __init__(self): super(Generator, self).__init__() self.encoder = nn.Sequential( nn.Conv2d(6, 64, 3, stride=2, padding=1), nn.BatchNorm2d(64), nn.LeakyReLU(0.2), nn.Conv2d(64, 128, 3, stride=2, padding=1), nn.BatchNorm2d(128), nn.LeakyReLU(0.2), nn.Conv2d(128, 256, 3, stride=2, padding=1), nn.BatchNorm2d(256), nn.LeakyReLU(0.2), nn.Conv2d(256, 512, 3, stride=2, padding=1), nn.BatchNorm2d(512), nn.LeakyReLU(0.2), nn.Conv2d(512, 4000, 1), nn.BatchNorm2d(4000), nn.LeakyReLU(0.2) ) self.decoder = nn.Sequential( nn.ConvTranspose2d(4000, 512, 3, stride=2, padding=1, output_padding=1), nn.BatchNorm2d(512), nn.LeakyReLU(0.2), nn.ConvTranspose2d(512, 256, 3, stride=2, padding=1, output_padding=1), nn.BatchNorm2d(256), nn.LeakyReLU(0.2), nn.ConvTranspose2d(256, 128, 3, stride=2, padding=1, output_padding=1), nn.BatchNorm2d(128), nn.LeakyReLU(0.2), nn.ConvTranspose2d(128, 64, 3, stride=2, padding=1, output_padding=1), nn.BatchNorm2d(64), nn.LeakyReLU(0.2), nn.ConvTranspose2d(64, 3, 3, stride=1, padding=1), nn.Tanh() ) def forward(self, x1, x2): x = torch.cat([x1, x2], dim=1) x = self.encoder(x) x = self.decoder(x) return x class Discriminator(nn.Module): def __init__(self): super(Discriminator, self).__init__() self.conv = nn.Sequential( nn.Conv2d(3, 64, 4, stride=2, padding=1), nn.BatchNorm2d(64), nn.LeakyReLU(0.2), nn.Conv2d(64, 128, 4, stride=2, padding=1), nn.BatchNorm2d(128), nn.LeakyReLU(0.2), nn.Conv2d(128, 256, 4, stride=2, padding=1), nn.BatchNorm2d(256), nn.LeakyReLU(0.2), nn.Conv2d(256, 512, 4, stride=2, padding=1), nn.BatchNorm2d(512), nn.LeakyReLU(0.2), nn.Conv2d(512, 1, 4, stride=1), nn.Sigmoid() ) def forward(self, x): x = self.conv(x) return x 上述网络结构是什么GAN
05-18
运行以下Python代码:import torchimport torch.nn as nnimport torch.optim as optimfrom torchvision import datasets, transformsfrom torch.utils.data import DataLoaderfrom torch.autograd import Variableclass Generator(nn.Module): def __init__(self, input_dim, output_dim, num_filters): super(Generator, self).__init__() self.input_dim = input_dim self.output_dim = output_dim self.num_filters = num_filters self.net = nn.Sequential( nn.Linear(input_dim, num_filters), nn.ReLU(), nn.Linear(num_filters, num_filters*2), nn.ReLU(), nn.Linear(num_filters*2, num_filters*4), nn.ReLU(), nn.Linear(num_filters*4, output_dim), nn.Tanh() ) def forward(self, x): x = self.net(x) return xclass Discriminator(nn.Module): def __init__(self, input_dim, num_filters): super(Discriminator, self).__init__() self.input_dim = input_dim self.num_filters = num_filters self.net = nn.Sequential( nn.Linear(input_dim, num_filters*4), nn.LeakyReLU(0.2), nn.Linear(num_filters*4, num_filters*2), nn.LeakyReLU(0.2), nn.Linear(num_filters*2, num_filters), nn.LeakyReLU(0.2), nn.Linear(num_filters, 1), nn.Sigmoid() ) def forward(self, x): x = self.net(x) return xclass ConditionalGAN(object): def __init__(self, input_dim, output_dim, num_filters, learning_rate): self.generator = Generator(input_dim, output_dim, num_filters) self.discriminator = Discriminator(input_dim+1, num_filters) self.optimizer_G = optim.Adam(self.generator.parameters(), lr=learning_rate) self.optimizer_D = optim.Adam(self.discriminator.parameters(), lr=learning_rate) def train(self, data_loader, num_epochs): for epoch in range(num_epochs): for i, (inputs, labels) in enumerate(data_loader): # Train discriminator with real data real_inputs = Variable(inputs) real_labels = Variable(labels) real_labels = real_labels.view(real_labels.size(0), 1) real_inputs = torch.cat((real_inputs, real_labels), 1) real_outputs = self.discriminator(real_inputs) real_loss = nn.BCELoss()(real_outputs, torch.ones(real_outputs.size())) # Train discriminator with fake data noise = Variable(torch.randn(inputs.size(0), self.generator.input_dim)) fake_labels = Variable(torch.LongTensor(inputs.size(0)).random_(0, 10)) fake_labels = fake_labels.view(fake_labels.size(0), 1) fake_inputs = self.generator(torch.cat((noise, fake_labels.float()), 1)) fake_inputs = torch.cat((fake_inputs, fake_labels), 1) fake_outputs = self.discriminator(fake_inputs) fake_loss = nn.BCELoss()(fake_outputs, torch.zeros(fake_outputs.size())) # Backpropagate and update weights for discriminator discriminator_loss = real_loss + fake_loss self.discriminator.zero_grad() discriminator_loss.backward() self.optimizer_D.step() # Train generator noise = Variable(torch.randn(inputs.size(0), self.generator.input_dim)) fake_labels = Variable(torch.LongTensor(inputs.size(0)).random_(0,
02-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值