preprocess_input () дает разные результаты при вызове с или без tf.data.Dataset.map () - PullRequest
0 голосов
/ 03 мая 2020

Я использую FT 2.1.0, и я строю и обучаю NN, используя tf.data.Dataset для создания входного конвейера. Теперь я хочу развернуть модель и использовать ее, чтобы сделать вывод об одном образце (в данном случае png-изображение). Тем не менее, я заметил, что не могу получить тот же входной тензор для подачи моей модели, когда НЕ использую tf.data.Dataset.map (). Посмотрите код ниже, который обрабатывает входные изображения двумя способами - один с и без tf.data.Dataset.map () - и получите разные результаты. Разница в vgg16.preprocess_input (). как мне ввести те же данные во время вывода?

import os
import numpy as np
from glob import glob
import tensorflow as tf
from tensorflow.keras.applications.vgg16 import VGG16, preprocess_input


def load_image(path):
    img = tf.io.read_file(path)
    img = tf.image.decode_png(img, channels=3)
    img = preprocess_input(img)
    img = tf.image.convert_image_dtype(img, tf.float32)
    return img


def main():
    test_path = '/some_path_to_test_folder'
    num_tests = 10

    temp = tf.zeros((10, 10, 3))
    preprocess_input(temp)

    # (1) input pipeline using tf.data.Dataset:
    test_list_ds = tf.data.Dataset.list_files(os.path.join(test_path, 'images/*.png'), shuffle=False)
    ds1 = test_list_ds.map(load_image)

    # (2) inference-like pipeline:
    test_fnames = sorted(glob(os.path.join(test_path, 'images/*.png')))
    test_data = []
    for k, img_fname in enumerate(test_fnames[:num_tests]):
        # load image:
        img2 = load_image(img_fname)
        test_data.append((img2, img_fname))

    # (3) compare:
    for i, X in enumerate(ds1.take(num_tests)):

        X2 = test_data[i]
        img1 = X
        img2, _ = X2
        img1 = img1.numpy()

        # compare:
        imgs_equal = np.allclose(img1, np.expand_dims(img2, axis=0))
        print(imgs_equal)

if __name__ == '__main__':
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...