Tensorflow: лучший способ создания обучающих данных с плавающей точкой в качестве метки

#image #tensorflow

#изображение #tensorflow

Вопрос:

Я хочу использовать tensorflow версии 2.4.0-dev20201009 в python 3.7. Мой набор данных находится во вложенной папке «data Images». Метка изображения представляет собой число с плавающей точкой от 1 до 5 и может считываться из allTestData.csv из подпапки «data».

Каков наилучший способ считывания данных с разделением проверки на 30 процентов? До сих пор я хотел использовать tf.keras.preprocessing.image_dataset_from_directory, но это не помогает мне корректно корректировать метки, так как все мои изображения находятся в одной папке и не имеют одноразовых кодированных векторов в качестве меток. Как бы вы это сделали в tensorflow?

Для полноты картины я планировал использовать

 def create_model():
  model = keras.Sequential()
  model.add(MobileNetV2(input_shape=(224, 224, 3), include_top=False))
  model.trainable = True
  model.add(layers.GlobalAveragePooling2D())
  model.add(layers.Dense(1024, activation="relu"))
  model.add(layers.Dense(1, activation="softmax"))

  model.compile(optimizer='adam',
                loss=tf.losses.mean_squared_error,
                metrics=[tf.metrics.SparseCategoricalAccuracy()])

  model.summary()
  return model
  

для обучения модели. Вопрос только в том, как читать обучающие данные?

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

1. вы взглянули на flow_from_dataframe ?

2. Я посмотрел, не похоже, что вы можете написать что-то вроде «label = float». Может быть, мне следует просто написать функцию, которая считывает метку как число с плавающей точкой

3. Вы всегда можете использовать tf.cast функцию для преобразования dtype тензора. Я рекомендую использовать tf.data.Dataset для загрузки набора данных.

Ответ №1:

Я отвечу на свой собственный вопрос. Лучшим способом было написать ручную функцию, которая считывает метки и изображения. Предположим, что изображения находятся в «data Images», а метки находятся в .txt-файле, а метки находятся в .txt-файле в ‘datatrain_test_filesAll_labels.txt «. Тогда следующие два метода выполнят эту работу:

 def loadImages(IMG_SIZE):
  path = os.path.join(os.getcwd(), 'data\Images')
  training_data=[]
  labelMap = getLabelMap()
  for img in os.listdir(path):
    out_array = np.zeros((350,350, 3), np.float32) #350x350 is the pixel size of the images
    try:
     img_array = cv2.imread(os.path.join(path, img))
     img_array=img_array.astype('float32')
     out_array = cv2.normalize(img_array, out_array, 0, 1, cv2.NORM_MINMAX)
     out_array = cv2.resize(out_array, (IMG_SIZE, IMG_SIZE)
     training_data.append([out_array, float(labelMap[img])])
    except Exception as e:
      pass
 return training_data

 def getLabelMap():
   map = {}
   path = os.getcwd()
   path = os.path.join(path, "data\train_test_files\All_labels.txt")
   f = open(path, "r")
   for line in f:
     line = line.split()     #lines in txt file are of the form 'image_name.jpg 3.2'
     map[line[0]] = line[1]  #3.2 is the label
   f.close()
   return map
#call of method:
training_set=[]
training_set = loadImages(244)  #I want to have my images resized to 244x244
  

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

1. не используйте map в качестве имени переменной, это встроенная функция. Я предлагаю label_map вместо этого.