Tensorflow用于输出层的不同激活功能

时间:2018-05-11 11:40:36

标签: python tensorflow machine-learning neural-network

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

这是一个示例代码段:

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

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

致以最诚挚的问候和感谢!

2 个答案:

答案 0 :(得分:2)

非常感谢您的回答! 这有助于我找到一个有效的解决方案。

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

因此layer_1的形状是(batch_size,20)(或实际上是(?,20))。 此外,我遇到了关于concat的tensorflow版本的一个小问题(也不需要轴=!)。关于你的版本,可能需要写:

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

谢谢和最诚挚的问候!

答案 1 :(得分: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))