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()
모델은 미세 조정에 대한 코드 :이 전송 학습을위한 내 코드입니다 나가 틀린 무언가를 행했는지 또는 모형 자체에 약간 구조상 문제점이다는 것을 밖으로. 후자의 경우 손실을 줄이기 위해 어떤 변경을 할 수 있으며 어떤 기술을 사용할 수 있습니까?
감사합니다 (keras 소스 코드에서 가져온)! 나는 이것을 시도 할 것이다. 내가 잘못 본 것이 아니라면 'keras.applications.image_net_utils'아래에 'preprocess_input'으로 들어가 있지 않니? 그렇다면 그냥 preprocessing = preprocess_input을 ImageDataGenerator()의 인수에 넣을 수 있습니까? 이게 효과가 있니? – Varun
네, 그 방법 일할 것입니다. 부차적 인 조정을하지 않으면 자신의 기능을 구현하는 데 도움이되며, 작동하는 경우 대답을 받아 들일 수 있습니다. – rajat