基本支持生成对抗的网络

氮化镓代表生成敌对的网是伊恩·古德费勒发明的。这个概念是我们同时训练两个模型:一个生成器和一个评论家。生成器将尝试生成与数据集中的图像相似的新图像,而批评家将尝试从生成器所做的图像中对真实图像进行分类。生成器返回图像,批评家返回一个数字(通常概率为0)。对于虚假图片和1。真正的)。

我们训练他们互相对抗,在每一步(或多或少),我们:

  1. 冻结发电机和培训批评家一步:
    • 得到一批真实的图像(我们叫它真正的)
    • 生成一批假图像(让我们称之为假的)
    • 让批评家评估每一批并从中计算一个损失函数;重要的是,它会积极奖励检测到真实图像的人,而惩罚假图像
    • 用损失的梯度更新批评家的权重
  1. 通过以下步骤冻结批评家并训练发电机:
    • 生成一批假图像
    • 对批评家进行评价
    • 回报的损失,积极回报批评家认为那些是真实的图像
    • 用这个损失的梯度更新生成器的权值

包装的模块

GANModule(来源)

GANModule(发电机=没有一个,评论家=没有一个,gen_mode=)::模块

包装发电机和一个评论家创建GAN。

这只是一个包含两个模型的外壳。调用时,它将把输入委托给发电机或者是评论家取决于的值gen_mode

GANModule.switch(来源)

GANModule.switch(gen_mode=没有一个)

将模块置于生成器模式,如果gen_mode,否则进入批评家模式。

在默认情况下(离开gen_mode没有一个),这将使模块处于另一种模式(如果是生成器模式,则为批评家模式,反之亦然)。

basic_critic(来源)

basic_critic(in_size,n_channels,n_features=64,n_extra_layers=0,norm_type=< NormType。批处理:1 >,ks=3.,=1,填充=没有一个,偏见=没有一个,ndim=2,bn_1st=真正的,act_cls=线性整流函数(Rectified Linear Unit),转置=,初始化=“汽车”,字母x=没有一个,bias_std=0.01,扩张:联盟(int,元组(int,int]] =1,:int=1,padding_mode:str=“零”)

一个基本的图像评论家n_channelsxin_sizexin_size

AddChannels(来源)

AddChannels(n_dim)::模块

添加n_dim通道的末端输入。

basic_generator(来源)

basic_generator(out_size,n_channels,in_sz=One hundred.,n_features=64,n_extra_layers=0,ks=3.,=1,填充=没有一个,偏见=没有一个,ndim=2,norm_type=< NormType。批处理:1 >,bn_1st=真正的,act_cls=线性整流函数(Rectified Linear Unit),转置=,初始化=“汽车”,字母x=没有一个,bias_std=0.01,扩张:联盟(int,元组(int,int]] =1,:int=1,padding_mode:str=“零”)

一个基本的发电机in_sz图片n_channelsxout_sizexout_size

评论家=basic_critic(64,3.)发电机=basic_generator(64,3.)结核菌素=GANModule(评论家=评论家,发电机=发电机)真正的=火炬randn(2,3.,64,64)real_p=结核菌素(真正的)test_eq(real_p形状,(2,1])结核菌素开关()#tst现在处于生成器模式噪音=火炬randn(2,One hundred.)假的=结核菌素(噪音)test_eq(假的形状,真正的形状)结核菌素开关()tst又回到了批评家模式fake_p=结核菌素(假的)test_eq(fake_p形状,(2,1])

DenseResBlock(来源)

DenseResBlock(nf,norm_type=< NormType。批处理:1 >,ks=3.,=1,填充=没有一个,偏见=没有一个,ndim=2,bn_1st=真正的,act_cls=线性整流函数(Rectified Linear Unit),转置=,初始化=“汽车”,字母x=没有一个,bias_std=0.01,扩张:联盟(int,元组(int,int]] =1,:int=1,padding_mode:str=“零”)

Resnet块nf特性。conv_kwargs被传递给conv_layer

gan_critic(来源)

gan_critic(n_channels=3.,nf=128,n_blocks=3.,p=0.15)

评论家训练氮化镓

GANLoss(来源)

GANLoss(gen_loss_func,crit_loss_func,gan_model)::GANModule

包装crit_loss_funcgen_loss_func

在生成器模式下,该损失函数期望输出发电机和一些目标(一组真实图像)。它将评估生成器是否成功愚弄批评家使用gen_loss_func。这个损失函数具有以下特征

def gen_loss_func(fake_pred, output, target):

能够将批评家的输出组合在一起输出第一个论点fake_pred),输出目标(例如,如果你想把氮化镓损失和其他损失混合在一起)。

在“批评”模式下,该损失函数期望real_pred评论家和一些人给出的输入(噪音传入发电机)。它将评估批评家使用crit_loss_func。这个损失函数具有以下特征

def crit_loss_func (real_pred fake_pred):

在哪里real_pred是输出的评论家对一批真实的图像和fake_pred是由发电机产生的噪音。

AdaptiveLoss(来源)

AdaptiveLoss(暴击)::模块

扩大目标匹配输出规模应用前暴击

accuracy_thresh_expand(来源)

accuracy_thresh_expand(y_pred,y_true,=0.5,乙状结肠=真正的)

展开后计算精度y_true大小为y_pred

甘训练的回调

set_freeze_model(来源)

set_freeze_model(,rg)

GANTrainer(来源)

GANTrainer(switch_eval=,剪辑=没有一个,β=0.98,gen_first=,show_img=真正的)::回调

甘处理培训。

FixedGANSwitcher(来源)

FixedGANSwitcher(n_crit=1,n_gen=1)::回调

切换器来做n_crit反复的批评n_gen生成器的迭代。

AdaptiveGANSwitcher(来源)

AdaptiveGANSwitcher(gen_thresh=没有一个,critic_thresh=没有一个)::回调

切换器,当损失下降到下面时返回到生成器/批评家gen_thresh/crit_thresh

GANDiscriminativeLR(来源)

GANDiscriminativeLR(mult_lr=5.0)::回调

回调它处理了学习率乘以mult_lr评论家。

氮化镓数据

InvisibleTensor(来源)

InvisibleTensor(x,* *kwargs)::TensorBase

generate_noise(来源)

generate_noise(fn,大小=One hundred.)

废话=128大小=64
dblock=DataBlock(=(TransformBlock,ImageBlock),get_x=generate_noise,get_item=get_image_files,分束器=IndexSplitter([]),item_tfms=调整(大小,方法=ResizeMethod作物),batch_tfms=正常化from_stats(火炬张量([0.5,0.5,0.5]),火炬张量([0.5,0.5,0.5))))
路径=untar_data(urlLSUN_BEDROOMS)
dls=dblockdataloaders(路径,路径=路径,废话=废话)
dlsshow_batch(max_n=16)

氮化镓学习者

gan_loss_from_func(来源)

gan_loss_from_func(loss_gen,loss_crit,weights_gen=没有一个)

为GAN定义丢失函数loss_genloss_crit

GANLearner(来源)

GANLearner(dls,发电机,评论家,gen_loss_func,crit_loss_func,切换器=没有一个,gen_first=,switch_eval=真正的,show_img=真正的,剪辑=没有一个,哥伦比亚广播公司=没有一个,指标=没有一个,loss_func=没有一个,opt_func=亚当,lr=0.001,分束器=trainable_params,路径=没有一个,model_dir=“模型”,wd=没有一个,wd_bn_bias=,train_bn=真正的,妈妈=(0.95, 0.85, 0.95))::学习者

一个学习者适合甘斯。

fastai.callback.all进口*
发电机=basic_generator(64,n_channels=3.,n_extra_layers=1)评论家=basic_critic(64,n_channels=3.,n_extra_layers=1,act_cls=部分(神经网络LeakyReLU,negative_slope=0.2))
学习=GANLearnerwgan(dls,发电机,评论家,opt_func=RMSProp)
学习录音机train_metrics=真正的学习录音机valid_metrics=
学习适合(1,2的军医,wd=0.)
学习show_results(max_n=9,ds_idx=0)