Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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
Machine learning 我的代码在tensorflow中使用批处理规范化层是否正确?_Machine Learning_Tensorflow_Deep Learning_Batch Normalization - Fatal编程技术网

Machine learning 我的代码在tensorflow中使用批处理规范化层是否正确?

Machine learning 我的代码在tensorflow中使用批处理规范化层是否正确?,machine-learning,tensorflow,deep-learning,batch-normalization,Machine Learning,Tensorflow,Deep Learning,Batch Normalization,我有两个相同形状的输入:qi_pos&qi_neg。它们应该由两个mlp层进行处理,最后得到两个结果作为分数。这是我的密码: self.mlp1_pos = nn_layers.full_connect_(qi_pos, 256, activation='relu', use_bn = None, keep_prob=self.keep_prob, name = 'deep_mlp_1') self.mlp2_pos = nn_layers.full_co

我有两个相同形状的输入:
qi_pos&qi_neg
。它们应该由两个mlp层进行处理,最后得到两个结果作为分数。这是我的密码:

  self.mlp1_pos  =    nn_layers.full_connect_(qi_pos,        256, activation='relu', use_bn = None, keep_prob=self.keep_prob,  name = 'deep_mlp_1')
  self.mlp2_pos  =    nn_layers.full_connect_(self.mlp1_pos, 128,  activation='relu', use_bn = True, keep_prob=self.keep_prob,  name = 'deep_mlp_2')
  self.pos_pair_sim = nn_layers.full_connect_(self.mlp2_pos,  1,  activation=None, use_bn = True, keep_prob=self.keep_prob,  name = 'deep_mlp_3')
  tf.get_variable_scope().reuse_variables()
  self.mlp1_neg  =    nn_layers.full_connect_(qi_neg,        256, activation='relu', use_bn = None, keep_prob=self.keep_prob,  name = 'deep_mlp_1')
  self.mlp2_neg  =    nn_layers.full_connect_(self.mlp1_neg, 128,  activation='relu', use_bn = True, keep_prob=self.keep_prob,  name = 'deep_mlp_2')
  self.neg_pair_sim = nn_layers.full_connect_(self.mlp2_neg,  1,  activation=None, use_bn = True, keep_prob=self.keep_prob,  name = 'deep_mlp_3')
我使用BN层规范化隐藏层中的节点:

def full_connect_(inputs, num_units, activation=None, use_bn = None, keep_prob = 1.0, name='full_connect_'):
  with tf.variable_scope(name):
    shape = [inputs.get_shape()[-1], num_units]
    weight = weight_variable(shape)
    bias = bias_variable(shape[-1])
    outputs_ = tf.matmul(inputs, weight) + bias
    if use_bn:
        outputs_ = tf.contrib.layers.batch_norm(outputs_, center=True, scale=True, is_training=True,decay=0.9,epsilon=1e-5, scope='bn')
    if activation=="relu":
      outputs = tf.nn.relu(outputs_)
    elif activation == "tanh":
      outputs = tf.tanh(outputs_)
    elif activation == "sigmoid":
      outputs = tf.nn.sigmoid(outputs_)
    else:
      outputs = outputs_
    return  outputs

   with tf.name_scope('predictions'):
      self.sim_diff = self.pos_pair_sim - self.neg_pair_sim # shape = (batch_size, 1)
      self.preds = tf.sigmoid(self.sim_diff) # shape = (batch_size, 1)
      self.infers = self.pos_pair_sim
下面是损失的定义,似乎没问题

with tf.name_scope('predictions'):
  sim_diff = pos_pair_sim - neg_pair_sim
  predictions = tf.sigmoid(sim_diff)
  self.infers = pos_pair_sim
## loss and optim
with tf.name_scope('loss'):
  self.loss = nn_layers.cross_entropy_loss_with_reg(self.labels, self.preds)
  tf.summary.scalar('loss', self.loss)

我不确定我是否以正确的方式使用了BN层。我的意思是,BN参数来自两个独立部分的隐藏单元,这两个部分基于
qi_pos
qi_neg
张量作为输入。无论如何,任何人都可以帮我检查一下吗?

我觉得你的代码很好,在网络的不同分支中应用BN没有问题。但我想在这里提几点注意事项:

  • BN超参数是相当标准的,所以我通常不会手动设置
    衰减
    ε
    雷诺衰减
    。这并不意味着你不能改变它们,在大多数情况下这根本没有必要

  • 您在激活函数之前应用BN,但是,有证据表明,如果在激活之后应用BN,效果会更好。例如,请参见。再次,这并不意味着它是一个bug,只是一个需要考虑的架构。


    • 我觉得您的代码很好,在网络的不同分支中应用BN没有问题。但我想在这里提几点注意事项:

      • BN超参数是相当标准的,所以我通常不会手动设置
        衰减
        ε
        雷诺衰减
        。这并不意味着你不能改变它们,在大多数情况下这根本没有必要

      • 您在激活函数之前应用BN,但是,有证据表明,如果在激活之后应用BN,效果会更好。例如,请参见。再次,这并不意味着它是一个bug,只是一个需要考虑的架构。


      谢谢。顺便问一下,我的网络需要使用BN吗?实际上,我的网络只有三层,输入是短句的嵌入。我听说BN在计算机版本的网络中很常用,因为网络的参数非常大和密集。这是一个很深的问题,没有通用的答案。就收敛速度而言(通常是RNN和RL任务),BN会使情况变得更糟。也有可能是因为数据规范化得很好,所以BN不会产生很大的差异,但在计算方面不是免费的。如果只有3个层和数据被预处理,我通常会考虑一个或没有一个BN,然后继续检查我的模型。它可能会以几十亿美元结束,但不是我开始时的设计。谢谢。顺便问一下,我的网络需要使用BN吗?实际上,我的网络只有三层,输入是短句的嵌入。我听说BN在计算机版本的网络中很常用,因为网络的参数非常大和密集。这是一个很深的问题,没有通用的答案。就收敛速度而言(通常是RNN和RL任务),BN会使情况变得更糟。也有可能是因为数据规范化得很好,所以BN不会产生很大的差异,但在计算方面不是免费的。如果只有3个层和数据被预处理,我通常会考虑一个或没有一个BN,然后继续检查我的模型。它可能会以几个BN结束,但不是我开始的设计。