使用VGG-16做kaggle cats vs dogs 影象分類
阿新 • • 發佈:2018-12-15
直接上程式碼
from keras.preprocessing.image import ImageDataGenerator from keras import optimizers import keras import os from keras import models from keras import layers from tensorflow.keras.callbacks import TensorBoard from keras.applications import VGG16 original_dataset_dir = '/home/ysy/tf_keras_learning/kagglecatsanddogs_3367a (1)' # Directories for our training, # validation and test splits train_dir = os.path.join(original_dataset_dir, 'train') #os.mkdir(train_dir) validation_dir = os.path.join(original_dataset_dir, 'validation') #os.mkdir(validation_dir) test_dir = os.path.join(original_dataset_dir, 'test') #os.mkdir(test_dir) # Directory with our training cat pictures train_cats_dir = os.path.join(train_dir, 'cats') #os.mkdir(train_cats_dir) # Directory with our training dog pictures train_dogs_dir = os.path.join(train_dir, 'dogs') #os.mkdir(train_dogs_dir) # Directory with our validation cat pictures validation_cats_dir = os.path.join(validation_dir, 'cats') #os.mkdir(validation_cats_dir) # Directory with our validation dog pictures validation_dogs_dir = os.path.join(validation_dir, 'dogs') #os.mkdir(validation_dogs_dir) # Directory with our validation cat pictures test_cats_dir = os.path.join(test_dir, 'cats') #os.mkdir(test_cats_dir) # Directory with our validation dog pictures test_dogs_dir = os.path.join(test_dir, 'dogs') #os.mkdir(test_dogs_dir) conv_base = VGG16(weights='imagenet', include_top=False, input_shape=(150, 150, 3)) NAME = "VGG-16_pretrain_1" print(NAME) model = models.Sequential() model.add(conv_base) model.add(layers.Flatten()) model.add(layers.Dense(256, activation='relu')) model.add(layers.Dense(1, activation='sigmoid')) conv_base.trainable = True set_trainable = False print('trainable weights is :',len(model.trainable_weights)) train_datagen = ImageDataGenerator( rescale=1./255, rotation_range=40, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest') test_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory( train_dir, target_size=(150, 150), batch_size=20, class_mode='binary') validation_generator = test_datagen.flow_from_directory( validation_dir, target_size=(150, 150), batch_size=20, class_mode='binary') tensorboard = TensorBoard(log_dir="logs/{}".format(NAME)) model.compile(loss='binary_crossentropy', optimizer=optimizers.RMSprop(lr=2e-5), metrics=['acc']) history = model.fit_generator( train_generator, steps_per_epoch=100, epochs=30, validation_data=validation_generator, validation_steps=50, verbose=2) model.save('VGG16_pretrain_all.model')
訓練結果
Epoch 28/30
- 29s - loss: 0.0979 - acc: 0.9635 - val_loss: 0.1180 - val_acc: 0.9630
Epoch 29/30
- 29s - loss: 0.1071 - acc: 0.9585 - val_loss: 0.0908 - val_acc: 0.9675
Epoch 30/30
- 29s - loss: 0.1029 - acc: 0.9555 - val_loss: 0.1363 - val_acc: 0.9605
測試程式碼
import sys import os from keras.preprocessing.image import ImageDataGenerator sys.path.remove("/opt/ros/kinetic/lib/python2.7/dist-packages") import cv2 import tensorflow as tf original_dataset_dir = '/home/ysy/tf_keras_learning/kagglecatsanddogs_3367a (1)' test_dir = os.path.join(original_dataset_dir, 'test') CATEGORIES = ["Dog", "Cat"] def prepare(filepath): IMG_SIZE = 150 new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE)) return new_array.reshape(-1, IMG_SIZE, IMG_SIZE, 1) model = tf.keras.models.load_model("VGG16_pretrain_all.model") test_datagen = ImageDataGenerator(rescale=1./255) test_generator = test_datagen.flow_from_directory( test_dir, target_size=(150, 150), batch_size=20, class_mode='binary') test_loss, test_acc = model.evaluate_generator(test_generator, steps=50) #prediction = model.predict([prepare('/home/ysy/tf_keras_learning/cat2.png')]) print('test acc:', test_acc) #print(prediction) #print(CATEGORIES[int(prediction[0][0])])
測試結果
Found 2000 images belonging to 2 classes.
test acc: 0.9649999928474426