所以我的问题似乎很容易,但我无法弄清楚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
我确信有一种非常简单的方法可以做到这一点。但希望有人可以帮助我。 附: (传递给函数的所有变量都已事先相应地初始化)
致以最诚挚的问候和感谢!
答案 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))