Keras实现小数量集图片分类——6类别Birds数据集分类

注:本文参考Keras官方文档以及素质云博客《keras系列︱图像多分类训练与利用bottleneck features进行微调(三)》

1 开发环境

开发平台:win8
开发框架:TensorFlow+Keras

2 数据集


数据集来源:birds
Birds数据库包含六个不同类别鸟类的600张图像(每个100个样本)。图像是可变分辨率的彩色JPEG。6个类别分别是:Egret、Mandarin duck、Snowy owl、Puffin、Toucan、Wood duck
我将其每个类别的001~090放入data/train下作为训练集,每个类别的091~100放入data/validation下作为验证集,目录结构如下。

// ~data/train
    egret:
        egr001.jpg
        ...
        egr002.jpg
    ...
    wood_duck:
        wod001.jpg
        ...
        wod002.jpg
// ~data/validation
    egret:
        egr091.jpg
        ...
        egr100.jpg
    ...
    wood_duck:
        wod091.jpg
        ...
        wod100.jpg

3 训练代码

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 = 150, 150

train_data_dir = 'data/train'
validation_data_dir = 'data/validation'
nb_train_samples = 540
nb_validation_samples = 60
epochs = 100
batch_size = 20

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

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(6)) #6分类
model.add(Activation('softmax')) #采用Softmax

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

# this is the augmentation configuration we will use for training
train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)

# this is the augmentation configuration we will use for testing:
# only rescaling
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)

4 训练结果

展示最后20次的结果

Epoch 80/100
27/27 [==============================] - 21s - loss: 0.2103 - acc: 0.9278 - val_
loss: 0.4891 - val_acc: 0.8833
Epoch 81/100
27/27 [==============================] - 21s - loss: 0.2369 - acc: 0.9241 - val_
loss: 0.8386 - val_acc: 0.8500
Epoch 82/100
27/27 [==============================] - 21s - loss: 0.1447 - acc: 0.9389 - val_
loss: 1.1145 - val_acc: 0.8000
Epoch 83/100
27/27 [==============================] - 21s - loss: 0.2737 - acc: 0.9185 - val_
loss: 0.8196 - val_acc: 0.7667
Epoch 84/100
27/27 [==============================] - 21s - loss: 0.2107 - acc: 0.9259 - val_
loss: 0.5744 - val_acc: 0.7833
Epoch 85/100
27/27 [==============================] - 21s - loss: 0.1727 - acc: 0.9426 - val_
loss: 1.2067 - val_acc: 0.6667
Epoch 86/100
27/27 [==============================] - 21s - loss: 0.2293 - acc: 0.9352 - val_
loss: 0.8090 - val_acc: 0.8167
Epoch 87/100
27/27 [==============================] - 23s - loss: 0.2150 - acc: 0.9296 - val_
loss: 0.7036 - val_acc: 0.8167
Epoch 88/100
27/27 [==============================] - 23s - loss: 0.2006 - acc: 0.9352 - val_
loss: 0.8294 - val_acc: 0.7667
Epoch 89/100
27/27 [==============================] - 23s - loss: 0.1698 - acc: 0.9333 - val_
loss: 0.7938 - val_acc: 0.7833
Epoch 90/100
27/27 [==============================] - 22s - loss: 0.1754 - acc: 0.9463 - val_
loss: 0.6783 - val_acc: 0.8500
Epoch 91/100
27/27 [==============================] - 23s - loss: 0.2323 - acc: 0.9167 - val_
loss: 0.9202 - val_acc: 0.8000
Epoch 92/100
27/27 [==============================] - 23s - loss: 0.2507 - acc: 0.9222 - val_
loss: 0.8597 - val_acc: 0.8000
Epoch 93/100
27/27 [==============================] - 22s - loss: 0.1849 - acc: 0.9370 - val_
loss: 0.6623 - val_acc: 0.8167
Epoch 94/100
27/27 [==============================] - 21s - loss: 0.1572 - acc: 0.9574 - val_
loss: 1.4205 - val_acc: 0.8167
Epoch 95/100
27/27 [==============================] - 21s - loss: 0.2404 - acc: 0.9278 - val_
loss: 0.7165 - val_acc: 0.8500
Epoch 96/100
27/27 [==============================] - 22s - loss: 0.2141 - acc: 0.9241 - val_
loss: 0.9163 - val_acc: 0.8167
Epoch 97/100
27/27 [==============================] - 25s - loss: 0.1735 - acc: 0.9481 - val_
loss: 0.6405 - val_acc: 0.8500
Epoch 98/100
27/27 [==============================] - 23s - loss: 0.2072 - acc: 0.9444 - val_
loss: 0.7469 - val_acc: 0.8167
Epoch 99/100
27/27 [==============================] - 21s - loss: 0.2677 - acc: 0.9278 - val_
loss: 0.5667 - val_acc: 0.8500
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值