Проверка чтения-Набор данных занимает неопределенно много времени

#python #tensorflow #deep-learning #tf.keras

Вопрос:

У меня есть пользовательский набор данных TensorFlow , и моя проблема в том, что мой набор данных проверки загружается бесконечно, если я попытаюсь получить доступ к первому элементу.

Таким next(iter(train_ds.take(1))) образом, возвращает первые тренировочные данные, как и ожидалось, но next(iter(val_ds.take(1))) загружается бесконечно.

Мой Набор Данных Содержит несколько Триплетов Пути К Изображению ( <ZipDataset shapes: ((), (), ()), types: (tf.string, tf.string, tf.string)> ).

Моя предварительная обработка выглядит примерно так:

 buffer_size = 1024
batch_size = 32

def prep_image(filename, img_shape=(144,144), channels=3, dtype=tf.float32):
    image_string = tf.io.read_file(filename)
    image = tf.image.decode_jpeg(image_string, channels=channels)
    image = tf.image.convert_image_dtype(image, dtype)
    image = tf.image.resize(image, img_shape)
    return image

def preprocess_triplet(a, p, n):
    return prep_image(a), prep_image(p), prep_image(n)

dataset = dataset.shuffle(buffer_size)
dataset = dataset.map(preprocess_triplet)

# splitting the ds
split = .8
n_train_items = round(len(dataset) * split) #r(514551 * 0.8) = 411641

train_dataset = dataset.take(n_train_items)
val_dataset = dataset.skip(n_train_items)

train_dataset = train_dataset.batch(batch_size, drop_remainder=False)
train_dataset = train_dataset.prefetch(tf.data.AUTOTUNE) #.prefetch(tf.data.AUTOTUNE)

val_dataset = val_dataset.batch(batch_size, drop_remainder=False)
val_dataset = val_dataset.prefetch(tf.data.AUTOTUNE)
 

Когда я запускаю next(iter(train_dataset.take(1))) , я получаю свое изображение-Тройки в виде кортежа массивов (как и ожидалось). Когда я пытаюсь сделать то же самое с набором данных проверки, он выполняется вечно type(next(iter(val_dataset.take(1)))) .

Подробные sanity Проверки, Содержащие Версии

python next(iter(dataset))

 (<tf.Tensor: shape=(), dtype=string, numpy=b'F:\workspace\datasets\own_256\hm\pics\bf\67\bf67f3922e8245954943f1479961d932d56ef0ad.jpg'>,
 <tf.Tensor: shape=(), dtype=string, numpy=b'F:\workspace\datasets\own_256\hm\pics\4b\03\4b03c337d013500930b71f9999766656f5893946.jpg'>,
 <tf.Tensor: shape=(), dtype=string, numpy=b'F:\workspace\datasets\own_256\asos\pics\products\asos-design-petite-halter-midi-beach-dress-in-double-gauze-in-sage-green\24233155-2.jpg'>)
 

После загрузки набора данных и перетасовки

 dataset = dataset.shuffle(buffer_size)
dataset = dataset.map(preprocess_triplet)
 

я просто попытался «загрузить» каждую запись, чтобы проверить, можно ли читать изображения:

 for img in dataset:
    a, b, c = img
    assert a.shape == (144, 144, 3) and b.shape == (144, 144, 3) and c.shape == (144, 144, 3)
 

Это работает без каких-либо проблем.

После этого я попытался разделить набор данных на проверку и тестирование

 split = .8
n_train_items = round(len(dataset) * split) #r(514551 * 0.8) = 411641

train_dataset = dataset.take(n_train_items)
val_dataset = dataset.skip(n_train_items)
 

To test if i can access the Items i just called the first item of the batch per Val/Train DS:

 next(iter(train_dataset))
 
 $(<tf.Tensor: shape=(144, 144, 3), dtype=float32, numpy=
 array(..., dtype=float32)>,
 <tf.Tensor: shape=(144, 144, 3), dtype=float32, numpy=
 array(..., dtype=float32)>,
 <tf.Tensor: shape=(144, 144, 3), dtype=float32, numpy=
 array(..., dtype=float32)>)
 

Also tried to iterate over all Train Data and it worked

 print("t_items")
test_n_items = sum([sum([1 for item in a])for a, p, n in train_dataset])
print(test_n_items == n_train_items)
$True
 

But i cant even get the first item of Validation Dataset

 next(iter(val_dataset))
 

Sadly the Second next(iter(val_dataset)) runs indefinitely.

Some Info

 len(dataset)
$ 514551
len(train_dataset)
$411641
len(val_dataset)
$len(val_dataset)
len(dataset) == len(train_dataset)   len(val_dataset)
$True
 

Edit 1:

The Problem is withing prep_image , when i just return the Filename without opening the Data everything works as expected:

 def prep_image(filename, img_shape=(144,144), channels=3, dtype=tf.float32):
    return filename
#    image_string = tf.io.read_file(filename)
#    image = tf.image.decode_jpeg(image_string, channels=channels)
#    image = tf.image.convert_image_dtype(image, dtype)
#    image = tf.image.resize(image, img_shape)
#    return image
 

Just reading the File:

 def prep_image(filename, img_shape=(144,144), channels=3, dtype=tf.float32):
    return tf.io.read_file(filename)
 

already produces the error of waiting for ever on Val-Dataset (Train still works).

Edit 2:

Simple Code to Reproduce the Issue:
https://colab.research.google.com/drive/1w5RQDp6W3Zyu4p1kEBRlHT2Vl9zvxVOk?usp=sharing

Edit 3:

Loading the first Item within the Training-Dataset (from the example of ´Edit 2 takes 0.6 ms and loading the first item of the Validation Dataset takes 31.09 Minutes`