Создание матрицы категориальных меток

#python #pandas #numpy #keras #conv-neural-network

#python #pandas #numpy #keras #conv-нейронная сеть

Вопрос:

Я создаю CNN для распознавания листа.

Я использую этот набор данных: набор данных leafnsap

Насколько у меня нет проблем с загрузкой изображений и преобразованием их в np-массив и построением модели с помощью Keras.

У меня есть некоторые трудности с построением матрицы значений.

Эта матрица должна иметь такой размер: [количество изображений] [количество меток]

И каждая позиция [i] [j] равна 1, если изображение в позиции i имеет ту же метку, что и матрица меток в позиции j. В противном случае 0.

Вот как выглядит файл txt (csv): данные

Вот некоторый код:

 #imports
import numpy as np
import pandas as pd
import matplotlib.pyplot  as plt
import cv2
import tensorflow as tf
from tensorflow import keras
#loading and visualization of the data
path_to_txt = "D:DevDatalato_projectleafsnap-datasetleafsnap-dataset- 
images_improved.txt"
df = pd.read_csv(path_to_txt ,sep='t')
arr = np.array(df)
print(arr.shape)
  

вывод: (30866, 4)

 images = []
labels = []
for row in arr:
    if "lab" in row[0]:
        pass #nothing 
    else:
        if row[2] in labels:
            pass #nothing
        else:
            labels.append(row[2])
print(len(labels))
  

вывести: 181 (это количество разных видов)

 #values is supposed to be a [7524][181] binary matrix for the training of the cnn
for row in arr:
    if "lab" in row[0]:
        pass
    else:
        img = cv2.imread("leafsnap-dataset/"   row[0])
        img = cv2.resize(img,(260,200))
        images.append(img)
values = np.zeros([len(imges), len(labels)])
  

На данный момент я не могу найти, как выполнить эту простую операцию. Спасибо за помощь.

Ответ №1:

 from sklearn.preprocessing import OneHotEncoder

for row in arr:
    if "lab" in row[0]:
        pass
    else:
        img = cv2.imread("leafsnap-dataset/"   row[0])
        img = cv2.resize(img,(260,200))
        images.append(img)
        labels.append([row[2]])

obj = OneHotEncoder()
values = obj.fit_transform(labels).toarray()
  

Вы можете использовать inverse_transform метод, чтобы вернуть метку из кодировки.

https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing .OneHotEncoder.html