1 前言

本文以MNIST手写数字分类为例,讲解使用一维卷积二维卷积实现 CNN 模型。关于 MNIST 数据集的说明,见使用TensorFlow实现MNIST数据集分类。实验中主要用到 Conv1D 层、Conv2D 层、MaxPooling1D 层和 MaxPooling2D 层,其参数说明如下:

(1)Conv1D

Conv1D(filters, kernel_size, strides=1, padding='valid', dilation_rate=1, activation=None)
  • filters:卷积核个数(通道数)
  • kernel_size:卷积核尺寸(长度或宽度)
  • strides:卷积核向右(或向下)移动步长
  • padding:右边缘(或下边缘)不够一个窗口大小时,是否补零。valid 表示不补,same 表示补零
  • dilation_rate:膨胀(空洞)率,每次卷积运算时,相邻元素之间的水平距离
  • activation: 激活函数,可选 sigmoid、tanh、relu

注意:当该层作为第一层时,应提供 input_shape参数。例如 input_shape=(10,128)表示10个时间步长的时间序列,每步中有128个特征

(2)Conv2D

Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', dilation_rate=(1, 1), activation=None)
  • filters:卷积核个数(通道数)
  • kernel_size:卷积核尺寸(长度和宽度)
  • strides:卷积核向右和向下移动步长
  • padding:右边缘和下边缘不够一个窗口大小时,是否补零。valid 表示不补,same 表示补零
  • dilation_rate:膨胀(空洞)率,每次卷积运算时,相邻元素之间的水平和竖直距离
  • activation: 激活函数,可选 sigmoid、tanh、relu

注意:当该层作为第一层时,应提供 input_shape参数。例如 input_shape=(128,128,3)表示128*128的彩色RGB图像

(3)MaxPooling1D

MaxPooling1D(pool_size=2, strides=None, padding='valid')
  • pool_size:池化窗口尺寸(长度或宽度)
  • strides:窗口向右(或向下)移动步长
  • padding:右边缘(或下边缘)不够一个窗口大小时,是否补零。valid 表示不补,same 表示补零

(4)MaxPooling2D

MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid')
  • pool_size:池化窗口尺寸(长度和宽度)
  • strides:窗口向右和向下移动步长
  • padding:右边缘和下边缘不够一个窗口大小时,是否补零。valid 表示不补,same 表示补零

笔者工作空间如下:

代码资源见--> 使用一维卷积和二维卷积实现MNIST数据集分类

2 一维卷积

CNN_1D.py

from tensorflow.examples.tutorials.mnist import input_data
from keras.models import Sequential
from keras.layers import Conv1D,MaxPooling1D,Flatten,Dense #载入数据
def read_data(path):
mnist=input_data.read_data_sets(path,one_hot=True)
train_x,train_y=mnist.train.images.reshape(-1,28,28),mnist.train.labels,
valid_x,valid_y=mnist.validation.images.reshape(-1,28,28),mnist.validation.labels,
test_x,test_y=mnist.test.images.reshape(-1,28,28),mnist.test.labels
return train_x,train_y,valid_x,valid_y,test_x,test_y #序列模型
def CNN_1D(train_x,train_y,valid_x,valid_y,test_x,test_y):
#创建模型
model=Sequential()
model.add(Conv1D(input_shape=(28,28),filters=16,kernel_size=5,padding='same',activation='relu'))
model.add(MaxPooling1D(pool_size=2,padding='same')) #最大池化
model.add(Conv1D(filters=32,kernel_size=3,padding='same',activation='relu'))
model.add(MaxPooling1D(pool_size=2,padding='same')) #最大池化
model.add(Flatten()) #扁平化
model.add(Dense(10,activation='softmax'))
#查看网络结构
model.summary()
#编译模型
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
#训练模型
model.fit(train_x,train_y,batch_size=500,nb_epoch=20,verbose=2,validation_data=(valid_x,valid_y))
#评估模型
pre=model.evaluate(test_x,test_y,batch_size=500,verbose=2) #评估模型
print('test_loss:',pre[0],'- test_acc:',pre[1]) train_x,train_y,valid_x,valid_y,test_x,test_y=read_data('MNIST_data')
CNN_1D(train_x,train_y,valid_x,valid_y,test_x,test_y)

网络各层输出尺寸:

_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv1d_1 (Conv1D) (None, 28, 16) 2256
_________________________________________________________________
max_pooling1d_1 (MaxPooling1 (None, 14, 16) 0
_________________________________________________________________
conv1d_2 (Conv1D) (None, 14, 32) 1568
_________________________________________________________________
max_pooling1d_2 (MaxPooling1 (None, 7, 32) 0
_________________________________________________________________
flatten_2 (Flatten) (None, 224) 0
_________________________________________________________________
dense_2 (Dense) (None, 10) 2250
=================================================================
Total params: 6,074
Trainable params: 6,074
Non-trainable params: 0

网络训练结果:

Epoch 18/20
- 1s - loss: 0.0659 - acc: 0.9803 - val_loss: 0.0654 - val_acc: 0.9806
Epoch 19/20
- 1s - loss: 0.0627 - acc: 0.9809 - val_loss: 0.0638 - val_acc: 0.9834
Epoch 20/20
- 1s - loss: 0.0601 - acc: 0.9819 - val_loss: 0.0645 - val_acc: 0.9828
test_loss: 0.06519819456152617 - test_acc: 0.9790999978780747

3 二维卷积

CNN_2D.py

from tensorflow.examples.tutorials.mnist import input_data
from keras.models import Sequential
from keras.layers import Conv2D,MaxPooling2D,Flatten,Dense #载入数据
def read_data(path):
mnist=input_data.read_data_sets(path,one_hot=True)
train_x,train_y=mnist.train.images.reshape(-1,28,28,1),mnist.train.labels,
valid_x,valid_y=mnist.validation.images.reshape(-1,28,28,1),mnist.validation.labels,
test_x,test_y=mnist.test.images.reshape(-1,28,28,1),mnist.test.labels
return train_x,train_y,valid_x,valid_y,test_x,test_y #序列模型
def CNN_2D(train_x,train_y,valid_x,valid_y,test_x,test_y):
#创建模型
model=Sequential()
model.add(Conv2D(input_shape=(28,28,1),filters=16,kernel_size=(5,5),padding='same',activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2),padding='same')) #最大池化
model.add(Conv2D(filters=32,kernel_size=(3,3),padding='same',activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2),padding='same')) #最大池化
model.add(Flatten()) #扁平化
model.add(Dense(10,activation='softmax'))
#查看网络结构
model.summary()
#编译模型
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
#训练模型
model.fit(train_x,train_y,batch_size=500,nb_epoch=20,verbose=2,validation_data=(valid_x,valid_y))
#评估模型
pre=model.evaluate(test_x,test_y,batch_size=500,verbose=2) #评估模型
print('test_loss:',pre[0],'- test_acc:',pre[1]) train_x,train_y,valid_x,valid_y,test_x,test_y=read_data('MNIST_data')
CNN_2D(train_x,train_y,valid_x,valid_y,test_x,test_y)

网络各层输出尺寸:

_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) (None, 28, 28, 16) 416
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 14, 14, 16) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 14, 14, 32) 4640
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 7, 7, 32) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 1568) 0
_________________________________________________________________
dense_1 (Dense) (None, 10) 15690
=================================================================
Total params: 20,746
Trainable params: 20,746
Non-trainable params: 0

网络训练结果:

Epoch 18/20
- 11s - loss: 0.0290 - acc: 0.9911 - val_loss: 0.0480 - val_acc: 0.9872
Epoch 19/20
- 11s - loss: 0.0284 - acc: 0.9913 - val_loss: 0.0475 - val_acc: 0.9860
Epoch 20/20
- 11s - loss: 0.0258 - acc: 0.9921 - val_loss: 0.0453 - val_acc: 0.9874
test_loss: 0.038486057263799014 - test_acc: 0.9874000072479248

4 补充

(1)AveragePooling1D

AveragePooling1D(pool_size=2, strides=None, padding='valid')

(2)AveragePooling2D

AveragePooling2D(pool_size=(2, 2), strides=None, padding='valid')

​ 声明:本文转自基于keras的卷积神经网络(CNN)

基于keras的卷积神经网络(CNN)的更多相关文章

  1. visualization of filters keras 基于Keras的卷积神经网络(CNN)可视化

    https://adeshpande3.github.io/adeshpande3.github.io/ https://blog.csdn.net/weiwei9363/article/detail ...

  2. 基于MNIST数据的卷积神经网络CNN

    基于tensorflow使用CNN识别MNIST 参数数量:第一个卷积层5x5x1x32=800个参数,第二个卷积层5x5x32x64=51200个参数,第三个全连接层7x7x64x1024=3211 ...

  3. 深度学习基础-基于Numpy的卷积神经网络(CNN)实现

    本文是深度学习入门: 基于Python的实现.神经网络与深度学习(NNDL)以及动手学深度学习的读书笔记.本文将介绍基于Numpy的卷积神经网络(Convolutional Networks,CNN) ...

  4. TensorFlow 2.0 深度学习实战 —— 浅谈卷积神经网络 CNN

    前言 上一章为大家介绍过深度学习的基础和多层感知机 MLP 的应用,本章开始将深入讲解卷积神经网络的实用场景.卷积神经网络 CNN(Convolutional Neural Networks,Conv ...

  5. 卷积神经网络(CNN)反向传播算法

    在卷积神经网络(CNN)前向传播算法中,我们对CNN的前向传播算法做了总结,基于CNN前向传播算法的基础,我们下面就对CNN的反向传播算法做一个总结.在阅读本文前,建议先研究DNN的反向传播算法:深度 ...

  6. 【深度学习系列】手写数字识别卷积神经--卷积神经网络CNN原理详解(一)

    上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...

  7. 【深度学习系列】卷积神经网络CNN原理详解(一)——基本原理

    上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...

  8. 卷积神经网络(CNN)学习笔记1:基础入门

    卷积神经网络(CNN)学习笔记1:基础入门 Posted on 2016-03-01   |   In Machine Learning  |   9 Comments  |   14935  Vie ...

  9. 卷积神经网络CNN原理以及TensorFlow实现

    在知乎上看到一段介绍卷积神经网络的文章,感觉讲的特别直观明了,我整理了一下.首先介绍原理部分. [透析] 卷积神经网络CNN究竟是怎样一步一步工作的? 通过一个图像分类问题介绍卷积神经网络是如何工作的 ...

  10. paper 162:卷积神经网络(CNN)解析

    卷积神经网络(CNN)解析: 卷积神经网络CNN解析 概揽 Layers used to build ConvNets 卷积层Convolutional layer 池化层Pooling Layer ...

随机推荐

  1. 一种基于Unix Domain和TCP连接的跨设备多进程间通信的方法

    ​ 前言: 在linux系统进程间通信的方式有消息,消息队列,管道,内存映射,套接字等多种方式. 在Android系统上进行进程间通信主要是使用Binder,其它的还有共享内存,管道,RPC和Unix ...

  2. [转帖]vCenter使用 VMCA 续订证书:续订证书时发生意外错误

    https://www.dinghui.org/vcenter-sts-certificate.html 起因:有一处客户vCenter告警:STS签名证书即将过期. 处理办法:系统管理-证书-证书管 ...

  3. [转帖]python库Paramiko

    https://zhuanlan.zhihu.com/p/456447145 测试过程中经常会遇到需要将本地的文件上传到远程服务器上,或者需要将服务器上的文件拉到本地进行操作,以前安静经常会用到xft ...

  4. [转帖]020 Linux 20 个宝藏命令案例

    https://my.oschina.net/u/3113381/blog/5478108 1 JDK 相关的查找命令 (1)确认是否安装 JDK //命令 java -version //输出示例 ...

  5. Linux 环境下 node 以及 jit 的简单环境配置说明

    注意事项: 1. 注意这个包需要实时更新. 2. 更新时需要按照目录覆盖文件. 3. 谁负责谁治理的态度, 有更新,需要完整的进行覆盖安装. 建议先删除旧文件, 替换新文件. 4. 为了简单起见, 直 ...

  6. 飞腾2000+上面银河麒麟v10 安装virt-manager创建虚拟机的操作过程

    操作系统安装完之后自带了repos 就可以执行大部分操作, 不需要修改包源 ###Kylin Linux Advanced Server 10 - os repo### [ks10-adv-os] n ...

  7. gin启动https支持

    gin是一个使用Go语言开发的Web框架,具有运行速度快,分组的路由器,良好的崩溃捕获和错误处理,支持中间件等. 在工作中有时候需要支持https服务,gin可以通过中间件的方式来提供对https的支 ...

  8. 新来的一个同事,把SpringBoot参数校验玩的那叫一个优雅

    介绍 在开发现代应用程序时,数据验证是确保用户输入的正确性和应用程序数据完整性的关键方面.Spring Boot 提供了强大的数据验证机制,使开发者能够轻松地执行验证操作.本文将深入介绍 Spring ...

  9. ElasticSearch实战指南必知必会:安装分词器、高级查询、打分机制

    ElasticSearch实战指南必知必会:安装中文分词器.ES-Python使用.高级查询实现位置坐标搜索以及打分机制 1.ElasticSearch之-安装中文分词器 elasticsearch ...

  10. 精进语言模型:探索LLM Training微调与奖励模型技术的新途径

    精进语言模型:探索LLM Training微调与奖励模型技术的新途径 LLMs Trainer 是一个旨在帮助人们从零开始训练大模型的仓库,该仓库最早参考自 Open-Llama,并在其基础上进行扩充 ...