2017-01-07 8 views
2

機械学習には新しく、コースはfast.aiになります。私たちはvgg16について学んでおり、私のモデルを保存するのに問題があります。私は何が間違っているのだろうか。私は猫と犬との違いを学ぶためのトレーニング、ゼロから自分のモデルを起動すると、私が手:model.save_weightsとmodel.load_weightsが期待通りに機能しない

from __future__ import division,print_function 
from vgg16 import Vgg16 
import os, json 
from glob import glob 
import numpy as np 
from matplotlib import pyplot as plt 
import utils; reload(utils) 
from utils import plots 


np.set_printoptions(precision=4, linewidth=100) 
batch_size=64 

path = "dogscats/sample" 
vgg = Vgg16() 
# Grab a few images at a time for training and validation. 
# NB: They must be in subdirectories named based on their category 
batches = vgg.get_batches(path+'/train', batch_size=batch_size) 
val_batches = vgg.get_batches(path+'/valid', batch_size=batch_size*2) 
vgg.finetune(batches) 
no_of_epochs = 4 
latest_weights_filename = None 
for epoch in range(no_of_epochs): 
    print ("Running epoch: %d" % epoch) 
    vgg.fit(batches, val_batches, nb_epoch=1) 
    latest_weights_filename = ('ft%d.h5' % epoch) 
    vgg.model.save_weights(path+latest_weights_filename) 
print ("Completed %s fit operations" % no_of_epochs) 

Found 160 images belonging to 2 classes. 
Found 40 images belonging to 2 classes. 
Running epoch: 0 
Epoch 1/1 
160/160 [==============================] - 4s - loss: 1.8980 - acc: 0.6125 - val_loss: 0.5442 - val_acc: 0.8500 
Running epoch: 1 
Epoch 1/1 
160/160 [==============================] - 4s - loss: 0.7194 - acc: 0.8563 - val_loss: 0.2167 - val_acc: 0.9500 
Running epoch: 2 
Epoch 1/1 
160/160 [==============================] - 4s - loss: 0.1809 - acc: 0.9313 - val_loss: 0.1604 - val_acc: 0.9750 
Running epoch: 3 
Epoch 1/1 
160/160 [==============================] - 4s - loss: 0.2733 - acc: 0.9375 - val_loss: 0.1684 - val_acc: 0.9750 
Completed 4 fit operations 

しかし、私は体重のいずれかのファイルをロードするために行くときに、今、モデルが最初から開始します!たとえば、私は以下のモデルが0.9750のval_accを持つことを期待していました!私は何か誤解しているのですか、何か間違っていますか?このロードされたモデルでval_accがなぜ低くなるのですか?

vgg = Vgg16() 
vgg.model.load_weights(path+'ft3.h5') 
batches = vgg.get_batches(path+'/train', batch_size=batch_size) 
val_batches = vgg.get_batches(path+'/valid', batch_size=batch_size*2) 
vgg.finetune(batches) 
vgg.fit(batches, val_batches, nb_epoch=1) 

Found 160 images belonging to 2 classes. 
Found 40 images belonging to 2 classes. 
Epoch 1/1 
160/160 [==============================] - 6s - loss: 1.3110 - acc: 0.6562 - val_loss: 0.5961 - val_acc: 0.8250 

答えて

2

問題はfinetune機能にあります。あなたがその定義をより深く得るとき:

def finetune(self, batches): 
    model = self.model 
    model.pop() 
    for layer in model.layers: layer.trainable=False 
    model.add(Dense(batches.nb_class, activation='softmax')) 
    self.compile() 

...一つはpop関数を呼び出すことによってそれを見ることができます - あなたのモデルの最後の層が削除されます。これを行うことで、訓練されたモデルから情報が失われています。最後のレイヤーにランダムウェイトを追加して、トレーニングを再開します。これが精度低下の原因です。

+0

ありがとうございます!私は 'load_weights'を私の' vgg.finetun(バッチ) 'の下に移動し、すべてが期待通りに機能しました! :) – Adam

関連する問題