почему моя сеть Keras сиамская дает вопрос о размере выборки - PullRequest
0 голосов
/ 22 мая 2019

Итак, я скопировал весь пример кераса для сиамской сети отсюда https://keras.io/examples/mnist_siamese/

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

def create_pairs(datapath, directories):
    pairs = []
    labels = []
    for file in os.listdir(datapath):
        file_path = datapath + file
        for pic in os.listdir(file_path):
            # Get positive pair
            file_choice = None
            while file_choice is None:
                file_choice = get_random_pic(file_path, pic)
            #print(file_choice)
            p1_path = file_path +"/"+ pic
            p2_path = file_path +"/"+ file_choice
            #print("File: {} Pic1: {} Rand:{}".format(file,p1_path,p2_path))        
            # Get negative pair from a random directory
            rand_dir = None
            while rand_dir is None:
                rand_dir = get_random_dir(directories, file_path)
            #print("CP:{} RD:{}".format(file_path, rand_dir))
            rand_pic = random.choice(os.listdir(rand_dir))
            # Negative example
            p3_path = rand_dir +"/"+ rand_pic
            #print("P1", p1_path)
            #print("P2",p2_path)
            #print("P3",p3_path)
            # Read in all the file using cv2
            a = cv2.imread(p1_path)
            p = cv2.imread(p2_path)
            n = cv2.imread(p3_path)
            pos_pair = [a, p]
            neg_pair = [a,n]

            # Now create paris
            #pairs += [[x[z1], x[z2]]]

            pairs.append(pos_pair)
            labels.append(1)
            pairs.append(neg_pair)
            labels.append(0)
return np.array(pairs), np.array(labels)

Это мой метод чтения изображений из папки, которая разделена по людям или категориям.

Я создаю набор данных, как это X, labels = create_pairs(datapath, directories)

Это дает мне поезд и набор тестов, как это

Train sample : data:1000 label:1000
Test sample : data:920 label:920
(1000, 2, 160, 60, 3)
(920, 2, 160, 60, 3)

Моя форма ввода для базовой сети (2, 160, 60, 3) Это общая форма ввода

print("Train Shape: {} label:{}".format(x_train.shape, y_train.shape))
print("Test Shape: {} label:{}".format(x_test.shape, y_test.shape))
print(input_a.shape)
print(input_shape)
Train Shape: (1000, 2, 160, 60, 3) label:(1000,)
Test Shape: (920, 2, 160, 60, 3) label:(920,)
(?, 2, 160, 60, 3)
(2, 160, 60, 3)

И это мой метод подгонки модели

model.fit([x_train[:0],x_train[:1]], y_train,
      batch_size=128,
      epochs=epochs,
      validation_data=([x_test[:1], x_test[:1]], y_test))

Из примера он должен работать нормально, так как он выглядит так же, как в примере - данные msint.

Но это дает мне эту ошибку:

Все входные массивы (x) должны иметь одинаковое количество выборок. Получил формы массива: [(0, 2, 160, 60, 3), (1, 2, 160, 60, 3)]

********************** После этого добавлен новый материал ******************** *********** Так что у меня все получилось, но я не знаю, правильно ли он учится.

history = model.fit([x_train, x_train], y_train,
      batch_size=128,
      epochs=epochs,
      verbose = 1,
      validation_data=([x_test, x_test], y_test))

Вот как я это делаю, но это не похоже на пример. Это правильный способ сделать это?

1 Ответ

0 голосов
/ 22 мая 2019

Я нашел способ обойти проблемы. Таким образом, подгонка новой модели похожа на то, что констант заявил следующим образом:

history = model.fit([a_train, c_train], y_train,
      batch_size=128,
      epochs=epochs,
      verbose = 1,
      validation_data=([a_test, c_test], y_test))

Большое изменение, которое я сделал, - создание пары. Я в основном сделал два массива: массив Anchor и массив сравнения. Это окончательный код для оператора возврата.

 anchor.append(a)
        anchor.append(a)
        comp.append(p)
        comp.append(n)
        labels.append(1)
        labels.append(0)


        #pos_pair = [a, p]
        #neg_pair = [a,n]

        # Now create paris
        #pairs += [[x[z1], x[z2]]]
        #pairs += [[a,p]]
        #pairs += [[a,n]]
        #labels += [1,0]
        #pairs.append(pos_pair)
        #labels.append(1)
        #pairs.append(neg_pair)
        #labels.append(0)


return np.array(anchor), np.array(comp), np.array(labels)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...