微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何设置 Siamese Network 的图像大小?

如何解决如何设置 Siamese Network 的图像大小?

我正在开发用于人脸识别的连体神经网络。图像是 RGB 通道,大小为 224*224。有2200对训练图像和1000对测试图像。

在训练这个模型的过程中,我得到了这个错误

Error Image

形状和model.fit代码如下:

#train_nparr_pairs.shape --> (2200,2,224,3)
#test_nparr_pairs.shape --> (1000,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[:,test_nparr_pairs[:,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,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_regularizer=l2(1e-4)))
  model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))

  # Second Conv-Pool Layer
  model.add(Conv2D(filters=128,kernel_regularizer=l2(1e-4)))
  model.add(Conv2D(filters=128,2)))

  #Third Conv-Pool Layer
  model.add(Conv2D(filters=256,kernel_regularizer=l2(1e-4)))
  model.add(Conv2D(filters=256,2)))

  # Fourth Conv-Pool Layer
  model.add(Conv2D(filters=512,kernel_regularizer=l2(1e-4)))
  model.add(Conv2D(filters=512,2)))

  # Fifth Conv-Pool layer
  model.add(Conv2D(filters=512,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 来调整尺寸,但错误仍然相同。有没有办法调试这个错误

解决方法

由于错误表明您正在将一个 x np.ndarray 以 2 作为第一维和一个 y np.ndarray 以 2200 作为第一维。

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

  • 数组列表
  • 张量列表
  • 一个将输入名称映射到相应数组/张量的字典

您不能像在代码中那样使用 numpy 数组。查看 tf documentation 以了解有关 fit 方法的更多详细信息。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。