2017-11-27 4 views
0

keras를 사용하여 VGG 네트워크에서 약간의 실험을하고 있습니다. 내가 사용하는 데이터 세트는 장미, 해바라기, 민들레, 튤립 및 데이지를 포함한 5 개 클래스의 꽃 데이터 세트입니다.keras가있는 꽃 데이터 집합에 vgg를 적용하고 유효성 검사 손실이 변경되지 않음

알아낼 수없는 것이 있습니다.작은 CNN 네트워크 (아래 코드에서 VGG가 아님)를 사용했을 때 신속하게 수렴되어 약 8 개의 신기원 이후 약 75 %의 유효성 검사 정확도에 도달했습니다.

그런 다음 VGG 네트워크 (코드의 주석 처리 된 영역)로 전환했습니다. =================

신기원 1/50 401분의 402 [: 네트워크의 손실과 정확성 그냥 출력 뭔가처럼 전혀 변경하지 않은 =============] - 199s의 495ms/스텝 - 손실 : 13.3214 - ACC : 0.1713 - val_loss : 13.0144 - val_acc : 0.1926

에포크 50분의 2 401분의 402 [== ========================================================================= 1903 473ms/단계 손실 : 13.3473 - acc : 0.1719 - val_loss : 13.0144 - val_acc : 0.1926

에포크 50분의 3 401분의 402 [==============================] - 204 С에서 508ms/스텝 - 손실 : 13.3423 - acc : 0.1722 - val_loss : 13.0144 - val_acc : 0.1926

신기원 4/50 402/401 [===========] 190s 472ms/step - 손실 : 13.3522 - acc : 0.1716 - val_loss : 13.0144 - val_acc : 0.1926

Epoch 5/50 402/401 [==================== ========] - 189s의 471ms/스텝 - 손실 : 13.3364 - ACC : 0.1726 - val_loss : 13.0144 - val_acc : 0.1926

에포크 50분의 6 401분의 402 [======= =========================== - 189 초 471ms/단계 손실 : 13.3453 - acc : 0.1720 - val_loss : 13.0144 - val_acc : 0.1926 Epoch 7/50

에포크 7/50 402/401 [=============] - 189 초 471ms/단계 손실 : 13.3503 - ACC : 0.1717 - val_loss : 13.0144 - val_acc : 0.1926

PS : 나는 (tensorflow 슬림과 place365 데이터 세트)뿐만 아니라 다른 데이터 세트 및 프레임 워크와이 실험을했다. 결과는 동일합니다. 저는 VGG 논문 (Simonyan & Zisserman)을 살펴 봤습니다. 다른 네트워크 구조를 가진 무대 A에서 무대 E와 같이 VGG와 같은 깊은 네트워크를 훈련하는 데는 여러 단계가 있다고합니다. 내 VGG 네트워크를 VGG 논문에서 설명한 것과 같은 방식으로 교육해야하는지 확신 할 수 없습니다. 그리고 다른 온라인 코스도이 복잡한 교육 과정을 언급하지 않았습니다. 누구나 아이디어가 있습니까?

내 코드 : 해결

from keras.preprocessing.image import ImageDataGenerator 
from keras.models import Sequential 
from keras.layers import Conv2D, MaxPooling2D 
from keras.layers import Activation, Dropout, Flatten, Dense 
from keras import backend as K 


# dimensions of our images. 
img_width, img_height = 224, 224 

train_data_dir = './data/train' 
validation_data_dir = './data/val' 
nb_train_samples = 3213 
nb_validation_samples = 457 
epochs = 50 
batch_size = 8 

if K.image_data_format() == 'channels_first': 
    input_shape = (3, img_width, img_height) 
else: 
    input_shape = (img_width, img_height, 3) 

# random cnn model: 
model = Sequential() 
model.add(Conv2D(32, (3, 3), input_shape=input_shape)) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Conv2D(32, (3, 3))) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Conv2D(64, (3, 3))) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Flatten()) 
model.add(Dense(64)) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(5)) 
model.add(Activation('softmax')) 

# vgg model: 
'''model = Sequential([ 
    Conv2D(64, (3, 3), input_shape=input_shape, padding='same', 
      activation='relu'), 
    Conv2D(64, (3, 3), activation='relu', padding='same'), 
    MaxPooling2D(pool_size=(2, 2), strides=(2, 2)), 
    Conv2D(128, (3, 3), activation='relu', padding='same'), 
    Conv2D(128, (3, 3), activation='relu', padding='same',), 
    MaxPooling2D(pool_size=(2, 2), strides=(2, 2)), 
    Conv2D(256, (3, 3), activation='relu', padding='same',), 
    Conv2D(256, (3, 3), activation='relu', padding='same',), 
    Conv2D(256, (3, 3), activation='relu', padding='same',), 
    MaxPooling2D(pool_size=(2, 2), strides=(2, 2)), 
    Conv2D(512, (3, 3), activation='relu', padding='same',), 
    Conv2D(512, (3, 3), activation='relu', padding='same',), 
    Conv2D(512, (3, 3), activation='relu', padding='same',), 
    MaxPooling2D(pool_size=(2, 2), strides=(2, 2)), 
    Conv2D(512, (3, 3), activation='relu', padding='same',), 
    Conv2D(512, (3, 3), activation='relu', padding='same',), 
    Conv2D(512, (3, 3), activation='relu', padding='same',), 
    MaxPooling2D(pool_size=(2, 2), strides=(2, 2)), 
    Flatten(), 
    Dense(256, activation='relu'), 
    Dense(256, activation='relu'), 
    Dense(5, activation='softmax') 
])''' 


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

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

test_datagen = ImageDataGenerator(rescale=1./255) 

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

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

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

model.save_weights('flowers.h5') 

답변

0

문제는, 나는 0.0001 내 학습 속도를 변경했습니다. 이제 배우기 시작합니다. 0.001은 충분히 작지 않은 것 같습니다.