2017-11-27 1 views
0

VGG16을 재교육하고 이미지 분류 작업을위한 상위 2 개의 컨벌루션 블록을 미세 조정합니다. 재 훈련 자체는 평범한 정확도로 다소 평온하게 끝났습니다. 미세 조정 프로그램은 현재 실행 중이며 적어도 며칠이 소요될 것 같습니다. 그러나 3 에포크 이후 약 440의 손실은 정확하지 않지만 정확도는 0.4 정도입니다. 내가 프로그램을 죽일 수 있도록 모델에 큰 결함이 있는지 확인하십시오. 나는 미세 조정 단계에서 약간의 데이터 증가와 정규화를 사용했다. 이 데이터 세트는 종양의 약 8000 이미지의 작은 세트로, 8 개의 클래스로 나뉘어져 있습니다. 따라서 데이터는 작고 imagenet 이미지와는 매우 관련이 없습니다. 내가 파이썬과 Keras에 상당히 새로운 그래서 그림을 수 없었던거야Keras VGG16 전송 학습을 통해 매우 높은 손실 이미지 분류

from keras import applications 
from keras.preprocessing.image import ImageDataGenerator 
from keras import optimizers 
from keras.regularizers import l1_l2 
from keras.models import Sequential, Model 
from keras.layers import Dropout, Flatten, Dense 
import PIL 
import math 


weight_path = 'fine_tuned.h5' 
top_model_weight_path = 'top_model.h5' 

img_width, img_height = 224, 224 

train_dir = 'Cancer_Data/Train' 
validation_dir = 'Cancer_Data/Validate' 

epochs = 200 

batch_size = 128 

nb_train_samples = 6454 
nb_validation_samples = 1464 

base_model =applications.VGG16(weights= 'imagenet', include_top= False, input_shape=(224,224,3)) 
print "Model Loaded." 

top_model= Sequential() 
top_model.add(Flatten(input_shape=base_model.output_shape[1:])) 
top_model.add(Dense(256, activation='relu', kernel_regularizer= l1_l2(l1=0.01, l2= 0.01))) 
top_model.add(Dense(8, activation= 'softmax')) 

top_model.load_weights(top_model_weight_path) 

model= Model(inputs= base_model.input, outputs= top_model(base_model.output)) 

for layer in model.layers[:18]: 
layer.trainable=False 

model.compile(optimizer=optimizers.SGD(lr=1e-4, momentum=0.9), 
      loss='categorical_crossentropy', metrics=['accuracy']) 

train_datagen= ImageDataGenerator(
rescale=1./255, 
shear_range=0.3, 
zoom_range=0.3, 
horizontal_flip=True) 

test_datagen= ImageDataGenerator(rescale=1./255) 

train_generator= train_datagen.flow_from_directory(
train_dir, 
target_size=(img_height,img_width), 
batch_size=batch_size, 
class_mode='categorical') 

validation_generator= test_datagen.flow_from_directory(
validation_dir, 
target_size=(img_height,img_width), 
batch_size=batch_size, 
class_mode='categorical') 

model.save(weight_path) 

model.fit_generator(
train_generator, 
steps_per_epoch = int(math.ceil(nb_train_samples/batch_size)), 
epochs=epochs, 
validation_data=validation_generator, 
validation_steps = int(math.ceil(nb_validation_samples/batch_size))) 

:

import numpy as np 
from keras.preprocessing.image import ImageDataGenerator 
from keras.models import Sequential 
from keras.layers import Dropout, Flatten, Dense 
from keras import applications 
from keras.utils.np_utils import to_categorical 
import math 

img_width, img_height= 224, 224 
weight_path= 'bottleneck_fc_model.h5' 
train_dir= 'Cancer_Data/Train' 
validation_dir= 'Cancer_Data/Validate' 
epochs= 150 
batch_size= 128 

def save_bottleneck_features(): 

datagen = ImageDataGenerator(rescale= 1./255) 

model = applications.VGG16(include_top=False, weights='imagenet') 

print 'Extracting Bottleneck Training Features' 

generator = datagen.flow_from_directory(
    train_dir, 
    target_size= (img_width, img_height), 
    batch_size= batch_size, 
    class_mode= None, 
    shuffle= False) 


nb_train_samples= len(generator.filenames) 
predict_size_train= int(math.ceil(nb_train_samples/batch_size)) 
bottleneck_feature_train =model.predict_generator(generator,predict_size_train) 
np.save(open('bottleneck_feature_train.npy', 'w'), bottleneck_feature_train) 

print "Bottleneck Training Features Saved" 

print "Extracting Bottleneck Validation Features" 

generator2 = datagen.flow_from_directory(
    validation_dir, 
    target_size= (img_width, img_height), 
    batch_size= batch_size, 
    class_mode= None, 
    shuffle= False) 

nb_validation_samples= len(generator2.filenames) 
predict_size_validation= int(math.ceil(nb_validation_samples/batch_size)) 

bottleneck_feature_validation = model.predict_generator(generator2, predict_size_validation) 
np.save(open('bottleneck_feature_validation.npy', 'w'), bottleneck_feature_validation) 

print "Bottleneck Validation Features Saved" 

def train_top_model(): 

datagen_top = ImageDataGenerator(rescale=1./255) 
generator_top = datagen_top.flow_from_directory(
    train_dir, 
    target_size= (img_width,img_height), 
    batch_size=batch_size, 
    class_mode='categorical', 
    shuffle=False) 


nb_classes = len(generator_top.class_indices) 
np.save('class_indices.npy', generator_top.class_indices) 

train_data = np.load('bottleneck_feature_train.npy') 
train_labels= to_categorical(generator_top.classes, num_classes= nb_classes) 

generator_top2 = datagen_top.flow_from_directory(
    validation_dir, 
    target_size=(img_width,img_height), 
    batch_size=batch_size, 
    class_mode=None, 
    shuffle=False) 

validation_data = np.load('bottleneck_feature_validation.npy') 
validation_labels= to_categorical(generator_top2.classes, num_classes= nb_classes) 

model = Sequential() 
model.add(Flatten(input_shape=train_data.shape[1:])) 
model.add(Dense(256, activation='relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(nb_classes, activation= 'softmax')) 

model.compile(optimizer= 'adam', loss= 'categorical_crossentropy', metrics= ['accuracy']) 

model.save_weights(weight_path) 

model.fit(train_data, train_labels, epochs= epochs, batch_size= batch_size, 
     validation_data= (validation_data, validation_labels)) 

(eval_loss, eval_accuracy) = model.evaluate(
    validation_data, validation_labels, batch_size=batch_size, verbose=1) 

print("[INFO] accuracy: {:.2f}%".format(eval_accuracy * 100)) 
print("[INFO] Loss: {}".format(eval_loss)) 

save_bottleneck_features() 
train_top_model() 

모델은 미세 조정에 대한 코드 :이 전송 학습을위한 내 코드입니다 나가 틀린 무언가를 행했는지 또는 모형 자체에 약간 구조상 문제점이다는 것을 밖으로. 후자의 경우 손실을 줄이기 위해 어떤 변경을 할 수 있으며 어떤 기술을 사용할 수 있습니까?

답변

0

VGG 16은 각 색상 채널에서 해당 평균 픽셀을 뺀 범위 [-128,128] (약)의 범위 [0,1]에있는 데이터에 대해 학습되지 않았습니다. 또한 VGG 16에는 BGR 형식의 데이터가 필요합니다.

사용 전처리 아래

def preprocess: 
    if data_format == 'channels_first': 
     if x.ndim == 3: 
      # 'RGB'->'BGR' 
      x = x[::-1, ...] 
      # Zero-center by mean pixel 
      x[0, :, :] -= 103.939 
      x[1, :, :] -= 116.779 
      x[2, :, :] -= 123.68 
     else: 
      x = x[:, ::-1, ...] 
      x[:, 0, :, :] -= 103.939 
      x[:, 1, :, :] -= 116.779 
      x[:, 2, :, :] -= 123.68 
    else: 
     # 'RGB'->'BGR' 
     x = x[..., ::-1] 
     # Zero-center by mean pixel 
     x[..., 0] -= 103.939 
     x[..., 1] -= 116.779 
     x[..., 2] -= 123.68 
    return x 
+0

감사합니다 (keras 소스 코드에서 가져온)! 나는 이것을 시도 할 것이다. 내가 잘못 본 것이 아니라면 'keras.applications.image_net_utils'아래에 'preprocess_input'으로 들어가 있지 않니? 그렇다면 그냥 preprocessing = preprocess_input을 ImageDataGenerator()의 인수에 넣을 수 있습니까? 이게 효과가 있니? – Varun

+0

네, 그 방법 일할 것입니다. 부차적 인 조정을하지 않으면 자신의 기능을 구현하는 데 도움이되며, 작동하는 경우 대답을 받아 들일 수 있습니다. – rajat