0
我使用TFLearn編寫的一些代碼作爲參考,並嘗試使用Keras重新編寫代碼。我對這兩個軟件包都比較陌生,但我不確定自己是否正確編寫了它。從TFLearn轉換代碼到Keras工作
我已經試過我的代碼 - 它的工作原理 - 但我沒有得到預期的結果(準確度沒有提高20多個時代),我想知道我是否在某個地方犯了錯誤。
就我的數據而言,我有一個'數據'目錄,其中有'訓練'和'驗證'目錄。每個內部都有3個目錄,分別用於我的3個圖像類。
原始TFLearn代碼:
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
我使用Keras代碼:
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')
你如何批量處理數據以及如何訓練?你可以添加你的代碼嗎? – petezurich
剛剛添加了我的代碼的其餘部分 – Matt
我試了你的代碼與MNIST數據集的三類,可以訓練得很好。如預期的那樣,準確度在第一時期增加。至少對於MNIST來說,我可以通過僅使用前兩個Conv圖層和64密集圖層來訓練得更快。根據您的數據,我建議您嘗試使用更簡單的模型(即2個Conv圖層),檢查模型是否正在學習以及然後從那裏改進。 – petezurich