2017-06-14 17 views
0

TFLearnで書かれたコードを参考にして、Kerasを使って書き直そうとしています。私は両方のパッケージにかなり新しいですし、私はそれを正しく書いたかどうかわかりません。TFLearnのコードをKerasで変換する

私は自分のコードを試してみましたが、うまくいきましたが、予想された結果が得られませんでした(精度は20 + epochs以上に改善されません)、私はどこかでミスを犯したのだろうかと思います。

私のデータに関して、私は 'train'と 'validation'ディレクトリを持つ 'data'ディレクトリを持っています。それぞれの中には、私の3つのイメージクラスのそれぞれに対応する3つのディレクトリがあります。

オリジナルTFLearnコード:Kerasを使用して

import numpy as np 
import tflearn 
from tflearn.layers.conv import conv_2d, max_pool_2d 
from tflearn.layers.core import input_data, dropout, fully_connected 
from tflearn.layers.estimator import regression 

def createModel(nbClasses,imageSize): 

    convnet = input_data(shape=[None, imageSize, imageSize, 1], name='input') 

    convnet = conv_2d(convnet, 64, 2, activation='elu', weights_init="Xavier") 
    convnet = max_pool_2d(convnet, 2) 

    convnet = conv_2d(convnet, 128, 2, activation='elu', weights_init="Xavier") 
    convnet = max_pool_2d(convnet, 2) 

    convnet = conv_2d(convnet, 256, 2, activation='elu', weights_init="Xavier") 
    convnet = max_pool_2d(convnet, 2) 

    convnet = conv_2d(convnet, 512, 2, activation='elu', weights_init="Xavier") 
    convnet = max_pool_2d(convnet, 2) 

    convnet = fully_connected(convnet, 1024, activation='elu') 
    convnet = dropout(convnet, 0.5) 

    convnet = fully_connected(convnet, nbClasses, activation='softmax') 
    convnet = regression(convnet, optimizer='rmsprop', loss='categorical_crossentropy') 

    model = tflearn.DNN(convnet) 
return model 

マイコード:

from keras import backend as K 
from keras.layers.core import Flatten, Dense, Dropout, Activation 
from keras.optimizers import rmsprop 
from keras.models import Sequential 
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img 
from keras.layers import Conv2D, MaxPooling2D, ZeroPadding2D 
import numpy as np 

num_classes = 3 
image_size = 256 
nb_epoch = 80 
batch_size = 32 
nb_train_samples = 7994 
nb_validation_samples = 2000 

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

model = Sequential() 

model.add(ZeroPadding2D((1,1), input_shape=input_shape)) 

model.add(Conv2D(64, 2, activation='elu', kernel_initializer='glorot_normal')) 
model.add(MaxPooling2D((2, 2))) 

model.add(Conv2D(128, 2, activation='elu', kernel_initializer='glorot_normal')) 
model.add(MaxPooling2D((2, 2))) 

model.add(Conv2D(256, 2, activation='elu', kernel_initializer='glorot_normal')) 
model.add(MaxPooling2D((2, 2))) 

model.add(Conv2D(512, 2, activation='elu', kernel_initializer='glorot_normal')) 
model.add(MaxPooling2D((2, 2))) 

model.add(Flatten()) 
model.add(Dense(1024)) 
model.add(Activation('elu')) 
model.add(Dropout(0.5)) 

model.add(Dense(num_classes)) 
model.add(Activation('softmax')) 
opt = rmsprop() 
model.compile(loss='categorical_crossentropy', 
     optimizer = opt, 
     metrics = ['accuracy']) 

train_data_dir = 'data/train' 
validation_data_dir = 'data/validation' 
train_datagen = ImageDataGenerator(rescale= 1./255) 
validation_datagen = ImageDataGenerator(rescale=1./255) 

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

validation_generator = validation_datagen.flow_from_directory(
    validation_data_dir, 
    target_size=(image_size, image_size), 
    batch_size=batch_size, 
    class_mode='categorical' 
    ) 



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

model.save_weights('first_try.h5') 
+0

どのようにデータをバッチし、どのように訓練しますか?あなたのコードを追加できますか? – petezurich

+0

私のコードの残りの部分を追加しました – Matt

+0

私は3つのクラスのMNISTデータセットであなたのコードを試しました。予想どおり、最初のエポックで精度が向上します。少なくともMNISTの場合は、最初の2つのConvレイヤーと64のDenseレイヤーを使用するだけで、はるかに高速にトレーニングできます。データに応じて、より単純なモデル(2 Convレイヤー)を試してみてください。そこから改善する。 – petezurich

答えて

0

私はMNISTデータセットには3つのクラスを使用してコードを試してみましたが、うまく訓練ができます。予想どおり、最初のエポックで精度が向上します。

MNISTの場合、最初の2つのConvレイヤーと64のDenseレイヤーを使用すると、はるかに速くトレーニングできます。データに応じて、より単純なモデル(2つのConvレイヤー)を試してみることをお勧めします。モデルは学習してからそこから改善する。

関連する問題