Почему сохраненный tf.dataset имеет длину, но не содержит содержимого?Python

Программы на Python
Ответить
Anonymous
 Почему сохраненный tf.dataset имеет длину, но не содержит содержимого?

Сообщение Anonymous »

это мой первый вопрос. Пожалуйста, будьте любезны. Если я разместил сообщение не в той категории, поправьте меня.
Следующая проблема сводит меня с ума:
Грубо говоря: я загружаю набор данных (здесь: MNIST) из локального хранилища. структура папок с image_dataset_from_directory. Теперь я хочу сохранить весь набор данных как tf.dataset. Я загружаю этот набор данных снова, чтобы разделить его на пары классов цифр. Сначала я проверяю это, показывая 10 случайных примеров с их метками. Это работает по желанию. Затем я использую метод filter() для создания наборов подданных, каждый из которых имеет два класса цифр (например, 0 и 1). У меня есть длина этого соответствующего частичного набора данных, отображаемая с помощью len(list(filtered_ds))): она подходит. Затем я сохраняю этот набор данных и загружаю его в свою программу. Длина снова в порядке, но когда я хочу отображать изображения с их метками, как в полном наборе данных, список изображений или меток пуст. Я не понимаю, в чем разница между этим и сохранением/открытием всего набора данных... Буду рад услышать любые подходы/идеи. Вот мой код в качестве минимального примера (не исполняемый):

Код: Выделить всё

dataset = "MNIST"

train_ds = tf.keras.utils.image_dataset_from_directory(
train_dir, #specified in my programm
label_mode='int',
color_mode = color_mode,
image_size = image_size,
validation_split = None,
subset = None
)

class_names = train_ds.class_names
class_names.sort()

train_ds = train_ds.map(lambda x, y: (x/255.0, y))

train_path = #path for saving entire ds

tf.data.Dataset.save(train_ds.unbatch(), os.path.join(train_path, "allclass_ds"))
train_ds = tf.data.Dataset.load(os.path.join(train_path, "allclass_ds"))

#############################
#check if loaded dataset is ok -> works well

print(len(train_ds))

arr_img = []
arr_lab = []

for images, labels in train_ds:  # only take first element of dataset
arr_img.append(images.numpy())
arr_lab.append(labels.numpy())

for i in range(10):
random_value = random.randint(0, len(train_ds)-1)
img = arr_img[random_value][:,:,0]*255
plt.imshow(img)
plt.show()
lab = np.argmax(arr_lab[random_value])
print(lab)

#############################

#now generate pairs:
while i < len(class_names)-1:

filtered_ds = data_train.filter(lambda x, y: y == i or y == i+1)
print("len: ", len(list(filtered_ds))) # works well
pairs_ds.append(filtered_ds) #list of pair ds
pairs_names.append("class[" + str(class_names[i])+ "," + str(class_names[i+1]) + "]_ds") #list of names of pair ds
tf.data.Dataset.save(data, path) #path = path for saving specific pais ds with name from pairs_names

############################

#load and check

pair_ds = tf.data.Dataset.load(os.path.join(test_path, "class[0,1]_ds"))

print(pair_ds) #ok
print(len(pair_ds)) #ok

#check if content is ok

arr_img = []
arr_lab = []

for image, label in pair_ds:  # only take first element of dataset
print(image)
print(label)
arr_img.append(images.numpy()) #ERROR: list has no elements! Cannot be displayed as the entire ds above ...
arr_lab.append(labels.numpy()) #ERROR: list has no elements! see above

Пожалуйста, помогите мне :) Если вам нужна дополнительная информация, не стесняйтесь спрашивать.
Заранее спасибо!
М.
см. мой код выше

Подробнее здесь: https://stackoverflow.com/questions/793 ... no-content
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»