Итак, я скопировал весь пример кераса для сиамской сети отсюда 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))
Вот как я это делаю, но это не похоже на пример. Это правильный способ сделать это?