Keras 最新《面向小数据集构建图像分类模型》
本文地址: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.
- reference: 第八期 使用 Keras 训练神经网络 《显卡就是开发板》
Keras 最新《面向小数据集构建图像分类模型》的更多相关文章
- 面向小数据集构建图像分类模型Keras
文章信息 本文地址:http://blog.keras.io/building-powerful-image-classification-models-using-very-little-data. ...
- 我的Keras使用总结(2)——构建图像分类模型(针对小数据集)
Keras基本的使用都已经清楚了,那么这篇主要学习如何使用Keras进行训练模型,训练训练,主要就是“练”,所以多做几个案例就知道怎么做了. 在本文中,我们将提供一些面向小数据集(几百张到几千张图片) ...
- 硬货 | 手把手带你构建视频分类模型(附Python演练))
译者 | VK 来源 | Analytics Vidhya 概述 了解如何使用计算机视觉和深度学习技术处理视频数据 我们将在Python中构建自己的视频分类模型 这是一个非常实用的视频分类教程,所以准 ...
- 使用 keras 和 tfjs 构建血细胞分类模型
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识!
- Recorder︱深度学习小数据集表现、优化(Active Learning)、标注集网络获取
一.深度学习在小数据集的表现 深度学习在小数据集情况下获得好效果,可以从两个角度去解决: 1.降低偏差,图像平移等操作 2.降低方差,dropout.随机梯度下降 先来看看深度学习在小数据集上表现的具 ...
- ML.NET 示例:图像分类模型训练-首选API(基于原生TensorFlow迁移学习)
ML.NET 版本 API 类型 状态 应用程序类型 数据类型 场景 机器学习任务 算法 Microsoft.ML 1.5.0 动态API 最新 控制台应用程序和Web应用程序 图片文件 图像分类 基 ...
- keras入门(三)搭建CNN模型破解网站验证码
项目介绍 在文章CNN大战验证码中,我们利用TensorFlow搭建了简单的CNN模型来破解某个网站的验证码.验证码如下: 在本文中,我们将会用Keras来搭建一个稍微复杂的CNN模型来破解以上的 ...
- Keras(一)Sequential与Model模型、Keras基本结构功能
keras介绍与基本的模型保存 思维导图 1.keras网络结构 2.keras网络配置 3.keras预处理功能 模型的节点信息提取 config = model.get_config() 把mod ...
- PLUTO平台是由美林数据技术股份有限公司下属西安交大美林数据挖掘研究中心自主研发的一款基于云计算技术架构的数据挖掘产品,产品设计严格遵循国际数据挖掘标准CRISP-DM(跨行业数据挖掘过程标准),具备完备的数据准备、模型构建、模型评估、模型管理、海量数据处理和高纬数据可视化分析能力。
http://www.meritdata.com.cn/article/90 PLUTO平台是由美林数据技术股份有限公司下属西安交大美林数据挖掘研究中心自主研发的一款基于云计算技术架构的数据挖掘产品, ...
随机推荐
- managed unmanaged
Enable function-level control for compiling functions as managed or unmanaged. #pragma managed # ...
- webpack 环境搭建+实现热更新
让我们一起构建一个小的app 为了便于你更好的了解Webpack带来的好处,我们将会构建一个非常小的app并将资源文件打包.在这个教程中我推荐基于Node4或Node5和NPM3来进行开发,这样就避免 ...
- Spring Cloud(2.0)能力大致列表
微服务九大特性 出自Martin Fowler的<Microservices> 服务组件化 按业务组织团队 做"产品"的态度 智能端点与哑管道 去中心化治理 去中心化管 ...
- Web网站性能测试分析及调优实例
1 背景 前段时间,性能测试团队经历了一个规模较大的门户网站的性能优化工作,该网站的开发和合作涉及多个组织和部门,而且网站的重要性不言而喻,同时上线时间非常紧迫,关注度也很高,所以对于整个团队的压 ...
- day01_07.逻辑与字符串运算符
&&(并且)====>发现&符号总是打错,记忆口令:&7(暗器),在数字7上面,在python中是and ||(或者)====>在python中是or . ...
- Python生成器、三元表达式、列表生成式、字典生成式、生成器表达式
什么是生成器:只要函数内部包含有yield关键字,那么函数名()的到的结果(生成器地址)就是生成器,再调用函数不会执行函数内部代码这个生成器本身有 _iter_ he _next_功能(即生成器 ...
- [python IO学习篇] 补充中文编码
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386820066616a7 ...
- hibernate缓存机制【转】
一.why(为什么要用Hibernate缓存?) Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数 ...
- 【Luogu】P3971Alice And Bob(贪心)
题目链接 容易发现值为x的点只可能从值为x-1的点转移过来,所以我们把原序列连成一棵树,dfs序就是原序列的一种形式. 就可以直接求啦 #include<cstdio> #include& ...
- 古代猪文 BZOJ 1951
古代猪文 [问题描述] “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边 ...