Ошибка при попытке конвертировать модель keras в tf сохраненную_модель. - AttributeError: у объекта 'list' нет атрибута 'dtype' - PullRequest
0 голосов
/ 03 февраля 2020

Я должен служить модели керас в тензорной подаче. Для этого я пытаюсь преобразовать модель keras в формат tf save_model, используя этот скрипт. https://gist.github.com/himanshurawlani/8a017b2a893060d1282d13ea4a8ddefc

from tensorflow.keras.layers import Input
from tensorflow.keras import backend as K
import networks.generator as gen
import tensorflow as tf
K.set_learning_phase(0)

encoder = gen.encoder(3, 224)
encoder.load_weights(f"weights/encoder.h5")
encoder_path = 'model/encoder/1'

print(encoder.outputs)

with tf.keras.backend.get_session() as sess:
tf.saved_model.simple_save(
    sess,
    encoder_path,
    inputs = {'input_image': encoder.input},
    outputs = {t.name: t for t in encoder.outputs}
)

Но я получаю AttributeError: 'list' object has no attribute 'dtype' in ---> 18 outputs = {t.name: t for t in encoder.outputs}

Выход print(encoder.outputs):

[<tf.Tensor 'activation_4/Relu:0' shape=(?, 14, 14, 512) dtype=float32>, <tf.Tensor 'lambda_5/resize/ResizeBilinear:0' shape=(?, 112, 112, 3) dtype=float32>, <tf.Tensor 'lambda_6/resize/ResizeBilinear:0' shape=(?, 56, 56, 3) dtype=float32>, <tf.Tensor 'input_3:0' shape=(?, 224, 224, 3) dtype=float32>]

Для воспроизведения ошибок -

Сетевой модуль - https://github.com/shaoanlu/fewshot-face-translation-GAN/tree/master/networks Веса энкодера - https://drive.google.com/uc?id=1DUMmZGTGKMyEYSKy-w34IDHawVF24rIs

1 Ответ

0 голосов
/ 03 февраля 2020

Пример, которому вы пытались следовать, имеет проблему. Как мы можем прочитать в документации tf.compat.v1.saved_model.simple_save :

outputs: dict отображает имена выходных строк в тензоры. Они добавляются в SignatureDef в качестве выходных данных.

Итак, вы попытались передать значение dict как объект генератора, который был преобразован в список:

[<tf.Tensor 'activation_4/Relu:0' shape=(?, 14, 14, 512) dtype=float32>, <tf.Tensor 'lambda_5/resize/ResizeBilinear:0' shape=(?, 112, 112, 3) dtype=float32>, <tf.Tensor 'lambda_6/resize/ResizeBilinear:0' shape=(?, 56, 56, 3) dtype=float32>, <tf.Tensor 'input_3:0' shape=(?, 224, 224, 3) dtype=float32>]

в * Параметр 1014 *, который ожидает тензор.

Упрощенный пример объекта-генератора, который вы пытались передать:

print(type(x for x in [1,2,3]))

out:

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