Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【Keras篇】---利用keras改写VGG16经典模型在手写数字识别体中的应用

【Keras篇】---利用keras改写VGG16经典模型在手写数字识别体中的应用

作者头像
LhWorld哥陪你聊算法
发布于 2018-09-13 06:57:51
发布于 2018-09-13 06:57:51
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

一、前述

VGG16是由16层神经网络构成的经典模型,包括多层卷积,多层全连接层,一般我们改写的时候卷积层基本不动,全连接层从后面几层依次向前改写,因为先改参数较小的。

二、具体

1、因为本文中代码需要依赖OpenCV,所以第一步先安装OpenCV

因为VGG要求输入244*244,而数据集是28*28的,所以需要通过OpenCV在代码里去改变。

2、把模型下载后离线放入用户的管理目录下面,这样训练的时候就不需要从网上再下载了

3、我们保留的是除了全连接的所有层。

4、选择数据生成器,在真正使用的时候才会生成数据,加载到内存,前面yield只是做了一个标记

 代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 使用迁移学习的思想,以VGG16作为模板搭建模型,训练识别手写字体
# 引入VGG16模块
from keras.applications.vgg16 import VGG16

# 其次加载其他模块
from keras.layers import Input
from keras.layers import Flatten
from keras.layers import Dense
from keras.layers import Dropout
from keras.models import Model
from keras.optimizers import SGD

# 加载字体库作为训练样本
from keras.datasets import mnist

# 加载OpenCV(在命令行中窗口中输入pip install opencv-python),这里为了后期对图像的处理,
# 大家使用pip install C:\Users\28542\Downloads\opencv_python-3.4.1+contrib-cp35-cp35m-win_amd64.whl
# 比如尺寸变化和Channel变化。这些变化是为了使图像满足VGG16所需要的输入格式
import cv2
import h5py as h5py
import numpy as np

# 建立一个模型,其类型是Keras的Model类对象,我们构建的模型会将VGG16顶层(全连接层)去掉,只保留其余的网络
# 结构。这里用include_top = False表明我们迁移除顶层以外的其余网络结构到自己的模型中
# VGG模型对于输入图像数据要求高宽至少为48个像素点,由于硬件配置限制,我们选用48个像素点而不是原来
# VGG16所采用的224个像素点。即使这样仍然需要24GB以上的内存,或者使用数据生成器
model_vgg = VGG16(include_top=False, weights='imagenet', input_shape=(48, 48, 3))#输入进来的数据是48*48 3通道
#选择imagnet,会选择当年大赛的初始参数
#include_top=False 去掉最后3层的全连接层看源码可知
for layer in model_vgg.layers:
    layer.trainable = False#别去调整之前的卷积层的参数
model = Flatten(name='flatten')(model_vgg.output)#去掉全连接层,前面都是卷积层
model = Dense(4096, activation='relu', name='fc1')(model)
model = Dense(4096, activation='relu', name='fc2')(model)
model = Dropout(0.5)(model)
model = Dense(10, activation='softmax')(model)#model就是最后的y
model_vgg_mnist = Model(inputs=model_vgg.input, outputs=model, name='vgg16')
#把model_vgg.input  X传进来
#把model Y传进来 就可以训练模型了

# 打印模型结构,包括所需要的参数
model_vgg_mnist.summary()


#以下是原版的模型结构 224*224
model_vgg = VGG16(include_top=False, weights='imagenet', input_shape=(224, 224, 3))
for layer in model_vgg.layers:
    layer.trainable = False#别去调整之前的卷积层的参数
model = Flatten()(model_vgg.output)
model = Dense(4096, activation='relu', name='fc1')(model)
model = Dense(4096, activation='relu', name='fc2')(model)
model = Dropout(0.5)(model)
model = Dense(10, activation='softmax', name='prediction')(model)
model_vgg_mnist_pretrain = Model(model_vgg.input, model, name='vgg16_pretrain')

model_vgg_mnist_pretrain.summary()

# 新的模型不需要训练原有卷积结构里面的1471万个参数,但是注意参数还是来自于最后输出层前的两个
# 全连接层,一共有1.2亿个参数需要训练
sgd = SGD(lr=0.05, decay=1e-5)#lr 学习率 decay 梯度的逐渐减小 每迭代一次梯度就下降 0.05*1-10-5))这样来变
#随着越来越下降 学习率越来越小 步子越小
model_vgg_mnist.compile(loss='categorical_crossentropy',
                                 optimizer=sgd, metrics=['accuracy'])

# 因为VGG16对网络输入层需要接受3通道的数据的要求,我们用OpenCV把图像从32*32变成224*224,把黑白图像转成RGB图像
# 并把训练数据转化成张量形式,供keras输入
(X_train, y_train), (X_test, y_test) = mnist.load_data("../test_data_home")
X_train, y_train = X_train[:1000], y_train[:1000]#训练集1000条
X_test, y_test = X_test[:100], y_test[:100]#测试集100条
X_train = [cv2.cvtColor(cv2.resize(i, (48, 48)), cv2.COLOR_GRAY2RGB)
           for i in X_train]#变成彩色的
#np.concatenate拼接到一起把
X_train = np.concatenate([arr[np.newaxis] for arr in X_train]).astype('float32')

X_test = [cv2.cvtColor(cv2.resize(i, (48, 48)), cv2.COLOR_GRAY2RGB)
          for i in X_test]
X_test = np.concatenate([arr[np.newaxis] for arr in X_test]).astype('float32')

print(X_train.shape)
print(X_test.shape)

X_train = X_train / 255
X_test = X_test / 255


def tran_y(y):
    y_ohe = np.zeros(10)
    y_ohe[y] = 1
    return y_ohe


y_train_ohe = np.array([tran_y(y_train[i]) for i in range(len(y_train))])
y_test_ohe = np.array([tran_y(y_test[i]) for i in range(len(y_test))])

model_vgg_mnist.fit(X_train, y_train_ohe, validation_data=(X_test, y_test_ohe),
                             epochs=100, batch_size=50)

 结果:

 自定义的网络层:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-03-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深度学习|Keras识别MNIST手写数字(CNN)
今天继续使用MNIST数据。 方法: 这次使用的方法为卷积神经网络(CNN)。卷积神经网络通过卷积层,池化层来做特征的提取,最后再连上全连接网络。
罗罗攀
2019/02/22
1.4K0
深度学习|Keras识别MNIST手写数字(CNN)
深度学习|Keras识别MNIST手写数字(一)
MNIST数据集是收集的手写字体,为单色图像,共有训练集60000项,测试数据集10000项。 建模方法我们使用最简单的神经网络模型,多层感知器(MLP)。
罗罗攀
2019/02/22
1.1K0
深度学习|Keras识别MNIST手写数字(一)
Keras 学习笔记(三)Keras Sequential 顺序模型
你可以通过将网络层实例的列表传递给 Sequential 的构造器,来创建一个 Sequential 模型:
种花家的奋斗兔
2020/11/12
2.4K0
【Keras】Keras入门指南
在用了一段时间的Keras后感觉真的很爽,所以特意祭出此文与我们公众号的粉丝分享。 Keras是一个非常方便的深度学习框架,它以TensorFlow或Theano为后端。用它可以快速地搭建深度网络,灵活地选取训练参数来进行网路训练。总之就是:灵活+快速!
keloli
2018/09/13
2.1K0
【Keras篇】---Keras初始,两种模型构造方法,利用keras实现手写数字体识别
Keras 适合快速体验 ,keras的设计是把大量内部运算都隐藏了,用户始终可以用theano或tensorflow的语句来写扩展功能并和keras结合使用。
LhWorld哥陪你聊算法
2018/09/13
1.1K0
【Keras篇】---Keras初始,两种模型构造方法,利用keras实现手写数字体识别
超快速!10分钟入门Keras指南
作者:李中粱 小编:赵一帆 1 Keras框架介绍 在用了一段时间的Keras后感觉真的很爽,所以特意祭出此文与我们公众号的粉丝分享。 Keras是一个非常方便的深度学习框架,它以TensorFlow或Theano为后端。用它可以快速地搭建深度网络,灵活地选取训练参数来进行网路训练。总之就是:灵活+快速!!! 2 安装Keras 首先你需要有一个Python开发环境,直接点就用Anaconda,然后在CMD命令行中安装: # GPU 版本 >>> pip install --upgrade tensorf
机器学习算法工程师
2018/03/30
1.3K0
超快速!10分钟入门Keras指南
[Kaggle] Digit Recognizer 手写数字识别(卷积神经网络)
相关博文: [Hands On ML] 3. 分类(MNIST手写数字预测) [Kaggle] Digit Recognizer 手写数字识别 [Kaggle] Digit Recognizer 手写数字识别(简单神经网络) 04.卷积神经网络 W1.卷积神经网络
Michael阿明
2021/02/19
1.4K0
[Kaggle] Digit Recognizer 手写数字识别(卷积神经网络)
深度学习|Keras识别MNIST手写数字(二)
今天依旧使用MNIST手写数字,方法也是MLP方法,这次我们让隐含层为1000个神经元。
罗罗攀
2019/02/22
6900
深度学习|Keras识别MNIST手写数字(二)
keras doc 10终结篇 激活函数 回调函数 正则项 约束项 预训练模型
激活函数可以通过设置单独的激活层实现,也可以在构造层对象时通过传递activation参数实现。
CreateAMind
2018/07/25
2.3K0
keras doc 10终结篇 激活函数 回调函数 正则项 约束项 预训练模型
利用Tensorflow2.0实现手写数字识别
前面两节课我们已经简单了解了神经网络的前向传播和反向传播工作原理,并且尝试用numpy实现了第一个神经网络模型。手动实现(深度)神经网络模型听起来很牛逼,实际上却是一个费时费力的过程,特别是在神经网络层数很多的情况下,多达几十甚至上百层网络的时候我们就很难手动去实现了。这时候可能我们就需要更强大的深度学习框架来帮助我们快速实现深度神经网络模型,例如Tensorflow/Pytorch/Caffe等都是非常好的选择,而近期大热的keras是Tensorflow2.0版本中非常重要的高阶API,所以本节课老shi打算先给大家简单介绍下Tensorflow的基础知识,最后借助keras来实现一个非常经典的深度学习入门案例——手写数字识别。废话不多说,马上进入正题。
用户7569543
2020/07/19
1.1K0
利用Tensorflow2.0实现手写数字识别
入门项目数字手写体识别:使用Keras完成CNN模型搭建
对于图像分类任务而言,卷积神经网络(CNN)是目前最优的网络结构,没有之一。在面部识别、自动驾驶、物体检测等领域,CNN被广泛使用,并都取得了最优性能。对于绝大多数深度学习新手而言,数字手写体识别任务可能是第一个上手的项目,网络上也充斥着各种各样的成熟工具箱的相关代码,新手在利用相关工具箱跑一遍程序后就能立刻得到很好的结果,这时候获得的感受只有一个——深度学习真神奇,却没能真正了解整个算法的具体流程。本文将利用Keras和TensorFlow设计一个简单的二维卷积神经网络(CNN)模型,手把手教你用代码完成MNIST数字识别任务,便于理解深度学习的整个流程。
用户3578099
2019/08/16
8830
深度学习模型系列(1) | VGG16 Keras实现
VGGNet是牛津大学视觉几何组(Visual Geometry Group)提出的模型,该模型在2014ImageNet图像分类与定位挑战赛 ILSVRC-2014中取得在分类任务第二,定位任务第一的优异成绩。VGGNet突出的贡献是证明了很小的卷积,通过增加网络深度可以有效提高性能。
机器学习学研社
2019/09/19
4.8K0
深度学习模型系列(1) | VGG16 Keras实现
【机器学习】机器学习与图像识别的融合应用与性能优化新探索
图像识别是计算机视觉领域的一项重要任务,通过分析和理解图像中的内容,使计算机能够自动识别和分类物体、场景和行为。随着深度学习技术的发展,机器学习在图像识别中的应用越来越广泛,推动了自动驾驶、医疗诊断、智能监控等领域的发展。本文将详细介绍机器学习在图像识别中的应用,包括数据预处理、模型选择、模型训练和性能优化。通过具体的案例分析,展示机器学习技术在图像识别中的实际应用,并提供相应的代码示例。
哈__
2024/07/15
4360
Keras-深度学习-神经网络-手写数字识别模型
使用到的数据集为IMDB电影评论情感分类数据集,该数据集包含 50,000 条电影评论,其中 25,000 条用于训练,25,000 条用于测试。每条评论被标记为正面或负面情感,因此该数据集是一个二分类问题。
叶茂林
2023/07/30
2660
Keras-深度学习-神经网络-手写数字识别模型
使用Python实现深度学习模型:迁移学习与领域自适应教程
迁移学习和领域自适应是深度学习中的两个重要概念。迁移学习旨在将已在某个任务上训练好的模型应用于新的任务,而领域自适应则是调整模型以适应不同的数据分布。本文将通过一个详细的教程,介绍如何使用Python实现迁移学习和领域自适应。
Echo_Wish
2024/07/03
3780
使用Python实现深度学习模型:迁移学习与领域自适应教程
机器学习-用keras做cnn手写数字识别
在用全连接做手写数字识别的时候,准确率有97%了,但是还是会出现一些测试图片没有预测对,出来更好的去优化参数,现在就直接改进神经网络的模型,用cnn去训练数据。
sjw1998
2019/09/28
9920
使用python实现图像识别
图像识别是人工智能中的重要分支之一,通过使用机器学习算法来训练模型,使其能够识别图像中的物体、场景或人脸等。在本文中,我们将介绍使用Python实现图像识别的方法,其中主要使用的是深度学习框架Keras和OpenCV库。
堕落飞鸟
2023/03/27
12.2K1
keras 学习笔记:从头开始构建网络处理 mnist
全文参考 《 基于 python 的深度学习实战》 import numpy as np from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten from keras.layers.convolutional import Conv2D, MaxPooling2D (x_train, y_train), (x_test, y_
用户2434869
2018/12/18
4610
使用Keras创建一个卷积神经网络模型,可对手写数字进行识别
在过去的几年里,图像识别研究已经达到了惊人的精确度。不可否认的是,深度学习在这个领域击败了传统的计算机视觉技术。 将神经网络应用于MNIST的数据集以识别手写的数字这种方法将所有的图像像素传输到完全连接的神经网络。该方法在测试集上的准确率为98.01%。这个成功率虽然看上去不错,但不是完美的。 应用卷积神经网络可以产生更成功的结果。与传统的方法相比,重点部分的图像像素将被传输到完全连接的神经网络,而不是所有的图像像素。一些滤镜应该被应用到图片中去检测重点部分的像素。 Keras是一个使用通用深度学习框架的A
AiTechYun
2018/03/02
1K0
使用Keras创建一个卷积神经网络模型,可对手写数字进行识别
基于MNIST手写体数字识别--含可直接使用代码【Python+Tensorflow+CNN+Keras】
利用数据集:MNIST http://yann.lecun.com/exdb/mnist/ 完成手写体数字识别 紫色yyds
司六米希
2022/11/15
5.5K0
基于MNIST手写体数字识别--含可直接使用代码【Python+Tensorflow+CNN+Keras】
推荐阅读
相关推荐
深度学习|Keras识别MNIST手写数字(CNN)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验