Tensorflow 2.2, tf.nn.conv1d в лямбда-слое

#python #tensorflow

#python #tensorflow

Вопрос:

Я хотел бы выполнить свертку в лямбда-слое, но я никак не могу заставить его работать.

     kernel = [1.0,2.0,1.0]  # weighted moving average
    x = [   # history_size=5, num_features=10
      [1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0],
      [2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0],
      [3.0,3.0,3.0,3.0,3.0,3.0,3.0,3.0,3.0,3.0],
      [4.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0],
      [5.0,5.0,5.0,5.0,5.0,5.0,5.0,5.0,5.0,5.0],
    ]
    k = tf.constant(kernel, dtype=tf.float32)
    y = tf.nn.conv1d(x, k, stride=1, padding='SAME')
  

Я понимаю, что в приведенном выше примере размеры неверны, но это фактический формат моих данных. Обучающие выборки имеют форму (history_size, num_features) , и ядро должно свертываться по history_size, каждая функция отдельно. Буду признателен за любую помощь. Я не могу найти пример того, как выполнить tf.nn.conv1d вручную.

Ответ №1:

Вы могли бы использовать numpy.convolve() для этого.

 import numpy as np

kernel = [1.0,2.0,1.0]  # weighted moving average
x = [   # history_size=5, num_features=10
  [1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0],
  [2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0,2.0],
  [3.0,3.0,3.0,3.0,3.0,3.0,3.0,3.0,3.0,3.0],
  [4.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0],
  [5.0,5.0,5.0,5.0,5.0,5.0,5.0,5.0,5.0,5.0],
]

output = []
for i in range(len(x)):
    output.append(list(np.convolve(x[i], kernel, mode = 'same')))
output

'''
[[3.0, 4.0, 4.0, 4.0, 4.0, 4.0, 4.0, 4.0, 4.0, 3.0],
 [6.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 6.0],
 [9.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 9.0],
 [12.0, 16.0, 16.0, 16.0, 16.0, 16.0, 16.0, 16.0, 16.0, 12.0],
 [15.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 15.0]]
'''
  

Вы могли бы попробовать изменить mode то, что вам больше подходит, в соответствии с документацией.

Комментарии:

1. К сожалению, я думаю, что не смогу использовать это в лямбда-слое Tensorflow

2. Если бы вы могли поделиться небольшим фрагментом вашей tf-модели для проверки, тогда можно было бы оказать дополнительную помощь.