#python #python-3.x
Вопрос:
У меня есть массив NumPy, и я хочу создать все возможные пары для сиамской сети, используя цикл for a.
Приведенная ниже функция просто создает равные пары как для числа положительных, так и для отрицательных изображений.
Негативные образы: это просто образы, которые отличаются друг от друга.
позитивные образы: это одинаковые образы.
Возьмем, к примеру, у нас есть изображения и надписи, как показано ниже, где алфавиты представляют изображения.
этикетки = array([3,2,1,4], dtype=int32)
Изображения = array([A,B,C,D,E,A,C,B,C,A,B,C] dtype=int32)
Приведенная ниже функция просто выводит данные. положительные пары = [[A,A],[B,B],[C,C],[D,D],[E,E]
с метками как 1
. и для отрицательных пар [[A,B],[B,A],[C,D],[D,A],[E,D]
с метками как 0
.
Я хочу вывести все возможные отрицательные пары следующим образом [[A,B],[A,C],[A,D],[A,E],[B,A],[B,C],[B,D],[B,E],[C,A],[C,B],[C,D],[C,E],[D,A],[D,B],[D,C],[D,E],[E,A],[E,B],[E,C],[E,D]
def make_pairs(images, labels): # initialize two empty lists to hold the (image, image) pairs and # labels to indicate if a pair is positive or negative pairImages = [] pairLabels = [] # calculate the total number of classes present in the dataset # and then build a list of indexes for each class label that # provides the indexes for all examples with a given label numClasses = len(np.unique(labels)) idx = [np.where(labels == i)[0] for i in range(0, numClasses)] # loop over all images for idxA in range(len(images)): # grab the current image and label belonging to the current # iteration currentImage = images[idxA] label = labels[idxA] # randomly pick an image that belongs to the *same* class # label idxB = np.random.choice(idx[label]) posImage = images[idxB] # prepare a positive pair and update the images and labels # lists, respectively pairImages.append([currentImage, posImage]) pairLabels.append([1]) # grab the indices for each of the class labels *not* equal to # the current label and randomly pick an image corresponding # to a label *not* equal to the current label negIdx = np.where(labels != label)[0] negImage = images[np.random.choice(negIdx)] # prepare a negative pair of images and update our lists pairImages.append([currentImage, negImage]) pairLabels.append([0]) # return a 2-tuple of our image pairs and labels return (np.array(pairImages), np.array(pairLabels)) print("[INFO] preparing positive and negative pairs...") pairs_train, labels_train = make_pairs(X_train, Y_train)