Data API: ошибка значения: аргумент `y` не поддерживается при использовании dataset в качестве входных данных

#python #tensorflow #tensorflow-datasets

#python #tensorflow #tensorflow-datasets

Вопрос:

У меня есть 45000 изображений размером 224 * 224, сохраненных в виде массива numpy. Этот массив, вызываемый source_arr , имеет форму 45000,224,224 и он умещается в памяти.

Я разделяю этот массив на обучающий, тестирующий и подтверждающий массив и предварительно обрабатываю (нормализуюи преобразую оттенки серого в 3 канала RGB) их с помощью tf.data API.

Я написал функцию предварительной обработки, такую как:

 def pre_process(x):
     x_norm = (x - mean_Rot_MIP) / Var_Rot_MIP
     # Stacking along the last dimension to avoid having to move channel axis
     x_norm_3ch = tf.stack((x_norm, x_norm, x_norm), axis=-1)
     return x_norm_3ch
  

X_train_cases_idx.idx содержит индекс изображений из source_arr , которые являются частью обучающих данных.

Я прочитал соответствующие обучающие изображения из source_arr в объекте dataset, например:

 X_train = tf.data.Dataset.from_tensor_slices([source_arr[i] for i in X_train_cases_idx.idx])
  

И затем я применяю функцию pre_process к обучающим изображениям, таким как
X_train = X_train.map(pre_process)

Это проблема многоклассовой классификации, поэтому я преобразую переменную метки y в 1 горячую кодировку, например:

 lb = LabelBinarizer()
y_train = lb.fit_transform(y_train)
  

Длина X_train и y_train равна 36000

Я выполняю модель.подогнать операцию к RESNET50, например:

 H = model.fit(X_train, y_train, batch_size = BS, validation_data=(X_val, y_val), epochs = NUM_EPOCHS, shuffle =False)
  

и я получаю сообщение об ошибке:

 ValueError: `y` argument is not supported when using dataset as input.
  

Я понимаю, что мне нужно передать X_train и y_train оба в качестве кортежа в объекте Dataset.
Как я могу это сделать?

Ответ №1:

у вас есть source_arr и y_train в виде массива numpy; поэтому вы можете сделать :

 data_set = tf.data.Dataset.from_tensor_slices(  (source_arr , y_train) )
  

если у вас есть source_arr и y_train в качестве tf.dataset :

 data_set = tf.data.Dataset.zip( (source_arr , y_train) )
  

Комментарии:

1. Я попробовал 1-й вариант, поскольку оба source_arr и y_train являются np-массивом. Но я получаю ошибку: from_tensor_slices() takes 1 positional argument but 2 were given

2. даже с круглыми скобками кортежа? ( ( source_arr , y_train ) )

3. Я преобразовал оба source_arr и y_train в тензоры и использовал 2-й вариант. Это сработало. Спасибо!

4. У меня это тоже работает. Я попытался передать другой набор данных с изображениями (так что x и y — это изображения) вместо меток (y), но сначала пришлось их заархивировать! итак, второй код сработал, поскольку они у меня уже были в виде наборов данных.