#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), но сначала пришлось их заархивировать! итак, второй код сработал, поскольку они у меня уже были в виде наборов данных.