Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 不更新权重的tensorflow模型_Python_Tensorflow_Machine Learning_Deep Learning_Generative Adversarial Network - Fatal编程技术网

Python 不更新权重的tensorflow模型

Python 不更新权重的tensorflow模型,python,tensorflow,machine-learning,deep-learning,generative-adversarial-network,Python,Tensorflow,Machine Learning,Deep Learning,Generative Adversarial Network,我有一个模型是训练(它经历步骤和时代,评估损失),但重量不是训练 我试着训练一个鉴别器来区分图像是合成的还是真实的。这是GANs模型的一部分,我正在努力构建 基本结构如下: 我有两个输入: 1.图像(可以是真实的或合成的)2。标签(0表示真实,1表示合成) 源估计器是我从图像中提取特征的地方。我已经训练了模型,恢复了权重和偏差。这些层被冻结(不可训练) 鉴别器如下所示: def DiscriminatorModel(features, reuse=False): with tf.varia

我有一个模型是训练(它经历步骤和时代,评估损失),但重量不是训练

我试着训练一个鉴别器来区分图像是合成的还是真实的。这是GANs模型的一部分,我正在努力构建

基本结构如下:

我有两个输入: 1.图像(可以是真实的或合成的)2。标签(0表示真实,1表示合成)

源估计器是我从图像中提取特征的地方。我已经训练了模型,恢复了权重和偏差。这些层被冻结(不可训练)

鉴别器如下所示:

def DiscriminatorModel(features, reuse=False):
  with tf.variable_scope('discriminator', reuse=tf.AUTO_REUSE):
    net = tf.layers.conv2d(features, 64, 3, 2, padding='same', kernel_initializer='truncated_normal', activation=tf.nn.leaky_relu, trainable=True, name='discriminator_c1')
    net = tf.layers.conv2d(net, 128, 3, 2, padding='same', kernel_initializer='truncated_normal', activation=tf.nn.leaky_relu, trainable=True, name='discriminator_c2')
    net = tf.layers.conv2d(net, 256, 3, 2, padding='same', kernel_initializer='truncated_normal', activation=tf.nn.leaky_relu, trainable=True, name='discriminator_c3')

    net = tf.contrib.layers.flatten(net)
    net = tf.layers.dense(net, units=1, activation=tf.nn.softmax, name='descriminator_out', trainable=True)
    return net
输入到SourceEstimator模型并提取特征(c3、c5)

然后c3和c5沿通道轴连接并传递到鉴别器模型

c3, c5 = CommonModel(self.left_eye, 'el', trainable=False)
c5 = tf.image.resize_images(c5, size=(self.config.img_size,self.config.img_size))
features = tf.concat([c3, c5], axis=3)
##---------------------------------------- DISCRIMINATOR ------------------------------------------##
with tf.variable_scope('discriminator'):
    logit = DiscriminatorModel(features)
最后是损失和列车运行

##---------------------------------------- LOSSES ------------------------------------------##
with tf.variable_scope("discriminator_losses"):
  self.loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logit, labels=self.label))

##---------------------------------------- TRAIN ------------------------------------------##
# optimizers
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
    disc_optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate)
    self.disc_op = disc_optimizer.minimize(self.loss, global_step=self.global_step_tensor, name='disc_op')
训练步骤和时代。我使用32个批量大小。和数据生成器类来获取每个步骤的图像

def train_epoch(self):
    num_iter_per_epoch = self.train_data.get_size() // self.config.get('batch_size')
    loop = tqdm(range(num_iter_per_epoch))
    for i in loop:
        dloss = self.train_step(i)
        loop.set_postfix(loss='{:05.3f}'.format(dloss))

def train_step(self, i):
    el, label = self.train_data.get_batch(i)

    ## ------------------- train discriminator -------------------##
    feed_dict = {
            self.model.left_eye: el,
            self.model.label: label
    }
    _, dloss = self.sess.run([self.model.disc_op, self.model.loss], feed_dict=feed_dict)
    return dloss
虽然模型经历了许多步骤和时代,但权重保持不变

损失在训练步骤中波动,但每个历元的损失都是相同的。例如,如果我不在每个历元中洗牌数据集,图形上的丢失将在每个历元中遵循相同的模式

我认为这意味着该模型可以识别不同的损失,但不会根据损失更新参数

以下是我尝试过但没有帮助的其他一些事情:

  • 尝试小学习率和大学习率(0.1和1e-8)
  • 尝试使用SourceEstimator layers trainable==True
  • 翻转标签(0==合成,1==真实)
  • 增加了鉴别器中的内核大小和过滤器大小
  • 我已经在这个问题上纠缠了一段时间了,我真的需要一些见解。提前谢谢

    ------编辑1-----


    我可以看到您正在session.run()中调用minimize和loss函数。您应该只调用minimize()函数。i、 e.仅self.model.disc_op可在内部调用丢失功能。 此外,我在任何地方都看不到您的会话初始化调用。确保它只被呼叫一次


    查看更新后的代码,我可以看到您将tf.is_variable_initialized()调用等同于is_not_initialized。因此,它正在初始化那些已经初始化的变量。

    我可以看到您在session.run()中调用了minimize和loss函数。您应该只调用minimize()函数。i、 e.仅self.model.disc_op可在内部调用丢失功能。 此外,我在任何地方都看不到您的会话初始化调用。确保它只被呼叫一次


    查看更新后的代码,我可以看到您将tf.is_variable_initialized()调用等同于is_not_initialized。因此,它正在初始化那些已经初始化的变量。

    我从未设法找出代码的错误

    我的同事建议在不同的隔离环境中尝试相同的模型,所以我使用Keras库重写了代码

    现在它开始工作了。:/

    我们仍然不知道上面的代码到底出了什么问题-我没有改变任何东西。我甚至使用相同的代码进行权重传递和变量初始化

    如果有人遇到过类似的问题,我建议在不同的环境中尝试相同的模型


    或者,如果有人知道上面的代码有什么问题,请分享

    我从未设法找出代码的错误

    我的同事建议在不同的隔离环境中尝试相同的模型,所以我使用Keras库重写了代码

    现在它开始工作了。:/

    我们仍然不知道上面的代码到底出了什么问题-我没有改变任何东西。我甚至使用相同的代码进行权重传递和变量初始化

    如果有人遇到过类似的问题,我建议在不同的环境中尝试相同的模型


    或者,如果有人知道上面的代码有什么问题,请分享

    你是对的,我没有包括会话初始化。因为部分模型是从预训练模型恢复的。我必须创建自定义初始化函数,以便只初始化未初始化的变量。不想被不必要的代码淹没。我还尝试了你的建议,只调用最小化函数。不幸的是,这没有帮助。我调用loss函数来对每个历元进行简单的求值,我不认为这是问题所在:(在帖子中包含了会话初始化!查看更新的代码,我可以看到您将tf.is_variable_initialized()等同于调用is_not_initialized。因此,它正在初始化那些已经初始化的变量。谢谢,我应该解决这个问题,这是一个糟糕的命名。但是,在下面的一行中,当获取未初始化的变量时,它已经得到了补偿。未初始化的变量=[v for(v,f)in zip(全局变量,is_not_initialized),如果不是f]您还可以包括获取登录的代码吗?您是对的,我没有包括会话初始化。因为部分模型是从预训练模型还原的。我必须创建自定义初始化函数,以便仅初始化未初始化的变量。我不想被不必要的代码淹没。我还尝试了您关于ca的建议只调用最小化函数。不幸的是没有帮助。我调用loss函数来对每个历元进行简单的求值,我认为这不是问题所在:(将会话初始化包含到帖子中!查看更新的代码,我可以看到您将tf等同。变量是不是初始化了()调用is_not_initialized。因此,它正在初始化那些已经初始化的变量。谢谢,我应该解决这个问题,这是一个糟糕的命名。但是,在下面的一行中,当获取未初始化的变量时,它已经得到了补偿。未初始化的变量=[v for(v,f)in zip(全局变量,is_not_initialized),如果不是f]你能不能也包括你得到登录的代码
    def train_epoch(self):
        num_iter_per_epoch = self.train_data.get_size() // self.config.get('batch_size')
        loop = tqdm(range(num_iter_per_epoch))
        for i in loop:
            dloss = self.train_step(i)
            loop.set_postfix(loss='{:05.3f}'.format(dloss))
    
    def train_step(self, i):
        el, label = self.train_data.get_batch(i)
    
        ## ------------------- train discriminator -------------------##
        feed_dict = {
                self.model.left_eye: el,
                self.model.label: label
        }
        _, dloss = self.sess.run([self.model.disc_op, self.model.loss], feed_dict=feed_dict)
        return dloss
    
    def initialize_uninitialized(sess):
        global_vars = tf.global_variables()
        is_initialized= sess.run([tf.is_variable_initialized(var) for var in global_vars])
        not_initialized_vars = [v for (v, f) in zip(global_vars, is_initialized) if not f]
    
        # for var in not_initialized_vars: # only for testing
        #    print(var.name)
    
        if len(not_initialized_vars):
            sess.run(tf.variables_initializer(not_initialized_vars))
    
    self.sess = tf.Session()
    ## inbetween here I create data generator, model and restore pretrained model.
    self.initilize_uninitialized(self.sess) 
    
    for current_epoch in range(self.model.current_epoch_tensor.eval(self.sess), self.config.num_epochs, 1)
        self.train_epoch() # included above
        self.sess.run(self.model.increment_current_epoch_tensor)