Как установить размер изображения для сиамской сети?

#numpy #keras #conv-neural-network #google-colaboratory #siamese-network

#numpy #keras #conv-нейронная сеть #google-colaboratory #сиамская сеть

Вопрос:

Я разрабатываю сиамскую нейронную сеть для распознавания лиц. Изображения имеют канал RGB размером 224 * 224. Имеется 2200 пар обучающих изображений и 1000 пар тестовых изображений.

Во время обучения этой модели я получил эту ошибку:

Изображение с ошибкой

Формы и код model.fit приведены ниже:

 #train_nparr_pairs.shape --> (2200,2,224,224,3)
#test_nparr_pairs.shape --> (1000,2,224,224,3)
#train_labels.shape --> (2200,)
#test_labels.shape --> (1000,)
#BATCH_SIZE 32
#EPOCHS 64

model.fit(np.asarray([train_nparr_pairs[:, 0], train_nparr_pairs[:, 1]]), train_labels[:],
validation_data=(np.asarray([test_nparr_pairs[:, 0], test_nparr_pairs[:, 1]]),
 test_labels[:]),batch_size=BATCH_SIZE, epochs=EPOCHS)


 

Архитектура нейронной сети:

 from keras.layers import Input,Lambda
from keras import backend as K
from keras.models import Model
from keras.regularizers import l2

IMG_SHAPE=(224,224,3)
BATCH_SIZE=16
EPOCHS=32

def return_siamese_net():

  left_input=Input(IMG_SHAPE)
  right_input=Input(IMG_SHAPE)

  model=Sequential(name="VGG-16")

  # First Conv-Pool Layer

  model.add(Conv2D(filters=64,kernel_size=(3,3),activation='relu',padding='same',input_shape=IMG_SHAPE,kernel_initializer='glorot_uniform',kernel_regularizer=l2(1e-4)))
  model.add(Conv2D(filters=64,kernel_size=(3,3),activation='relu',padding='same',kernel_initializer='glorot_uniform',kernel_regularizer=l2(1e-4)))
  model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))

  # Second Conv-Pool Layer
  model.add(Conv2D(filters=128,kernel_size=(3,3),activation='relu',padding='same',kernel_initializer='glorot_uniform',kernel_regularizer=l2(1e-4)))
  model.add(Conv2D(filters=128,kernel_size=(3,3),activation='relu',padding='same',kernel_initializer='glorot_uniform',kernel_regularizer=l2(1e-4)))
  model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))

  #Third Conv-Pool Layer
  model.add(Conv2D(filters=256,kernel_size=(3,3),activation='relu',padding='same',kernel_initializer='glorot_uniform',kernel_regularizer=l2(1e-4)))
  model.add(Conv2D(filters=256,kernel_size=(3,3),activation='relu',padding='same',kernel_initializer='glorot_uniform',kernel_regularizer=l2(1e-4)))
  model.add(Conv2D(filters=256,kernel_size=(3,3),activation='relu',padding='same',kernel_initializer='glorot_uniform',kernel_regularizer=l2(1e-4)))
  model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))

  # Fourth Conv-Pool Layer
  model.add(Conv2D(filters=512,kernel_size=(3,3),activation='relu',padding='same',kernel_initializer='glorot_uniform',kernel_regularizer=l2(1e-4)))
  model.add(Conv2D(filters=512,kernel_size=(3,3),activation='relu',padding='same',kernel_initializer='glorot_uniform',kernel_regularizer=l2(1e-4)))
  model.add(Conv2D(filters=512,kernel_size=(3,3),activation='relu',padding='same',kernel_initializer='glorot_uniform',kernel_regularizer=l2(1e-4)))
  model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))

  # Fifth Conv-Pool layer
  model.add(Conv2D(filters=512,kernel_size=(3,3),activation='relu',padding='same',kernel_initializer='glorot_uniform',kernel_regularizer=l2(1e-4)))
  model.add(Conv2D(filters=512,kernel_size=(3,3),activation='relu',padding='same',kernel_initializer='glorot_uniform',kernel_regularizer=l2(1e-4)))
  model.add(Conv2D(filters=512,kernel_size=(3,3),activation='relu',padding='same',kernel_initializer='glorot_uniform',kernel_regularizer=l2(1e-4)))
  model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))

  #Flatten Layer
  model.add(Flatten())
  model.add(Dense(4096, activation='relu'))

  encoded_l=model(left_input)
  encoded_r=model(right_input)

  lambda_layer= Lambda(lambda tensors:K.abs(tensors[0]-tensors[1]))
  L1_distance = lambda_layer([encoded_l, encoded_r])
  prediction = Dense(1,activation='sigmoid')(L1_distance)
  siamese_net = Model(inputs=[left_input,right_input],outputs=prediction)
  
  return siamese_net
 

Я знаю, что это связано с формой обучающих и тестовых массивов numpy . Я попытался использовать expand dims и reshape для настройки размеров, но ошибка все равно остается прежней. Есть ли какие-либо способы отладки этой ошибки?

Ответ №1:

Как следует из сообщения об ошибке, вы передаете функции fit x np.ndarray с 2 в качестве первого измерения и y np.ndarray с 2200 в качестве первого измерения.

Трудно ответить, не зная, как вы построили сетевую модель, однако давайте предположим, что ваша модель принимает два входных сигнала, соответствующих двум изображениям с формой (224, 224, 3) каждого, тогда вы можете передать функцию подгонки в качестве x аргумента (в случае, если модель имеет несколько входных данных):

  • список массивов
  • список тензоров
  • a dict сопоставляет входные имена с соответствующими массивами / тензорами

Вы не можете использовать массив numpy, как в вашем коде. Посмотрите документацию tf для получения более подробной информации о методе подгонки.

Итак, вы можете настроить свой код следующим образом:

 model.fit(x=[[train_nparr_pairs[:, 0], train_nparr_pairs[:, 1]]], y=train_labels[:], 
          validation_data=([[test_nparr_pairs[:, 0], test_nparr_pairs[:, 1]]], test_labels[:]), 
          batch_size=BATCH_SIZE, epochs=EPOCHS)
 

Комментарии:

1. Я добавил архитектуру сиамской сети. Посмотрите на это и, пожалуйста, скажите, все ли в порядке с вашим ответом.

2. Да, это так, как я и предполагал. Предоставьте данные для подходящей модели в виде списка вместо np.array

3. Этот ответ сработал, и эпохи начали запускаться, но я получаю потери как 2145874 в начале 1-й эпохи. Это нормально для сиамской сети или я должен что-то проверить?

4. Это зависит от того, как вы скомпилировали свою модель и какую функцию потерь вы оцениваете. Если вы используете потерю binary_crossentropy, это значение звучит для меня действительно странно

5. Для того, как вы построили сеть с одним выходным нейроном, я бы предложил функцию потери binary_crossentropy . В противном случае вы можете проверить более подробную информацию об обучении сиамской сети: towardsdatascience.com /…