Как разработать слой, который работает с произвольным размером ввода - PullRequest
1 голос
/ 07 октября 2019

Я пытаюсь разработать слой в Keras, который работает с 3D-тензорами. Чтобы сделать его более гибким, я бы хотел как можно больше отложить код, основанный на точной форме ввода.

Мой слой переопределяет 5 методов:

from tensorflow.python.keras.layers import Layer

class MyLayer(Layer):
    def __init__(self, **kwargs):
        pass

    def build(self, input_shape):
        pass

    def call(self, inputs, verbose=False):
        second_dim = K.int_shape(inputs)[-2]
        # Do something with the second_dim

    def compute_output_shape(self, input_shape):
        pass

    def get_config(self):
        pass

И яиспользуя этот слой следующим образом:

input = Input(batch_shape=(None, None, 128), name='input')
x = MyLayer(name='my_layer')(input)
model = Model(input, x)

Но я сталкиваюсь с ошибкой, поскольку second_dim равен None. Как я могу разработать слой, который основан на размерах входных данных, но это нормально, если он предоставляется фактическими данными, а не входным слоем?

1 Ответ

0 голосов
/ 24 октября 2019

В итоге я задал один и тот же вопрос по-разному, и у меня получился идеальный ответ:

Как правильно манипулировать формой тензора, когда в нем есть неизвестные элементы?

Суть в том, что не следует обращаться непосредственно к размерам. Используйте их по ссылке, а не по значению. Поэтому не используйте K.int_shape, а вместо этого используйте K.shape. И используйте операции Keras, чтобы составить и придумать новую форму:

shape = K.shape(x)
newShape = K.concatenate([
                             shape[0:1], 
                             shape[1:2] * shape[2:3],
                             shape[3:4]
                         ])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...