Среднее значение тензорного потока по глубине

#python #tensorflow #machine-learning #keras #neural-network

Вопрос:

Я работаю с последовательностями векторов в качестве входных данных для NN в tensorflow, и я хотел бы выполнить среднее объединение по глубине ввода.

Я попытался использовать следующий лямбда-слой:

 depth_pool = keras.layers.Lambda(
    lambda X: tf.nn.avg_pool1d(X,
                             ksize=(1, 1, 3),
                             strides=(1, 1, 3),
                             padding="VALID"))
 

Однако я получаю сообщение об ошибке:

UnimplementedError: Непрост. объединение еще не поддерживается.

Есть ли способ достичь желаемого результата?

Большое вам спасибо за вашу помощь

Ответ №1:

Если ваши входные данные имеют эти размерности: (None, timestamps, features) вы можете просто изменить глубину с помощью других размерностей, применить стандартное объединение, а затем вернуться к исходным размерностям.

Приведу пример… Если ваша сеть принимает входную форму (None, 20, 99) , вы можете просто сделать следующее, чтобы получить пул глубины:

 inp = Input((20,99))
depth_pool = Permute((2,1))(inp)
depth_pool = AveragePooling1D(3)(depth_pool)
depth_pool = Permute((2,1))(depth_pool)

m = Model(inp, depth_pool)
m.summary()
 

Резюме:

 _________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_4 (InputLayer)         [(None, 20, 99)]          0         
_________________________________________________________________
permute_4 (Permute)          (None, 99, 20)            0         
_________________________________________________________________
average_pooling1d_3 (Average (None, 33, 20)            0         
_________________________________________________________________
permute_5 (Permute)          (None, 20, 33)            0         
=================================================================
 

Вывод имеет форму (None, 20, 33)

Если ваши входные данные имеют эти размерности: (None, features, timestamps) вы можете просто установить data_format='channels_first' в своих слоях

 inp = Input((20,99))
depth_pool = AveragePooling1D(3, data_format='channels_first')(inp)

m = Model(inp, depth_pool)
m.summary()
 

Резюме:

 _________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_9 (InputLayer)         [(None, 20, 99)]          0         
_________________________________________________________________
average_pooling1d_7 (Average (None, 20, 33)            0         
=================================================================
 

Вывод имеет форму (None, 20, 33)