>source

Keras lib를 사용하여 샴 신경망을 구축했습니다. 내 모델에는 모양이 (64,64,3) 인 두 개의 입력과 사전 훈련 된 ResNet-50이 있습니다. 손실 기능은 이진 교차 엔트로피입니다.

모델은이 논문을 기반으로합니다 링크

열차 안에서 나는 아주 좋은 특성/발 정확도, 약 0.99/0.98, 낮은 손실 0.01/0.05를 가지고 있습니다.

그러나 저장된 모델을 테스트 할 때 결과가 좋지 않습니다. 이 모델은 두 장의 동일한 그림을 인식 할 수 없습니다.

또한 이상한 행동을 발견했습니다. 에포크 수가 많을수록 결과가 나빠집니다. 예를 들어 훈련 된 모델을10 epoch와 동일한 두 이미지를 비교하면 다음과 같은 예측이 가능합니다. "8.jpg": 0.5180479884147644 그러나100epoch로 훈련 된 동일한 모델은 "8.jpg": 5.579867080537926E-13 그러나100 에포크의 경우 더 나은 열차 결과가 있습니다.

CNN : ResNet18,(224,224,3)또는(128,128,3)과 같은 다른 입력 모양에 대해 다른 모델을 시도했습니다.

또한 사전 훈련 된 모델을 사용하지 않고 사전 훈련 된 무게없이ResNet50/ResNet18만 사용했습니다. 그러나 실제 모델을 테스트하는 동안 동일한 결과가 나쁩니다.

내 코드는

def create_base_model(image_shape, dropout_rate, suffix=''):
    I1 = Input(shape=image_shape)
    model = ResNet50(include_top=False, weights='imagenet', input_tensor=I1, pooling=None)
    model.layers.pop()
    model.outputs = [model.layers[-1].output]
    model.layers[-1].outbound_nodes = []
    for layer in model.layers:
        layer.name = layer.name + str(suffix)
        layer.trainable = False
    flatten_name = 'flatten' + str(suffix)
    x = model.output
    x = Flatten(name=flatten_name)(x)
    x = Dense(1024, activation='relu')(x)
    x = Dropout(dropout_rate)(x)
    x = Dense(512, activation='relu')(x)
    x = Dropout(dropout_rate)(x)
    return x, model.input

def create_siamese_model(image_shape, dropout_rate):
    output_left, input_left = create_base_model(image_shape, dropout_rate)
    output_right, input_right = create_base_model(image_shape, dropout_rate, suffix="_2")
    L1_layer = Lambda(lambda tensors: tf.abs(tensors[0] - tensors[1]))
    L1_distance = L1_layer([output_left, output_right])
    L1_prediction = Dense(1, use_bias=True,
                          activation='sigmoid',
                          kernel_initializer=RandomNormal(mean=0.0, stddev=0.001),
                          name='weighted-average')(L1_distance)
    prediction = Dropout(0.2)(L1_prediction)
    siamese_model = Model(inputs=[input_left, input_right], outputs=prediction)
    return siamese_model
siamese_model = create_siamese_model(image_shape=(64, 64, 3),
                                         dropout_rate=0.2)
siamese_model.compile(loss='binary_crossentropy',
                      optimizer=Adam(lr=0.0001),
                      metrics=['binary_crossentropy', 'acc'])
siamese_model.fit_generator(train_gen,
                            steps_per_epoch=1000,
                            epochs=10,
                            verbose=1,
                            callbacks=[checkpoint, tensor_board_callback, lr_reducer, early_stopper, csv_logger],
                            validation_data=validation_data,
                            max_q_size=3)
siamese_model.save('siamese_model.h5')

# and the my prediction
siamese_net = load_model('siamese_model.h5', custom_objects={"tf": tf})
X_1 = [image, ] * len(markers)
batch = [markers, X_1]
result = siamese_net.predict_on_batch(batch)
# I've tried also to check identical images 
markers = [image]
X_1 = [image, ] * len(markers)
batch = [markers, X_1]
result = siamese_net.predict_on_batch(batch)

예측 방법에 대한 의구심이 있습니다. 누군가 예측에 문제가있는 것을 찾도록 도와 줄 수 있습니까?


  • 답변 # 1

    당신이 받고있는 것이 기대됩니다. 무슨 말인지 모르겠어요

    와이즈 비즈

    그러나 표시 한 결과는 유효하고 예상됩니다. 모델이 출력하는 것부터 시작하겠습니다. 모델 출력은 첫 번째 입력과 두 번째 입력 사이의 거리 (표준화)입니다. 입력이 유사하면 거리는 0에 가까워 야합니다. 훈련 단계의 수가 증가함에 따라 입력을 식별하는 모델 학습, 즉 입력이 유사한 경우 모델은 0에 가까운 출력 값을 학습하고 입력이 다른 경우 모델은 1에 가까운 출력 값을 학습합니다.

    와이즈 비즈

    , 모델이 두 입력이 유사하고 출력

    Also I noticed strange behavior: the greater the number of epochs the result is worse.

    임을 알게됨을 확인 (약 0에 가깝습니다).

    모델의 성능이 좋지만 모델 정의에서 관찰 한 한 가지 문제가 있습니다 .- 출력 레이어는 드롭 아웃 레이어입니다. 드롭 아웃이 유효한 출력 레이어가 아닙니다. 이 설정으로 수행하는 것은 확률 0.2로 임의로 모델의 출력을 0으로 설정하는 것입니다.

    목표 변수에 1 (두 입력이 다름)이 있고 모델이 이미지를 올바르게 식별하고 드롭 아웃 레이어 이전에 1에 가까운 값을 출력하는 것을 배웠습니다. 드롭 아웃 레이어가 출력을 0으로 설정하기로 결정했다고 가정합시다. 따라서 모델 출력은 0이됩니다. 드롭 아웃 레이어 이전의 레이어가 잘 수행 되더라도 드롭 아웃 레이어로 인해 불이익을받습니다. 이것이 보이지 않는 경우 마지막 드롭 아웃 레이어를 제거하십시오.

    ... trained model with 10 epoch gives prediction: "8.jpg": 0.5180479884147644 but the same model trained with 100 epoch gives "8.jpg": 5.579867080537926E-13 However for 100 epoch I have better train results.

    그러나 모델에 노이즈를 추가하려는 경우이 동작이 필요한 경우가 있습니다. 이는 값이 1 일 때 대상 변수를 임의로 변경하는 것과 동일한 효과를 갖습니다.

    5.579867080537926E-13 ~ 0

관련 자료

  • 이전 javascript - 모든 태그를 선택하기 위해 데이터베이스의 쿼리에서 가져온 데이터를 어떻게로드합니까?
  • 다음 css - 렌더링시 반응 전환 그룹 CSSTransition 슬라이드