Тензорный поток: tf.strings.split () - PullRequest
1 голос
/ 27 мая 2020

Я новичок в Python и AI. Я пытаюсь создать AI hello world.

Но у меня вопрос по коду. Путь: «C: \ ABC \ AAC \ data \ as001.jpg» || "C: \ ABC \ AAC \ data \ wb001.jpg"

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import os
import pathlib
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D
print(tf.__version__)
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
SIZE = 250
CLASS_NAMES = ['Asparagus','White Bread']
data_dir = pathlib.Path().home().joinpath('Desktop', 'tmp', 'data')
CLASS_NAMES = np.array(['White Bread','Asaparagus'])

list_ds = tf.data.Dataset.list_files(str(data_dir/'*'))


def get_label(path):
    parts = tf.strings.split(path, os.path.sep)
    # 1. print(parts[-1])
    return parts[-1]

def decode_img(img):
    img = tf.image.decode_jpeg(img, channels=3)
    img = tf.image.convert_image_dtype(img, tf.float32)
    img = tf.image.resize(img, [SIZE, SIZE])
    return tf.reshape(img, [-1, 250, 250, 3])

def process(path):
    label = get_label(path)
    img =  tf.io.read_file(path)
    img = decode_img(img)
    return img, label

labeled_ds = list_ds.map(process)
for image, label in labeled_ds:
    #2. print(label)

model = Sequential([
    Conv2D(16, (3,3), padding='same', activation='relu', input_shape=(SIZE, SIZE, 3)),
    MaxPooling2D(2,2),
    Dropout(0.2),
    Conv2D(32, (3,3), padding='same', activation='relu'),
    MaxPooling2D(2,2),
    Conv2D(64, (3,3), padding='same', activation='relu'),
    MaxPooling2D(2,2),
    Dropout(0.2),
    Flatten(),
    Dense(2, activation='softmax')
])

model.compile(optimizer='adam',
            loss='sparse_categorical_crossentropy',
            metrics=['accuracy'])

history = model.fit(labeled_ds, epochs = 5, steps_per_epoch = 2)

Я пытаюсь понять, почему Print # 1 печатает Tensor ("strided_slice: 0", shape = (), dtype = string), но Print # 2 печатает фактическое значение tf.Tensor (b'as001.jpg ', shape = (), dtype = string)

Кроме того, я пытаюсь сопоставить значения (wb0 с 0 и as0 до 1) в функции процесса, но я не могу извлечь значение из части [-1].

Что я делаю не так?

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 27 мая 2020

Краткая версия: используйте tf.print вместо print.

Длинная версия: Aha - print в tensorflow. Во-первых, обратите внимание, что есть также tf.print. Разница между ними в том, что print не включается в график тензорного потока при его построении, а tf.print входит. Таким образом, если вы заключите свой get_label в декоратор @tf.function, print (#1. print) будет печататься только один раз, во время построения графика. В tf.Tensor пока нет данных, поэтому он просто печатает тип. Поскольку вы не заключили свою функцию в @tf.function, ваша функция выполняется в режиме ожидания. Выполняя tf.data.Dataset "конвейеры" (.map, .take, ...) с нетерпением, вы (концептуально) каждый раз строите граф, таким образом вы каждый раз печатаете тип пустого тензора.

Второй отпечаток (#2. print) будет печататься каждый раз, потому что вы выполняете это в режиме ожидания, и когда вы заполняете свои tf.Tensor фактическими данными через .map(process), вы можете видеть загруженные данные. Чтобы вывести тензор с номером #1 при выполнении вместо времени построения, используйте tf.print вместо print.

...