Numpy 如何设置暹罗网络的图像大小?

Numpy 如何设置暹罗网络的图像大小?,numpy,keras,conv-neural-network,google-colaboratory,siamese-network,Numpy,Keras,Conv Neural Network,Google Colaboratory,Siamese Network,我正在开发一个用于人脸识别的暹罗神经网络。图像是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_

我正在开发一个用于人脸识别的暹罗神经网络。图像是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阵列的形状有关。我尝试使用“展开dims”和“重塑”来调整尺寸,但错误仍然保持不变。有什么方法可以调试此错误吗?

因为错误表明您正在向fit函数传递一个
x
np.ndarray,其中2作为第一维度,而
y
np.ndarray,其中2200作为第一维度

在不知道如何构建网络模型的情况下很难回答,但是,假设您的模型采用两个输入,分别对应于两个图像的形状
(224224,224,3)
,然后您可以将fit函数作为
x
参数传递(如果模型有多个输入):

  • 数组列表
  • 张量表
  • 将输入名称映射到相应数组/张量的dict
在代码中不能使用numpy数组。查看有关fit方法的更多详细信息

因此,您可以按如下方式调整代码:

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)

我添加了暹罗网络的架构。一定要看一看,然后告诉我你的答案是否正确。是的,正如我所想。将数据以列表形式提供给拟合模型,而不是np.Arrays此答案有效,历元开始运行,但在第一个历元开始时,我的损失为2145874。暹罗网络是正常的还是我应该检查一下?这取决于你是如何编译你的模型的,以及你正在评估的损失函数。如果你使用的是二进制交叉熵损失,那么这个值对我来说真的很奇怪,因为你是如何构建网络的,对于一个输出神经元,我建议使用二进制交叉熵损失函数。否则,您可以查看有关暹罗网络培训的更多详细信息: