딥 러닝 모델에 새로운 카테고리를 추가하는 방법은 무엇입니까?


15

사전 훈련 된 네트워크에서 10 개의 객체를 인식하기 위해 전이 학습을 수행했다고 가정 해 보겠습니다. 내가 이미 훈련 한 10 가지 범주 나 원래 사전 훈련 된 모델의 정보를 모두 잃지 않고 네트워크가 분류 할 수있는 11 번째 항목을 어떻게 추가합니까? 친구가이 분야에서 활발한 연구가 진행되고 있다고 말했지만 관련 논문이나 검색 할 이름을 찾을 수 없습니까?

감사합니다.


더 많은 수업으로 훈련한다면 거기에 있습니까? 도움이 될까요? 예를 들어, 수업이 1000 개를 넘지 않는다고 가정 해 봅시다. 현재 보유하고있는 10 개의 클래스에 1000 개의 클래스를 사용하여 분류자를 처음부터 학습하고, 더 많은 클래스가있는 경우 해당 클래스에 기차를 유지하면됩니다. 이것이 좋은 해결책 일 수 있습니까? 이 접근법에 관한 논문이 있습니까?
Michael

답변:


13

이것이 일회성 사례 인 경우 신경망을 다시 훈련시킬 수 있습니다. 새 클래스를 자주 추가해야하는 경우 이는 나쁜 생각입니다. 이러한 경우에 수행하려는 작업을 CBIR (콘텐츠 기반 이미지 검색) 또는 단순히 이미지 검색 또는 시각적 검색이라고합니다. 아래 답변에 두 경우 모두 설명하겠습니다.

일회성 사례

이 과정이 한 번만 발생하면 (11 등석을 잊어 버렸거나 고객이 마음을 바꿨지 만) 다시는 발생하지 않으면 11 번 출력 노드를 마지막 계층으로 간단하게 만들 수 있습니다. 이 노드의 가중치를 무작위로 초기화하되 다른 출력에 대해 이미 가지고있는 가중치를 사용하십시오. 그런 다음 평소대로 훈련하십시오. 일부 웨이트를 수정하는 것이 도움이 될 수 있습니다. 즉,이를 훈련시키지 마십시오.

극단적 인 경우는 새 웨이트 만 훈련시키고 나머지는 모두 고정 된 상태로 두는 것입니다. 그러나 이것이 잘 작동하는지 확실하지 않습니다-시도해 볼 가치가 있습니다.

컨텐츠 기반 이미지 검색

다음 예를 고려하십시오. CD 상점을 위해 작업 중이며 고객이 앨범 표지 사진을 찍을 수있게하려면 응용 프로그램이 온라인 상점에서 스캔 한 CD를 보여줍니다. 이 경우 상점에있는 모든 새 CD에 대해 네트워크를 다시 훈련시켜야합니다. 매일 5 개의 새 CD가있을 수 있으므로 네트워크를 재교육하는 것은 적합하지 않습니다.

해결책은 이미지를 지형 공간에 매핑하는 네트워크를 훈련시키는 것입니다. 각각의 이미지는 디스크립터, 예를 들어 256 차원 벡터로 표현 될 것이다. 이 디스크립터를 계산하고 디스크립터 데이터베이스 (예 : 상점에있는 모든 CD의 디스크립터)와 비교하여 이미지를 "분류"할 수 있습니다. 데이터베이스에서 가장 가까운 설명자가 이깁니다.

그러한 디스크립터 벡터를 배우기 위해 신경망을 어떻게 훈련 시키는가? 그것은 활발한 연구 분야입니다. "이미지 검색"또는 "메트릭 학습"과 같은 키워드를 검색하여 최근 작업을 찾을 수 있습니다.

현재 사람들은 일반적으로 VGG-16과 같은 사전 훈련 된 네트워크를 사용하여 FC 레이어를 차단하고 최종 컨볼 루션을 설명자 벡터로 사용합니다. 트리플렛 손실이있는 샴 네트워크를 사용하여이 네트워크를 추가로 훈련시킬 수 있습니다.


나는 원샷 학습을 찾고 있습니다. 그게 나를 도울 수 있다고 생각합니까?
nnrales

나는 원샷 학습에 대해 정말로 모른다. 그것은 확실히 당신을 위해 도움이 될 수 있도록하지만 원샷 깊은, 내가 CBIR 접근 방식과 매우 유사한 모습을 발견 논문을 학습
hbaderts

2

네트워크 토폴로지는 다르게 보일 수 있지만, 결국 사전 훈련 된 네트워크에는 10 개의 원래 클래스 인식을 처리하는 계층이 있습니다. 11 번째, 12 번째 n. 클래스를 소개하는 가장 쉬운 (그리고 작동하는) 트릭 은 마지막 이전에 모든 레이어를 사용 하고 추가 된 레이어 (새 모델 또는 병렬 레이어)를 추가하는 것입니다. 마지막 레이어를 제외하고는 10 클래스 레이어와 비슷하게 보일 것입니다 [len(dense layer), 10].

새 레이어는 모양이있는 matmul 레이어입니다 [len(dense layer), len(new classes)].

원래 교육 데이터에 액세스하지 않으면 두 가지 옵션이 있습니다.

  1. "새로운"모델이 새로운 가중치 만 최적화하도록하여 원래 레이어의 모든 가중치를 고정합니다. 그렇게하면 원래 10 개의 클래스에 대해 정확히 동일한 예측 능력을 제공하고 새로운 클래스에 대해 괜찮은 성능을 제공 할 수 있습니다.
  2. 새로운 클래스에서 작동하는 새로운 클래스의 오류를 전파하여 전체 네트워크를 한 번에 훈련 시키십시오. 해당 변경 사항에 맞게 업데이트되지 않습니다).

원래 교육 데이터에 액세스 할 수 있으면 원래 네트워크에 새 클래스를 쉽게 추가하고 재교육하여 즉시 11 개의 클래스를 지원할 수 있습니다.


2

이것은 쉽게 할 수 있습니다.

먼저 10 개의 클래스로 모델을 빌드하고 모델을 base_model로 저장하십시오.

base_model을로드하고 new_model이라는 새 모델을 다음과 같이 정의하십시오.

new_model = Sequential()

그런 다음 base_model의 레이어를 new_model에 추가하십시오.

# getting all the layers except the last two layers
for layer in base_model.layers[:-2]: #just exclude the last two layers from base_model
    new_model.add(layer)

이제 모델을 다시 학습하지 않으려면 새 모델의 레이어를 훈련 할 수 없도록 만드십시오.

# prevent the already trained layers from being trained again
for layer in new_model.layers:
    layer.trainable = False

학습을 이전 할 때 마지막 레이어를 제거하면 10 가지 클래스를 잊어 버리므로 base_model의 가중치를 new_model에 유지해야합니다.

weights_training = base_model.layers[-2].get_weights()
new_model.layers[-2].set_weights(weights_training) 

이제 끝에 고밀도 레이어를 추가하면이 예제에서는이 고밀도 레이어 만 학습합니다.

new_model.add(Dense(CLASSES, name = 'new_Dense', activation = 'softmax'))

이제 모델을 훈련시키고 11 클래스 모두에 적합한 출력을 제공하기를 바랍니다.

행복한 학습.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.