Невозможно сохранить модель TensorFlow Keras LSTM в формате SavedModel - PullRequest
0 голосов
/ 06 ноября 2019

Системная информация:

Платформа и распространение ОС (например, Linux Ubuntu 16.04): Windows 10

TensorFlow установлен из (источника или двоичного файла): установлен pip

Версия TensorFlow (используйте команду ниже): v2.0.0-rc2-26-g64c3d382ca 2.0.0

Версия Python: 3.7.1

Ошибка:

Невозможно сохранить модель TensorFlow Keras LSTM в формате SavedModel для экспорта в корзину Google Cloud.

Сообщение об ошибке:

ValueError: Попытка сохранитьфункция b '__inference_lstm_2_layer_call_fn_36083', которая ссылается на символический тензорный тензор ("dropout / mul_1: 0", shape = (None, 1280), dtype = float32), который не является простой константой. Это не поддерживается.

Код:

import tensorflow as tf
import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
import tqdm
import datetime
from sklearn.preprocessing import LabelBinarizer 

model = tf.keras.Sequential([
    tf.keras.layers.Masking(mask_value=0.),
    tf.keras.layers.LSTM(512, dropout=0.5, recurrent_dropout=0.5),
    tf.keras.layers.Dense(256, activation='relu'),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(len(LABELS), activation='softmax')
])

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy', 'top_k_categorical_accuracy'])

test_file = 'C:/.../testlist01.txt'
train_file = 'C:/.../trainlist01.txt'

with open(test_file) as f:
    test_list = [row.strip() for row in list(f)]

with open(train_file) as f:
    train_list = [row.strip() for row in list(f)]
    train_list = [row.split(' ')[0] for row in train_list]


def make_generator(file_list):
    def generator():
        np.random.shuffle(file_list)
        for path in file_list:
            full_path = os.path.join(BASE_PATH, path).replace('.avi', '.npy')

            label = os.path.basename(os.path.dirname(path))
            features = np.load(full_path)

            padded_sequence = np.zeros((SEQUENCE_LENGTH, 1280))
            padded_sequence[0:len(features)] = np.array(features)

            transformed_label = encoder.transform([label])
            yield padded_sequence, transformed_label[0]
    return generator

train_dataset = tf.data.Dataset.from_generator(make_generator(train_list),
                 output_types=(tf.float32, tf.int16),
                 output_shapes=((SEQUENCE_LENGTH, 1280), (len(LABELS))))
train_dataset = train_dataset.batch(16).prefetch(tf.data.experimental.AUTOTUNE)

valid_dataset = tf.data.Dataset.from_generator(make_generator(test_list),
                 output_types=(tf.float32, tf.int16),
                 output_shapes=((SEQUENCE_LENGTH, 1280), (len(LABELS))))
valid_dataset = valid_dataset.batch(16).prefetch(tf.data.experimental.AUTOTUNE)

model.fit(train_dataset, epochs=17, validation_data=valid_dataset)

BASE_DIRECTORY = 'C:\\...\\saved_model\\LSTM\\1\\';
tf.saved_model.save(model, BASE_DIRECTORY)

1 Ответ

0 голосов
/ 06 ноября 2019

Попробуйте сохранить его с помощью API Keras, а не API SavedModel. См. Сохранение и сериализация моделей с помощью Keras: Экспорт в SavedModel .

model.save('path_to_saved_model', save_format='tf')

Это должно сохранить модель в формате SavedModel.

...