Запустить прогноз из сохраненной модели в tensorflow 2.0

У меня есть сохраненная модель (каталог с model.pd и переменными), и я хотел запустить прогнозы для фрейма данных pandas.

Я безуспешно пробовал несколько способов сделать это:

Попытка 1. Восстановите оценщик из сохраненной модели

estimator = tf.estimator.LinearClassifier(
    feature_columns=create_feature_cols(),
    model_dir=path,
    warm_start_from=path)

Где путь — это каталог, в котором есть папка model.pd и переменные. у меня ошибка

ValueError: Tensor linear/linear_model/dummy_feature1/weights is not found in 
gs://bucket/Trainer/output/2013/20191008T170504.583379-63adee0eaee0/serving_model_dir/export/1570554483/variables/variables 
checkpoint {'linear/linear_model/dummy_feature1/weights': [1, 1], 'linear/linear_model/dummy_feature2/weights': [1, 1]
}

Попытка 2. Запустите прогнозирование непосредственно из сохраненной модели, запустив

imported = tf.saved_model.load(path)  # path is the directory that has a `model.pd` and variables folder
imported.signatures["predict"](example)

Но аргумент не был успешно передан - похоже, функция ищет tf.example, и я не знаю, как преобразовать фрейм данных в tf.example. Моя попытка конвертации приведена ниже, но я получил ошибку, что df[f] не является тензором:

for f in features:
    example.features.feature[f].float_list.value.extend(df[f])

Я видел решения на StackOverflow, но все они относятся к tensorflow 1.14. Очень признателен, если кто-то может помочь с tensorflow 2.0.


person figlio perduto    schedule 09.10.2019    source источник


Ответы (1)


Учитывая, что ваша сохраненная модель представлена ​​​​таким образом:

my_model
assets  saved_model.pb  variables

Вы можете загрузить сохраненную модель, используя:

new_model = tf.keras.models.load_model('saved_model/my_model')

# Check its architecture
new_model.summary()

Чтобы выполнить прогнозирование в DataFrame, вам необходимо:

  1. Оберните скаляры в список, чтобы иметь пакетное измерение (модели обрабатывают только пакеты данных, а не отдельные выборки).
  2. Позвоните convert_to_tensor по каждой функции

Пример 1. Если у вас есть значения для первой тестовой строки как

sample = {
    'Type': 'Cat',
    'Age': 3,
    'Breed1': 'Tabby',
    'Gender': 'Male',
    'Color1': 'Black',
    'Color2': 'White',
    'MaturitySize': 'Small',
    'FurLength': 'Short',
    'Vaccinated': 'No',
    'Sterilized': 'No',
    'Health': 'Healthy',
    'Fee': 100,
    'PhotoAmt': 2,
}

input_dict = {name: tf.convert_to_tensor([value]) for name, value in sample.items()}
predictions = new_model.predict(input_dict)
prob = tf.nn.sigmoid(predictions[0])

print(
    "This particular pet had a %.1f percent probability "
    "of getting adopted." % (100 * prob)
)

Пример 2. Или, если у вас есть несколько строк в том же порядке, что и данные поезда.

predict_dataset = tf.convert_to_tensor([
    [5.1, 3.3, 1.7, 0.5,],
    [5.9, 3.0, 4.2, 1.5,],
    [6.9, 3.1, 5.4, 2.1]
])

# training=False is needed only if there are layers with different
# behavior during training versus inference (e.g. Dropout).
predictions = new_model(predict_dataset, training=False)

for i, logits in enumerate(predictions):
  class_idx = tf.argmax(logits).numpy()
  p = tf.nn.softmax(logits)[class_idx]
  name = class_names[class_idx]
  print("Example {} prediction: {} ({:4.1f}%)".format(i, name, 100*p))
person iamarchisha    schedule 26.03.2021