【问题标题】:Tensorflow different activation functions for output layerTensorFlow 输出层的不同激活函数
【发布时间】:2019-03-21 12:19:09
【问题描述】:

所以我的问题似乎很简单,但我无法弄清楚 python tensorflow 的语法。 我有一个简单的神经网络,它有一个输入层、一个隐藏层和一个输出层。 输出层由两个神经元组成。 所以问题来了:我想保持线性的第一个输出神经元,而第二个输出神经元应该有一个 sigmoidal 激活函数。 我发现 tensorflow 中没有“切片分配”之类的东西,但我没有找到任何解决方法。

这里是一个例子 sn-p:

def multilayer_perceptron(x, weights, biases,act_fct):

    layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1'], name='hidden_layer_op')

    if (act_fct == 'sigmoid'):
        layer_1 = tf.nn.sigmoid(layer_1)
        print 'sigmoid' 
   elif (act_fct == 'relu'):
       print 'relu'
       layer_1 = tf.nn.relu(layer_1)
   elif (act_fct == 'linear'):
       print 'linear'
   else : 
       print 'Unknown activation function'
       sys.exit()    

   out_layer = tf.add(tf.matmul(layer_1, weights['out']), biases['out'], name='output_layer_op')

   ##DOES NOT WORK!
   out_layer[1] = tf.nn.sigmoid(out_layer[1])
return out_layer

我确信有一种非常简单的方法可以做到这一点。但是希望有人可以帮助我。 附言(传递给函数的所有变量都已事先相应地初始化)

最好的问候和感谢!

【问题讨论】:

    标签: python tensorflow machine-learning neural-network


    【解决方案1】:

    我假设layer_1 是一个形状为(batch_size, 2) 的张量。这是一种方法:

    import tensorflow as tf
    
    batch_size = 3
    layer_1 = tf.ones((batch_size, 2))
    
    output_1 = layer_1[:, None, 0]
    output_2 = tf.sigmoid(layer_1[:, None, 1])
    
    output = tf.concat([output_1, output_2], axis=-1)
    
    with tf.Session() as sess:
        print(sess.run(output))
    

    【讨论】:

      【解决方案2】:

      非常感谢您的回答! 这帮助我找到了一个可行的解决方案。

      我有 n_features 输入神经元连接到 20 个隐藏神经元。然后将这 20 个输入神经元连接到 2 个输出神经元。

      所以 layer_1 的形状是 (batch_size, 20) (或者实际上是 (?,20))。 此外,我在 tensorflow 版本中遇到了一个关于 concat 的小问题(也不需要 axis=!)。关于您的版本,可能必须写:

      output = tf.concat(1,[output_1, output_2])
      

      而不是

      output = tf.concat([output_1, output_2],1)
      

      无论如何,这里是工作代码(初始化和连接):

      初始化:

      weights = {
          'h1': tf.Variable(tf.random_normal([n_input, n_hidden_1]),name='w_hidden'),
          'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_1]),name='w_hidden2'),
          'out1': tf.Variable(tf.random_normal([n_hidden_1, 1]),name='w_out_1'),
          'out2': tf.Variable(tf.random_normal([n_hidden_1, 1]),name='w_out_2')
      }
      
      biases = {
          'b1': tf.Variable(tf.random_normal([n_hidden_1]),name='bias_hidden'),
          'b2': tf.Variable(tf.random_normal([n_hidden_1]),name='bias_hidden2'),
          'out1': tf.Variable(tf.random_normal([1]),name='bias_out1'),
          'out2': tf.Variable(tf.random_normal([1]),name='bias_out2')
      }
      

      连接:

      layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1'], name='hidden_layer_op')
      
          layer_1 = tf.nn.sigmoid(layer_1)
          print 'sigmoid'     
      
      output_1 = tf.add(tf.matmul(layer_1[0, None, :], weights['out1']), biases['out1'], name='output_layer_op1')
      
      output_2 = tf.add(tf.matmul( layer_1[1, None, :], weights['out2']), biases['out2'], name='output_layer_op1')
      output_2 = tf.sigmoid(output_2)
      
      out_layer = tf.concat(1,[output_1, output_2])       
      
      return out_layer
      

      谢谢和最好的问候!

      【讨论】:

        猜你喜欢
        • 2016-10-14
        • 1970-01-01
        • 2021-05-15
        • 1970-01-01
        • 2017-07-30
        • 1970-01-01
        • 2022-11-14
        • 2019-11-11
        • 2021-03-19
        相关资源
        最近更新 更多