Создание softmax на двух каналах в Tensorflow и Keras - PullRequest
0 голосов
/ 23 ноября 2018

Предпоследний слой моей сети имеет форму (U, C), где C - количество каналов.Я хотел бы применить функцию softmax для каждого канала отдельно.

Например, если U=2 и C=3, а слой выдает [ [1 2 3], [10 20 30] ], я бы хотел, чтобы вывод выполнял softmax(1, 2, 3)для канала 0 и softmax(10, 20, 30) для канала 1.

Есть ли способ сделать это с помощью Keras?Я использую TensorFlow в качестве бэкэнда.

UPDATE

Пожалуйста, объясните, как обеспечить, чтобы потеря была суммой обеих перекрестных энтропий, и как я могу это проверить?(То есть я не хочу, чтобы оптимизатор тренировал только потери на одном из softmax, а скорее сумму каждой перекрестной энтропийной потери).Модель использует встроенный Keras categorical_crossentropy для потери.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Определите слой Lambda и используйте функцию softmax из бэкэнда с требуемой осью для вычисления softmax по этой оси:

from keras import backend as K
from keras.layers import Lambda

soft_out = Lambda(lambda x: K.softmax(x, axis=my_desired_axis))(input_tensor)

Обновление: Массив с размером N будет иметь форму (d1, d2, d3, ..., dn).Каждый из них называется осью.Таким образом, первая ось (т. Е. axis=0) имеет размерность d1, вторая ось (т. Е. axis=1) имеет размерность d2 и т. Д.Кроме того, наиболее распространенным случаем массива является двумерный массив или матрица, которая имеет форму (m, n), то есть m строк (т.е. axis=0) и n столбцов (то есть axis=1).Теперь, когда мы указываем ось для выполнения операции, это означает, что операция должна быть вычислена по этой оси.Позвольте мне прояснить это на примерах:

>>> import numpy as np
>>> a = np.arange(12).reshape(3,4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

>>> a.shape
(3, 4)   # three rows and four columns

>>> np.sum(a, axis=0)  # compute the sum over the rows (i.e. for each column)
array([12, 15, 18, 21])

>>> np.sum(a, axis=1)  # compute the sum over the columns (i.e. for each row)
array([ 6, 22, 38])

>>> np.sum(a, axis=-1) # axis=-1 is equivalent to the last axis (i.e. columns)
array([ 6, 22, 38])

Теперь, в вашем примере, то же самое относится и к вычислению функции softmax.Сначала вы должны определить, по какой оси вы хотите вычислить softmax, а затем указать это с помощью аргумента axis.Кроме того, обратите внимание, что softmax по умолчанию применяется к последней оси (т.е. axis=-1), поэтому, если вы хотите вычислить его по последней оси, вам не нужен слой Lambda выше.Просто используйте слой Activation вместо:

from keras.layers import Activation

soft_out = Activation('softmax')(input_tensor)

Обновление 2: Существует также другой способ сделать это, используя слой Softmax:

from keras.layers import Softmax

soft_out = Softmax(axis=desired_axis)(input_tensor)
0 голосов
/ 23 ноября 2018

использовать функциональный API для нескольких выходов.https://keras.io/getting-started/functional-api-guide/

input = Input(...)
...
t = some_tensor
t0 = t0[:,:,0]
t1 = t0[:,:,1]
soft0 = Softmax(output_shape)(t0)
soft1 = Softmax(output_shape)(t1)
outputs = [soft0,soft1]
model = Model(inputs=input, outputs=outputs)
model.compile(...)
model.fit(x_train, [y_train0, ytrain1], epoch = 10, batch_size=32)
...