Я использую 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()