#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
вместо этого.