Keras Custom Layer с расширенными вычислениями - PullRequest
0 голосов
/ 18 февраля 2019

Я хочу написать несколько пользовательских Keras слоев и выполнить некоторые сложные вычисления в слое, например, с Numpy, Scikit, OpenCV ...

Я знаю, что в keras.backend есть некоторые математические функцииэто может работать с тензорами, но мне нужны некоторые более продвинутые функции.

Однако я понятия не имею, как правильно это реализовать, я получаю сообщение об ошибке:
You must feed a value for placeholder tensor 'input_1' with dtype float and shape [...]

Вот мой пользовательский слой:

class MyCustomLayer(Layer):
    def __init__(self, **kwargs):
        super(MyCustomLayer, self).__init__(**kwargs)

    def call(self, inputs):
        """
        How to implement this correctly in Keras?
        """
        nparray = K.eval(inputs)  # <-- does not work
        # do some calculations here with nparray
        # for example with Numpy, Scipy, Scikit, OpenCV...
        result = K.variable(nparray, dtype='float32')
        return result

    def compute_output_shape(self, input_shape):
        output_shape = tuple([input_shape[0], 256, input_shape[3]])
        return output_shape  # (batch, 256, channels)

Ошибка появляется в этой фиктивной модели:

inputs = Input(shape=(96, 96, 3))
x = MyCustomLayer()(inputs)
x = Flatten()(x)
x = Activation("relu")(x)
x = Dense(1)(x)    
predictions = Activation("sigmoid")(x)
model = Model(inputs=inputs, outputs=predictions)

Спасибо за все подсказки ...

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Я думаю, что этот своего рода процесс должен применяться до модели, потому что процесс не содержит переменных, поэтому его нельзя оптимизировать.

K.eval (входные данные) не работает, потому что вы пытаетесь оценить заполнительне переменные заполнители не имеют значений для оценки.если вы хотите получить значения, вы должны передать их или вы можете составить список из тензоров один за другим с помощью tf.unstack ()

nparray = tf.unstack(tf.unstack(tf.unstack(inputs,96,0),96,0),3,0)

ваша функция вызова неверна, потому что возвращает переменную, вы должны вернуть константу:

result = K.constant(nparray, dtype='float32')
return result
0 голосов
/ 18 февраля 2019

TD; LR Не следует смешивать Numpy внутри слоев Keras. Keras использует Tensorflow внизу, потому что он должен отслеживать все вычисления, чтобы иметь возможность вычислять градиенты в обратной фазе.

Если вы покопаетесь в Tensorflow, вы увидите, что он почти охватывает все функциональные возможности Numpy (или даже расширяет его), и, если я правильно помню, к функциональности Tensorflow можно получить доступ через бэкэнд Keras (K).

Какие предварительные расчеты / функции вам нужны?

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