简体   繁体   English

GAN:Gradient Tape 计算判别器的零梯度

[英]GAN: Gradient Tape computes zero gradients for discriminator

I'm computing gradients for the discriminator using gradient tape.我正在使用梯度带计算鉴别器的梯度。 Discriminator model has custom layers and filters, but the gradients are zero.鉴别器 model 具有自定义层和过滤器,但梯度为零。 The gradients for the generator are being computed just fine.生成器的梯度计算得很好。 The model is processing the audios and the custom filters initialized as tf variables with trainable set as true model 正在处理音频和自定义过滤器,这些过滤器初始化为 tf 变量,可训练设置为 true


This is the discriminator这是鉴别器

def discriminator(images_from_before, filters):
    #Discriminator
    #3x1 Convolution
    conv_3 = tf.nn.conv1d(input = images_from_before,
                filters = filters.filters[0][0],
                stride = 1,
                padding = 'SAME',
                data_format = 'NWC')
    #9x1 Convolution
    conv_9 = tf.nn.conv1d(input = images_from_before,
                filters = filters.filters[0][1],
                stride = 1,
                padding = 'SAME',
                data_format = 'NWC')
    #27x1 Convolution
    conv_27 = tf.nn.conv1d(input = images_from_before,
                filters = filters.filters[0][2], #some of the whole tfVariable
                stride = 1,
                padding = 'SAME',
                data_format = 'NWC')
    #81x1 Convolution
    conv_81 = tf.nn.conv1d(input = images_from_before,
                filters = filters.filters[0][3], #some of the whole tfVariable
                stride = 1,
                padding = 'SAME',
                data_format = 'NWC')
            
    out = tf.concat([conv_3,conv_9,conv_27,conv_81], 2)

    out = leaky_relu(out,0.2)

    #7x Discriminator block
    for i in range(7):
        out = discriminator_block(out,filters.filters[i+1],filters.BN_val[i])

    #Flatten width of the out tensor    
    mul_FC = out.shape[1] * out.shape[2]

    #FC - Dropout - LeakyReLU
    #Flatten out
    out = tf.reshape(out, shape = [out.shape[0],mul_FC])
    out = FClayer(out,filters.FC1, filters.bias1)
    out = Dropout(out)
    out = leaky_relu(out,0.2)

    #FC - Sigmoid
    out = FClayer(out, filters.FC2, filters.bias2)

    out = tf.math.sigmoid(out)

    #implicit mean over the minibatch samples
    out = tf.math.reduce_mean(out)

    out = tf.clip_by_value(out,0.1, 0.9)

    return out

The gradients are being calculated as follow梯度计算如下

with tf.GradientTape() as gen_tape, tf.GradientTape() as dis_tape:
        gen_out = generator.generator(downsampled, num_of_blocks, gen_var)
        
        gen_dis = discriminator.discriminator(gen_out,dis_var)     
        
        #compute losses
        gen_loss = losses.generator_loss(
                            losses.L2_loss(upsampled, gen_out),
                            losses.Lf_loss(upsampled, gen_out,auto_var,4),
                            losses.Ladv_loss(gen_dis,dis_var), #updated
                            lamda_f,
                            lamda_adv)

        dis_loss = losses.discriminator_loss(0.1, 
                                             gen_dis)
        
    print('Gen loss: {}'.format(gen_loss.numpy()))
    print('Dis loss: {}'.format(dis_loss.numpy()))
    


    gen_grads = gen_tape.gradient(gen_loss, [gen_var.dfilters,
                                             gen_var.ufilters,
                                             gen_var.finalfilter,
                                             gen_var.prelu])
    
    disc_grads = dis_tape.gradient(dis_loss, [dis_var.filters,
                                              dis_var.BN_val,
                                              dis_var.FC1,
                                              dis_var.bias1,
                                              dis_var.FC2,
                                              dis_var.bias2])

The gradient tape needs to have the parameter persistent=True渐变胶带需要有参数persistent=True

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Tensorflow 渐变带“未连接渐变的未知值” - Tensorflow Gradient tape 'unknown value for unconnected gradients' train GAN 生成器梯度始终为 0,Discriminator 表现良好 - train GAN generator gradient is always 0 and Discriminator is doing well tape.gradient 返回的梯度在自定义训练循环中为无 - Gradients returned by tape.gradient is None in Custom Training Loop 使用 tf.GradientTape 的自定义 GAN 训练循环返回 [None] 作为生成器的梯度,而它适用于鉴别器 - Custom GAN training loop using tf.GradientTape returns [None] as gradients for generator while it works for discriminator PyTorch 计算梯度为 None - PyTorch computes gradients as None (MNIST-GAN)鉴别器和生成器错误在第一次迭代后下降到接近零 - (MNIST - GAN) Discriminator and Generator error dropping close to zero after first iteration GAN 鉴别器拒绝生成模型 - GAN Discriminator denies generated models 使用预训练的卷积网络作为 GAN 鉴别器 - Using pretrained convolutional network as a GAN discriminator 在GAN中使用受过训练的判别器来计算概率 - Use trained discriminator in GAN to calculate probabilities 如何在 Tensorflow GAN 中禁用鉴别器训练? - How to disable discriminator training inside a Tensorflow GAN?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM