如何设置连体网络的图像大小?
How to set the image size for 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_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 来调整尺寸,但错误仍然存在。有什么方法可以调试这个错误吗?
如错误所示,您正在将第一个维度为 2 的 x
np.ndarray 和第二个维度为 2200 的 y
np.ndarray 传递给拟合函数。
不知道你是如何构建网络模型的,很难回答,但是,假设你的模型有两个输入,分别对应两个形状为 (224, 224, 3)
的图像,然后你可以传递给拟合用作 x
参数(如果模型有多个输入):
- 数组列表
- 张量列表
- 将输入名称映射到相应的 array/tensors
的字典
您不能像在代码中那样使用 numpy 数组。查看 tf documentation 了解有关拟合方法的更多详细信息。
因此,您可以按如下方式调整您的代码:
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)
我正在开发用于人脸识别的连体神经网络。图像是 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 来调整尺寸,但错误仍然存在。有什么方法可以调试这个错误吗?
如错误所示,您正在将第一个维度为 2 的 x
np.ndarray 和第二个维度为 2200 的 y
np.ndarray 传递给拟合函数。
不知道你是如何构建网络模型的,很难回答,但是,假设你的模型有两个输入,分别对应两个形状为 (224, 224, 3)
的图像,然后你可以传递给拟合用作 x
参数(如果模型有多个输入):
- 数组列表
- 张量列表
- 将输入名称映射到相应的 array/tensors 的字典
您不能像在代码中那样使用 numpy 数组。查看 tf documentation 了解有关拟合方法的更多详细信息。
因此,您可以按如下方式调整您的代码:
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)