本文地址:http://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

本文作者:Francois Chollet

  • 按照官方的文章实现过程有一些坑,彻底理解代码细节实现,理解keras的api具体使用方法
  • 也有很多人翻译这篇文章,但是有些没有具体实现细节
  • 另外keres开发者自己有本书的jupyter:Companion Jupyter notebooks for the book "Deep Learning with Python"
  • 另外我自己实验三收敛的准确率并没有0.94+,可以参考前面这本书上的实现
  • 文章一共有三个实验:
      1. 第一个实验使用自定义的神经网络对数据集进行训练,三层卷积加两层全连接,训练并验证网络的准确率;
      2. 第二个实验使用VGG16网络对数据进行训练,为了适应自定义的数据集,将VGG16网络的全连接层去掉,作者称之为 “Feature extraction”, 再在上面添加自己实现的全连接层,然后训练并验证网络准确性;
      3. 第三个实验称为 “fine-tune” ,利用第二个实验的实验模型和weight,重新训练VGG16的最后一个卷积层和自定义的全连接层,然后验证网络准确性;
  • 实验二的代码:
'''This script goes along the blog post
"Building powerful image classification models using very little data"
from blog.keras.io.
It uses data that can be downloaded at:
https://www.kaggle.com/c/dogs-vs-cats/data
In our setup, we:
- created a data/ folder
- created train/ and validation/ subfolders inside data/
- created cats/ and dogs/ subfolders inside train/ and validation/
- put the cat pictures index - in data/train/cats
- put the cat pictures index - in data/validation/cats
- put the dogs pictures index - in data/train/dogs
- put the dog pictures index - in data/validation/dogs
So that we have training examples for each class, and validation examples for each class.
In summary, this is our directory structure:
```
data/
train/
dogs/
dog001.jpg
dog002.jpg
...
cats/
cat001.jpg
cat002.jpg
...
validation/
dogs/
dog001.jpg
dog002.jpg
...
cats/
cat001.jpg
cat002.jpg
...
```
'''
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dropout, Flatten, Dense
from keras import applications # dimensions of our images.
img_width, img_height = , top_model_weights_path = 'bottleneck_fc_model.h5' data_root = 'M:/dataset/dog_cat/'
train_data_dir =data_root+ 'data/train'
validation_data_dir = data_root+'data/validation'
nb_train_samples =
nb_validation_samples =
epochs =
batch_size = def save_bottlebeck_features():
datagen = ImageDataGenerator(rescale=. / ) # build the VGG16 network
model = applications.VGG16(include_top=False, weights='imagenet') generator = datagen.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode=None,
shuffle=False)
bottleneck_features_train = model.predict_generator(
generator, nb_train_samples // batch_size) #####2000//batch_size!!!!!!!!!!
np.save('bottleneck_features_train.npy',
bottleneck_features_train) generator = datagen.flow_from_directory(
validation_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode=None,
shuffle=False)
bottleneck_features_validation = model.predict_generator(
generator, nb_validation_samples // batch_size)
np.save('bottleneck_features_validation.npy',
bottleneck_features_validation) def train_top_model():
train_data = np.load('bottleneck_features_train.npy')
train_labels = np.array([] * int(nb_train_samples / ) + [] * int(nb_train_samples / )) validation_data = np.load('bottleneck_features_validation.npy')
validation_labels = np.array([] * int(nb_validation_samples / ) + [] * int(nb_validation_samples / )) model = Sequential()
model.add(Flatten(input_shape=train_data.shape[:]))
model.add(Dense(, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(, activation='sigmoid')) model.compile(optimizer='rmsprop',
loss='binary_crossentropy', metrics=['accuracy']) model.fit(train_data, train_labels,
epochs=epochs,
batch_size=batch_size,
validation_data=(validation_data, validation_labels))
model.save_weights(top_model_weights_path) #save_bottlebeck_features()
train_top_model()
  • 实验三代码,自己添加了一些api使用方法,也是以后可以参考的:
'''This script goes along the blog post
"Building powerful image classification models using very little data"
from blog.keras.io.
It uses data that can be downloaded at:
https://www.kaggle.com/c/dogs-vs-cats/data
In our setup, we:
- created a data/ folder
- created train/ and validation/ subfolders inside data/
- created cats/ and dogs/ subfolders inside train/ and validation/
- put the cat pictures index - in data/train/cats
- put the cat pictures index - in data/validation/cats
- put the dogs pictures index - in data/train/dogs
- put the dog pictures index - in data/validation/dogs
So that we have training examples for each class, and validation examples for each class.
In summary, this is our directory structure:
```
data/
train/
dogs/
dog001.jpg
dog002.jpg
...
cats/
cat001.jpg
cat002.jpg
...
validation/
dogs/
dog001.jpg
dog002.jpg
...
cats/
cat001.jpg
cat002.jpg
...
```
''' # thanks sove bug @http://blog.csdn.net/aggresss/article/details/78588135 from keras import applications
from keras.preprocessing.image import ImageDataGenerator
from keras import optimizers
from keras.models import Sequential
from keras.layers import Dropout, Flatten, Dense
from keras.models import Model
from keras.regularizers import l2 # path to the model weights files.
weights_path = '../keras/examples/vgg16_weights.h5'
top_model_weights_path = 'bottleneck_fc_model.h5'
# dimensions of our images.
img_width, img_height = , data_root = 'M:/dataset/dog_cat/'
train_data_dir =data_root+ 'data/train'
validation_data_dir = data_root+'data/validation' nb_train_samples =
nb_validation_samples =
epochs =
batch_size = # build the VGG16 network
base_model = applications.VGG16(weights='imagenet', include_top=False, input_shape=(,,)) # train 指定训练大小
print('Model loaded.') # build a classifier model to put on top of the convolutional model
top_model = Sequential()
top_model.add(Flatten(input_shape=base_model.output_shape[:])) # base_model.output_shape[:])
top_model.add(Dense(, activation='relu',kernel_regularizer=l2(0.001),))
top_model.add(Dropout(0.8))
top_model.add(Dense(, activation='sigmoid')) # note that it is necessary to start with a fully-trained
# classifier, including the top classifier,
# in order to successfully do fine-tuning
top_model.load_weights(top_model_weights_path) # add the model on top of the convolutional base
# model.add(top_model) # bug model = Model(inputs=base_model.input, outputs=top_model(base_model.output)) # set the first layers (up to the last conv block)
# to non-trainable (weights will not be updated)
for layer in model.layers[:]: # : bug
layer.trainable = False # compile the model with a SGD/momentum optimizer
# and a very slow learning rate.
model.compile(loss='binary_crossentropy',
optimizer=optimizers.SGD(lr=1e-, momentum=0.9),
metrics=['accuracy']) # prepare data augmentation configuration
train_datagen = ImageDataGenerator(
rescale=. / ,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True) test_datagen = ImageDataGenerator(rescale=. / ) train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='binary') validation_generator = test_datagen.flow_from_directory(
validation_data_dir,
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='binary') model.summary() # prints a summary representation of your model.
# let's visualize layer names and layer indices to see how many layers
# we should freeze:
for i, layer in enumerate(base_model.layers):
print(i, layer.name) from keras.utils import plot_model
plot_model(model, to_file='model.png') from keras.callbacks import History
from keras.callbacks import ModelCheckpoint
import keras
history = History()
model_checkpoint = ModelCheckpoint('temp_model.hdf5', monitor='loss', save_best_only=True)
tb_cb = keras.callbacks.TensorBoard(log_dir='log', write_images=, histogram_freq=)
# 设置log的存储位置,将网络权值以图片格式保持在tensorboard中显示,设置每一个周期计算一次网络的
# 权值,每层输出值的分布直方图
callbacks = [
history,
model_checkpoint,
tb_cb
]
# model.fit() # fine-tune the model
history=model.fit_generator(
train_generator,
steps_per_epoch=nb_train_samples // batch_size,
epochs=epochs,
callbacks=callbacks,
validation_data=validation_generator,
validation_steps=nb_validation_samples // batch_size,
verbose = ) model.save('fine_tune_model.h5')
model.save_weights('fine_tune_model_weight')
print(history.history) from matplotlib import pyplot as plt
history=history
plt.plot()
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
# summarize history for loss
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show() import numpy as np
accy=history.history['acc']
np_accy=np.array(accy)
np.savetxt('save_acc.txt',np_accy)
  • result
Model loaded.
Found images belonging to classes.
Found images belonging to classes.
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, , , )
_________________________________________________________________
block1_conv1 (Conv2D) (None, , , )
_________________________________________________________________
block1_conv2 (Conv2D) (None, , , )
_________________________________________________________________
block1_pool (MaxPooling2D) (None, , , )
_________________________________________________________________
block2_conv1 (Conv2D) (None, , , )
_________________________________________________________________
block2_conv2 (Conv2D) (None, , , )
_________________________________________________________________
block2_pool (MaxPooling2D) (None, , , )
_________________________________________________________________
block3_conv1 (Conv2D) (None, , , )
_________________________________________________________________
block3_conv2 (Conv2D) (None, , , )
_________________________________________________________________
block3_conv3 (Conv2D) (None, , , )
_________________________________________________________________
block3_pool (MaxPooling2D) (None, , , )
_________________________________________________________________
block4_conv1 (Conv2D) (None, , , )
_________________________________________________________________
block4_conv2 (Conv2D) (None, , , )
_________________________________________________________________
block4_conv3 (Conv2D) (None, , , )
_________________________________________________________________
block4_pool (MaxPooling2D) (None, , , )
_________________________________________________________________
block5_conv1 (Conv2D) (None, , , )
_________________________________________________________________
block5_conv2 (Conv2D) (None, , , )
_________________________________________________________________
block5_conv3 (Conv2D) (None, , , )
_________________________________________________________________
block5_pool (MaxPooling2D) (None, , , )
_________________________________________________________________
sequential_1 (Sequential) (None, )
=================================================================
Total params: ,,
Trainable params: ,,
Non-trainable params: ,,
_________________________________________________________________
input_1
block1_conv1
block1_conv2
block1_pool
block2_conv1
block2_conv2
block2_pool
block3_conv1
block3_conv2
block3_conv3
block3_pool
block4_conv1
block4_conv2
block4_conv3
block4_pool
block5_conv1
block5_conv2
block5_conv3
block5_pool
Backend TkAgg is interactive backend. Turning interactive mode on.

最新文章

  1. Android开发-动态布局小记
  2. 关于JAVA日志
  3. Android-Activity使用(2) -传值
  4. SC.UI
  5. linux chomd 学习
  6. 教你50招提升ASP.NET性能(二十二):利用.NET 4.5异步结构
  7. zend studio 9.0.4 安装破解
  8. OA的一些概念
  9. c++实现精确计时
  10. POJ 3892 RSA Factorization
  11. #最小生成树# #kruskal# ----- OpenJudge丛林中的路
  12. div自身高度、屏幕高度
  13. .Net 特性 attribute 学习 ----自定义特性
  14. [SCOI2015]小凸玩矩阵
  15. JDBC遇到向ORACLE数据库表执行插入操作时,报错“列在此处不允许”
  16. linux增加,删除用户组,解压缩命令,VIM使用命令
  17. struts建立工程helloworld
  18. Bayesian generalized linear model (GLM) | 贝叶斯广义线性回归实例
  19. SFTP 常用命令 —— SecureCRT版本
  20. eclipse 配置动态web项目在servers中运行

热门文章

  1. Python虚拟机函数机制之无参调用(一)
  2. android:exported属性
  3. luogu2766 最长不下降子序列问题
  4. tarjan - tarjan的几种用法
  5. webdriver高级应用- 无人工干预地自动下载某个文件
  6. 根据已经commit的数据,进行leader和peon之间的同步
  7. 九度oj 题目1465:最简真分数
  8. 九度oj 题目1443:Tr A
  9. 【bzoj4407】于神之怒加强版 莫比乌斯反演+线性筛
  10. Github与Eclipse连接(方法2成功:Pleiades)