【问题标题】:How to train Siamese network in Keras?如何在 Keras 训练 Siamese 网络?
【发布时间】:2019-07-05 07:57:14
【问题描述】:

我有一个 pandas 数据框,其中包含正面和负面示例的文件名,如下所示

img1        img2      y
001.jpg     002.jpg   1 
003.jpg     004.jpg   0 
003.jpg     002.jpg   1  

我想使用 Keras ImageDataGenerator 和 flow_from_dataframe 训练我的 Siamese 网络。如何设置我的训练,以便代码同时输入 2 个带有 1 个标签的图像。

下面是我的模型的代码

def siamese_model(input_shape) :
    left = Input(input_shape)
    right = Input(input_shape)
    model = Sequential()
    model.add(Conv2D(32, (3,3), activation='relu', input_shape=input_shape))
    model.add(BatchNormalization())
    model.add(Conv2D(64, (3,3), activation='relu'))
    model.add(BatchNormalization())
    model.add(Conv2D(128, (3,3), activation='relu'))
    model.add(BatchNormalization())
    model.add(Conv2D(256, (3,3), activation='relu')
    model.add(BatchNormalization())
    model.add(Conv2D(256, (3,3), activation='relu')
    model.add(MaxPooling2D())
    model.add(BatchNormalization())
    model.add(Flatten())
    model.add(Dense(512, activation='sigmoid'))

    left_encoded = model(left)
    right_encoded = model(right)
    L1_layer = Lambda(lambda tensors:K.abs(tensors[0] - tensors[1]))
    L1_distance = L1_layer([left_encoded, right_encoded])
    prediction = Dense(1,activation='sigmoid')(L1_distance)
    siamese_net = Model(inputs=[left,right],outputs=prediction)
    return siamese_net

model = siamese_model((224,224,3))
model.compile(loss="binary_crossentropy",optimizer="adam", metrics=['accuracy'])

datagen_left = ImageDataGenerator(rotation_range=10,
                    width_shift_range=0.2,
                    height_shift_range=0.2,
                    shear_range=0.2,
                    zoom_range=0.2,
                    vertical_flip = True)
datagen_right = ImageDataGenerator(rotation_range=10,
                    width_shift_range=0.2,
                    height_shift_range=0.2,
                    shear_range=0.2,
                    zoom_range=0.2,
                    vertical_flip = True)

【问题讨论】:

  • 你能解释一下这段代码“L1_layer = Lambda(lambda tensors:K.abs(tensors[0] - tensors[1]))”做什么吗?
  • @Noran 计算两幅图像编码之间的绝对距离
  • 如果我们将距离层添加到模型中,我们如何知道有助于确定两个图像是否相同或不同的阈值?
  • @sougatasaha 正在计算“两幅图像编码之间的绝对距离”技术有名字吗?
  • @Noran,网络将被训练以确定阈值。

标签: machine-learning keras deep-learning computer-vision conv-neural-network


【解决方案1】:

在自定义生成器中加入生成器。

让其中一个输出所需的标签,丢弃另一个的标签。

class DoubleGenerator(Sequence):
    def __init__(self, gen1, gen2):
       self.gen1 = gen1
       self.gen2 = gen2

    def __len__(self):
       return len(self.gen1)

    def __getitem__(self, i):
       x1,y = self.gen1[i]
       x2,y2 = self.gen2[i]
       return (x1,x2), y

使用它:

double_gen = DoubleGenerator(datagen_left.flow_from_directory(...),
                             datagen_right.flow_from_directory(...))

【讨论】:

  • 这很好。从来没有意识到 ImageDataGenerators 可以以这种方式组合。我猜如果您在任一基本生成器中设置shuffle=True,这种方法就会失效?
猜你喜欢
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 2021-04-20
  • 2019-04-11
  • 2019-12-17
  • 2018-10-19
  • 2017-06-20
相关资源
最近更新 更多