Как добавить постоянный тензор в керасе?

1

То, что я пытаюсь сделать, - добавить постоянный тензор к выходу из сети:

inputs = Input(shape=(config.N_FRAMES_IN_SEQUENCE, config.IMAGE_H, config.IMAGE_W, config.N_CHANNELS))
cnn = VGG16(include_top=False, weights='imagenet', input_shape=(config.IMAGE_H, config.IMAGE_W, config.N_CHANNELS))
x = TimeDistributed(cnn)(inputs)
x = TimeDistributed(Flatten())(x)
x = LSTM(256)(x)
x = Dense(config.N_LANDMARKS * 2, activation='linear')(x)

mean_landmarks = np.array(config.MEAN_LANDMARKS, np.float32)
mean_landmarks = mean_landmarks.flatten()
mean_landmarks_tf = tf.convert_to_tensor(mean_landmarks)
x = x + mean_landmarks_tf

model = Model(inputs=inputs, outputs=x)
optimizer = Adadelta()
model.compile(optimizer=optimizer, loss='mae')

Но я получаю ошибку:

ValueError: Output tensors to a Model must be the output of a Keras 'Layer' (thus holding past layer metadata). Found: Tensor("add:0", shape=(?, 136), dtype=float32)

Это тривиально в тензорном потоке, но как это сделать в Keras?

Теги:
tensorflow
keras
deep-learning

2 ответа

0

Кажется, это можно сделать с помощью слоя Lamda:

from keras.layers import Lambda

def add_mean_landmarks(x):
    mean_landmarks = np.array(config.MEAN_LANDMARKS, np.float32)
    mean_landmarks = mean_landmarks.flatten()
    mean_landmarks_tf = tf.convert_to_tensor(mean_landmarks)
    x = x + mean_landmarks_tf
    return x


x = Lambda(add_mean_landmarks)(x)
  • 0
    Просто наперед: лямбда-слои могут привести к проблемам, когда модель сериализуется и загружается с другой версией Python. Пользовательские слои Keras должны быть предпочтительными. Смотрите: github.com/keras-team/keras/issues/9595
0

В дополнение к вашему собственному ответу, я бы сильно одобрил собственную реализацию добавления, например, Keras.layers.Add предоставляет Keras.layers.Add.

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

Правильный способ сделать это с Keras.layers.Add будет просто делать

x = keras.layers.Add()([x, add_mean_landmarks])
  • 0
    Это не работает, пожалуйста, приведите полный пример.
  • 0
    Какое конкретное сообщение об ошибке?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню