Аккуратный способ передать список произвольной длины на пользовательский слой - PullRequest
0 голосов
/ 26 января 2019

Мне нужно построить специальный тип нейронной сети в Керасе, который в некоторой точке слоя принимает многомерный массив с N строками и 5 элементами в каждом ряду.Давайте назовем этот многомерный массив как bboxes . bboxes выглядит так:

[[  0, x1, x2, y1, y2] # row 0
 ...
 [  0, x1, x2, y1, y2]] # row N

Итак, как вы видите, количество строк не определено.Все, что мы знаем, это то, что это массив, полный строк, где каждая строка содержит 5 целых чисел.

Следовательно, я мог бы создать следующий вход для bboxes :

from keras.layers import Input

bboxes = Input(shape=(None, 5), dtype='int32', name='bboxes')

Проблема:

Я должен передать bboxes на пользовательский слой с именем MyLayer , который в некоторой строке метода вызова необходимо получитьколичество строк в bboxes :

from keras.engine.topology import Layer

class MyLayer(Layer):
    def __init__(self):
        ...
    ...

    def call(x):
        ...
        N = x.shape[0]  # Get amount of rows (N) of bboxes
        ...
    ...

Но, как вы, возможно, уже знаете, у Keras есть определенный тип архитектуры, который сначала определяется пустыми объектами фигур.

Фактическое целочисленное значение N передается после компиляции модели.Поэтому вместо целого числа N возвращается ?, который по сути является пустым тензором ...

Но переменная N = x.shape[0] в виде целого числа важна для правильной работы MyLayer.Я мог бы сделать что-то вроде range(0, N), которое вернет следующую ошибку:

TypeError: int должен вернуть объект int

Я очень запуталсяо функциональном API Keras, когда дело доходит до таких проблем.Есть ли какой-нибудь аккуратный способ передать массив bboxes с произвольно определенным количеством строк (N) в MyLayer, который позже будет использовать фактическое значение N?

Короче , как мне передать ввод с формой (N, 5) слою, чтобы слой знал точное число N?

Я был бы очень признателен, если бы был какой-либо способ решения этой проблемы.Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...