本文地址: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.

Keras 最新《面向小数据集构建图像分类模型》的更多相关文章

  1. 面向小数据集构建图像分类模型Keras

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

  2. 我的Keras使用总结(2)——构建图像分类模型(针对小数据集)

    Keras基本的使用都已经清楚了,那么这篇主要学习如何使用Keras进行训练模型,训练训练,主要就是“练”,所以多做几个案例就知道怎么做了. 在本文中,我们将提供一些面向小数据集(几百张到几千张图片) ...

  3. 硬货 | 手把手带你构建视频分类模型(附Python演练))

    译者 | VK 来源 | Analytics Vidhya 概述 了解如何使用计算机视觉和深度学习技术处理视频数据 我们将在Python中构建自己的视频分类模型 这是一个非常实用的视频分类教程,所以准 ...

  4. 使用 keras 和 tfjs 构建血细胞分类模型

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识!

  5. Recorder︱深度学习小数据集表现、优化(Active Learning)、标注集网络获取

    一.深度学习在小数据集的表现 深度学习在小数据集情况下获得好效果,可以从两个角度去解决: 1.降低偏差,图像平移等操作 2.降低方差,dropout.随机梯度下降 先来看看深度学习在小数据集上表现的具 ...

  6. ML.NET 示例:图像分类模型训练-首选API(基于原生TensorFlow迁移学习)

    ML.NET 版本 API 类型 状态 应用程序类型 数据类型 场景 机器学习任务 算法 Microsoft.ML 1.5.0 动态API 最新 控制台应用程序和Web应用程序 图片文件 图像分类 基 ...

  7. keras入门(三)搭建CNN模型破解网站验证码

    项目介绍   在文章CNN大战验证码中,我们利用TensorFlow搭建了简单的CNN模型来破解某个网站的验证码.验证码如下: 在本文中,我们将会用Keras来搭建一个稍微复杂的CNN模型来破解以上的 ...

  8. Keras(一)Sequential与Model模型、Keras基本结构功能

    keras介绍与基本的模型保存 思维导图 1.keras网络结构 2.keras网络配置 3.keras预处理功能 模型的节点信息提取 config = model.get_config() 把mod ...

  9. PLUTO平台是由美林数据技术股份有限公司下属西安交大美林数据挖掘研究中心自主研发的一款基于云计算技术架构的数据挖掘产品,产品设计严格遵循国际数据挖掘标准CRISP-DM(跨行业数据挖掘过程标准),具备完备的数据准备、模型构建、模型评估、模型管理、海量数据处理和高纬数据可视化分析能力。

    http://www.meritdata.com.cn/article/90 PLUTO平台是由美林数据技术股份有限公司下属西安交大美林数据挖掘研究中心自主研发的一款基于云计算技术架构的数据挖掘产品, ...

随机推荐

  1. Python虚拟机函数机制之位置参数(四)

    位置参数的传递 前面我们已经分析了无参函数的调用过程,我们来看看Python是如何来实现带参函数的调用的.其实,基本的调用流程与无参函数一样,而不同的是,在调用带参函数时,Python虚拟机必须传递参 ...

  2. 认识Function.prototype.call

    一.前言                                大家先预计一下以下四个函数调用的结果吧! var test = function(){ console.log('hello w ...

  3. 贪心 - [POI2006]ORK-Ploughing

    [POI2006]ORK-Ploughing 描述 Byteasar 想耕种他那块矩形的田,他每次能耕种矩形的一边(上下左右都行),在他每次耕完后,剩下的田也一定是矩形,每块小区域边长为 1,耕地的长 ...

  4. ThreeJs 基础入门

    本文来自网易云社区 作者:唐钊 Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它在 web 中创建各种三维场景,包括了摄影机.光影.材质等各种对象.使用它可以让我们更加直观的了解 we ...

  5. webdriver高级应用- 在HTML5的画布元素上进行绘画操作

    #encoding=utf-8 import unittest from selenium import webdriver import time class TestDemo(unittest.T ...

  6. Python学习-day7 类 部分socket

    这周还是继续关于类的学习,在面向对象的学习过程中又学习了网络编程,并且提交了编写FTP的作业. 复习一下类的相关概念和定义 类      属性           实例变量:内存中           ...

  7. 如何解决border的重叠问题

    我现在在做一个ul列表,然后给每个li加上边框,但是加完了之后,相邻列表的边框就会变成2px,比如第一个li的下边框和第二个li的上边框就会重叠在一起,请问这有什么办法解决一下么? 解决方法是: 试试 ...

  8. TOJ4168: Same Digits

    4168: Same Digits  Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByteTotal Submit: 11 ...

  9. Hadoop全分布式模式安装

    一.准备 1.准备至少三台linux服务器,并安装JDK 关闭防火墙如下 systemctl stop firewalld.service systemctl disable firewalld.se ...

  10. oracle中的dual表

    dual表是和Oracle数据字典一起创建的.它实际上只包含dummy这一个column,并且只有一条记录,这条记录的值是X. X dual表的owner是SYS,但所有用户都可以访问它.Althou ...