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