사전 훈련 된 네트워크에서 10 개의 객체를 인식하기 위해 전이 학습을 수행했다고 가정 해 보겠습니다. 내가 이미 훈련 한 10 가지 범주 나 원래 사전 훈련 된 모델의 정보를 모두 잃지 않고 네트워크가 분류 할 수있는 11 번째 항목을 어떻게 추가합니까? 친구가이 분야에서 활발한 연구가 진행되고 있다고 말했지만 관련 논문이나 검색 할 이름을 찾을 수 없습니까?
감사합니다.
사전 훈련 된 네트워크에서 10 개의 객체를 인식하기 위해 전이 학습을 수행했다고 가정 해 보겠습니다. 내가 이미 훈련 한 10 가지 범주 나 원래 사전 훈련 된 모델의 정보를 모두 잃지 않고 네트워크가 분류 할 수있는 11 번째 항목을 어떻게 추가합니까? 친구가이 분야에서 활발한 연구가 진행되고 있다고 말했지만 관련 논문이나 검색 할 이름을 찾을 수 없습니까?
감사합니다.
답변:
이것이 일회성 사례 인 경우 신경망을 다시 훈련시킬 수 있습니다. 새 클래스를 자주 추가해야하는 경우 이는 나쁜 생각입니다. 이러한 경우에 수행하려는 작업을 CBIR (콘텐츠 기반 이미지 검색) 또는 단순히 이미지 검색 또는 시각적 검색이라고합니다. 아래 답변에 두 경우 모두 설명하겠습니다.
이 과정이 한 번만 발생하면 (11 등석을 잊어 버렸거나 고객이 마음을 바꿨지 만) 다시는 발생하지 않으면 11 번 출력 노드를 마지막 계층으로 간단하게 만들 수 있습니다. 이 노드의 가중치를 무작위로 초기화하되 다른 출력에 대해 이미 가지고있는 가중치를 사용하십시오. 그런 다음 평소대로 훈련하십시오. 일부 웨이트를 수정하는 것이 도움이 될 수 있습니다. 즉,이를 훈련시키지 마십시오.
극단적 인 경우는 새 웨이트 만 훈련시키고 나머지는 모두 고정 된 상태로 두는 것입니다. 그러나 이것이 잘 작동하는지 확실하지 않습니다-시도해 볼 가치가 있습니다.
다음 예를 고려하십시오. CD 상점을 위해 작업 중이며 고객이 앨범 표지 사진을 찍을 수있게하려면 응용 프로그램이 온라인 상점에서 스캔 한 CD를 보여줍니다. 이 경우 상점에있는 모든 새 CD에 대해 네트워크를 다시 훈련시켜야합니다. 매일 5 개의 새 CD가있을 수 있으므로 네트워크를 재교육하는 것은 적합하지 않습니다.
해결책은 이미지를 지형 공간에 매핑하는 네트워크를 훈련시키는 것입니다. 각각의 이미지는 디스크립터, 예를 들어 256 차원 벡터로 표현 될 것이다. 이 디스크립터를 계산하고 디스크립터 데이터베이스 (예 : 상점에있는 모든 CD의 디스크립터)와 비교하여 이미지를 "분류"할 수 있습니다. 데이터베이스에서 가장 가까운 설명자가 이깁니다.
그러한 디스크립터 벡터를 배우기 위해 신경망을 어떻게 훈련 시키는가? 그것은 활발한 연구 분야입니다. "이미지 검색"또는 "메트릭 학습"과 같은 키워드를 검색하여 최근 작업을 찾을 수 있습니다.
현재 사람들은 일반적으로 VGG-16과 같은 사전 훈련 된 네트워크를 사용하여 FC 레이어를 차단하고 최종 컨볼 루션을 설명자 벡터로 사용합니다. 트리플렛 손실이있는 샴 네트워크를 사용하여이 네트워크를 추가로 훈련시킬 수 있습니다.
네트워크 토폴로지는 다르게 보일 수 있지만, 결국 사전 훈련 된 네트워크에는 10 개의 원래 클래스 인식을 처리하는 계층이 있습니다. 11 번째, 12 번째 n. 클래스를 소개하는 가장 쉬운 (그리고 작동하는) 트릭 은 마지막 이전에 모든 레이어를 사용 하고 추가 된 레이어 (새 모델 또는 병렬 레이어)를 추가하는 것입니다. 마지막 레이어를 제외하고는 10 클래스 레이어와 비슷하게 보일 것입니다 [len(dense layer), 10]
.
새 레이어는 모양이있는 matmul 레이어입니다 [len(dense layer), len(new classes)]
.
원래 교육 데이터에 액세스하지 않으면 두 가지 옵션이 있습니다.
원래 교육 데이터에 액세스 할 수 있으면 원래 네트워크에 새 클래스를 쉽게 추가하고 재교육하여 즉시 11 개의 클래스를 지원할 수 있습니다.
이것은 쉽게 할 수 있습니다.
먼저 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 클래스 모두에 적합한 출력을 제공하기를 바랍니다.
행복한 학습.