1

현재 훈련 된 네트워크를 사용하고 this dataset에서 테스트하려고합니다. 원래 VGG19를 사용하여 마지막 120 개 클래스에 맞게 분류 자만 미세 조정했습니다. 모든 교육을 통해 교육을 받으면 실적을 향상시킬 수 있습니다. 문제는 모델이 매우 느리다는 것입니다 (심지어 밤에 실행하게해도 몇 개의 신기원을 갖고 약 45 %의 정확도에 도달합니다. GPU GTX 1070을가집니다).Keras - 분류기가 사전 학습 된 모델의 전송 값에서 학습하지 않음

내 생각으로는이 모델의 모든 레이어를 동결시켜야하고 10k 이미지 만 있고 마지막 몇개의 덴스 레이어 만 트레이닝하지만 여전히 실제 속도는 아닙니다.

this video (약 2 분 30 초)을 본 후에 InceptionResnetv2를 사용하여 전송 값의 원칙을 재현하기로 결정했습니다.

모든 그림을 처리하고 출력을 다음 코드로 수치가 낮은 행렬에 저장했습니다.

# Loading pre-trained Model + freeze layers 
model = applications.inception_resnet_v2.InceptionResNetV2(
     include_top=False, 
     weights='imagenet', 
     pooling='avg') 

for layer in model.layers: 
    layer.trainable = False 

# Extraction of features and saving 
a = True 
for filename in glob.glob('train/resized/*.jpg'): 
    name_img = os.path.basename(filename)[:-4] 
    class_ = label[label["id"] == name_img]["breed"].values[0] 
    input_img = np.expand_dims(np.array(Image.open(filename)), 0) 
    pred = model.predict(input_img) 
    if a: 
     X = np.array(pred) 
     y = np.array(class_) 
     a = False 
    else: 
     X = np.vstack((X, np.array(pred))) 
     y = np.vstack((y, class_)) 

np.savez_compressed('preprocessed.npz', X=X, y=y) 

X는 모양의 매트릭스 (10222, 1536)이며 y는 (10222, 1)입니다.

후에 분류기 (여러 토폴로지)를 설계했는데 왜 어떤 학습을 수행 할 수 없는지 전혀 알지 못합니다. 나는, 토폴로지, 활성화 기능을 변경 드롭 아웃을 추가 아무것도하지만, 어떤 개선을 생성하지하려고

Train on 9199 samples, validate on 1023 samples 
Epoch 1/100 
9199/9199 [==============================] - 2s 185us/step - loss: 15.9639 - acc: 0.0096 - val_loss: 15.8975 - val_acc: 0.0137 
Epoch 2/100 
9199/9199 [==============================] - 1s 100us/step - loss: 15.9639 - acc: 0.0096 - val_loss: 15.8975 - val_acc: 0.0137 
Epoch 3/100 
9199/9199 [==============================] - 1s 98us/step - loss: 15.9639 - acc: 0.0096 - val_loss: 15.8975 - val_acc: 0.0137 
Epoch 4/100 
9199/9199 [==============================] - 1s 96us/step - loss: 15.9639 - acc: 0.0096 - val_loss: 15.8975 - val_acc: 0.0137 
Epoch 5/100 
9199/9199 [==============================] - 1s 99us/step - loss: 15.9639 - acc: 0.0096 - val_loss: 15.8975 - val_acc: 0.0137 
Epoch 6/100 
9199/9199 [==============================] - 1s 96us/step - loss: 15.9639 - acc: 0.0096 - val_loss: 15.8975 - val_acc: 0.0137 

: 아래에서

# Just to One-Hot-Encode labels properly to (10222, 120) 
label_binarizer = sklearn.preprocessing.LabelBinarizer() 
y = label_binarizer.fit_transform(y) 

model = Sequential() 
model.add(Dense(512, input_dim=X.shape[1])) 
# model.add(Dense(2048, activation="relu")) 
# model.add(Dropout(0.5)) 
# model.add(Dense(256)) 
model.add(Dense(120, activation='softmax')) 

model.compile(
    loss = "categorical_crossentropy", 
    optimizer = "Nadam", # I tried several ones 
    metrics=["accuracy"] 
) 

model.fit(X, y, epochs=100, batch_size=64, 
      callbacks=[early_stop], verbose=1, 
      shuffle=True, validation_split=0.10) 

모델의 출력을 찾을 수 있습니다.

나는이 일을하는 과정에서 무엇이 잘못되었는지 전혀 모른다. X 행렬이 올바르지 않습니까? 사전 훈련 된 모델을 피쳐 추출기로만 사용하고 두 번째 모델로 분류를 수행 할 수 있습니까? 당신의 의견에 대한

많은 감사, 감사 니콜라스

답변

1

당신은 모델 이미지 배열을 공급하기 전에 preprocess_input를 호출해야합니다. input_img의 값을 [0, 255]에서 [-1, 1]로 정규화합니다.이 값은 InceptionResNetV2의 입력 범위입니다.

input_img = np.expand_dims(np.array(Image.open(filename)), 0) 
input_img = applications.inception_resnet_v2.preprocess_input(input_img.astype('float32')) 
pred = model.predict(input_img) 
+0

정말 고마워요! 훈련 시간을 많이 절약 해 줬어. –