Различные функции активации Tensorflow для выходного слоя - PullRequest
0 голосов
/ 11 мая 2018

Таким образом, моя проблема, кажется, легкая, но я не могу понять синтаксис потока тенонов Python.У меня есть простая нейронная сеть с входным слоем, одним скрытым слоем и одним выходным слоем.Выходной слой состоит из двух нейронов.Так вот в чем проблема: первый выходной нейрон я хочу сохранить линейным, в то время как второй выходной нейрон должен иметь сигмоидальную активационную функцию.Я обнаружил, что в тензорном потоке нет такого понятия, как «нарезанные назначения», но я не нашел обходного пути.

Вот пример кода:

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

Я уверен, что естьочень простой способ сделать это.Однако, надеюсь, кто-то может помочь мне с этим.PS (все переменные, переданные в функцию, были соответственно инициализированы заранее)

с наилучшими пожеланиями и спасибо!

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Большое спасибо за ваш ответ!Это помогло мне найти рабочее решение.

У меня есть n_features входные нейроны, подключенные к 20 скрытым нейронам.Эти 20 входных нейронов затем соединяются с 2 выходными нейронами.

Таким образом, форма layer_1 имеет вид (batch_size, 20) (или фактически (?, 20)).Кроме того, я столкнулся с одной небольшой проблемой в версии tenorflow относительно concat (также ось = не нужна!).Что касается вашей версии, то, возможно, придется написать:

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

Спасибо и всего наилучшего!

0 голосов
/ 11 мая 2018

Я предполагаю, что 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...