Слой активации скрывает 2 атрибута от тензора - PullRequest
0 голосов
/ 27 мая 2019

Версия TensorFlow: tf 1.13.1
Версия Keras: 2.2.4
Версия Python: 3.7

После отладки я вижу, что после добавления слоев активации на различныхСегменты моей модели, слой удаляет 2 атрибута _keras_history и _keras_shape.

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

код:

x = keras.activations.relu(x)
ff_layer2 = keras.layers.DepthwiseConv2D(128, strides=(1, 1), depth_multiplier=1, padding='same')(x)
classifier = keras.activations.softmax(ff_layer2)

x = keras.activations.relu(x)
ff_layer2 = keras.layers.DepthwiseConv2D(128, strides=(1, 1), depth_multiplier=1, padding='same')(x)
classifier = keras.activations.softmax(ff_layer2)

Ошибка:

File "/home/perennial_qube/.conda/envs/fast-scnn/lib/python3.7/site-packages/keras/engine/network.py", line 188, in _init_graph_network
    'Found: ' + str(x))
ValueError: Output tensors to a Model must be the output of a Keras `Layer` (thus holding past layer metadata). Found: Tensor("truediv:0", shape=(?, 2048, 1024, 128), dtype=float32)

1 Ответ

0 голосов
/ 27 мая 2019

Функции в keras.activations.* являются функциями активации , а не слоями Keras. Архитектура моделей в Керасе должна строиться только слоями. Поэтому вам нужно использовать их эквивалентные слои активации :

from keras.layers import Softmax, ReLU

x = ReLU()(x)
# ...
classifier = Softmax()(ff_layer2)

В качестве альтернативы, вы можете использовать аргумент activation слоев и напрямую передать имя или функцию активации. Например:

... = DepthwiseConv2D(..., activation='softmax')
# or:
... = DepthwiseConv2D(..., activation=keras.activations.softmax)

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

from keras.layers import Activation

# ...
classifier = Activation('softmax')(ff_layer2)

Первое решение по сравнению с двумя другими имеет то преимущество, что вы можете легко изменять поведение функции активации, предоставляя пользовательские аргументы. Например, по умолчанию активация softmax вычисляется по последней оси, но при необходимости вы можете изменить это следующим образом:

from keras.layers import Softmax

classifier = Softmax(axis=my_desired_axis)(ff_layer2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...