前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >TensorFlow 深度学习笔记 卷积神经网络

TensorFlow 深度学习笔记 卷积神经网络

作者头像
梦里茶
发布于 2018-01-15 07:31:41
发布于 2018-01-15 07:31:41
66500
代码可运行
举报
文章被收录于专栏:梦里茶室梦里茶室
运行总次数:0
代码可运行

Convolutional Networks

deep dive into images and convolutional models

Convnet

BackGround

  • 人眼在识别图像时,往往从局部到全局
  • 局部与局部之间联系往往不太紧密
  • 我们不需要神经网络中的每个结点都掌握全局的知识,因此可以从这里减少需要学习的参数数量

Weight share

  • 但这样参数其实还是挺多的,所以有了另一种方法:权值共享

Share Parameters across space

  • 取图片的一小块,在上面做神经网络分析,会得到一些预测
  • 将切片做好的神经网络作用于图片的每个区域,得到一系列输出
  • 可以增加切片个数提取更多特征
  • 在这个过程中,梯度的计算跟之前是一样的

Concept

  • Patch/Kernel:一个局部切片
  • Depth: 数据的深度,图像数据是三维的,长宽和RGB,神经网络的预测输出也属于一维
  • Feature Map:每层Conv网络,因为它们将前一层的feature映射到后一层(Output map)
  • Stride: 移动切片的步长,影响取样的数量
  • 在边缘上的取样影响Conv层的面积,由于移动步长不一定能整除整张图的像素宽度,不越过边缘取样会得到Valid Padding, 越过边缘取样会得到Same Padding
  • Example
  • 用一个3x3的网格在一个28x28的图像上做切片并移动
  • 移动到边缘上的时候,如果不超出边缘,3x3的中心就到不了边界
  • 因此得到的内容就会缺乏边界的一圈像素点,只能得到26x26的结果
  • 而可以越过边界的情况下,就可以让3x3的中心到达边界的像素点
  • 超出部分的矩阵补零就行

Deep Convnet

在Convnet上套Convnet,就可以一层一层综合局部得到的信息

OutPut

将一个deep and narrow的feature层作为输入,传给一个Regular神经网络

Optimization

Pooling

将不同Stride的卷积用某种方式合并起来,节省卷积层的空间复杂度。

  • Max Pooling 在一个卷积层的输出层上取一个切片,取其中最大值代表这个切片
  • 优点
  • 不增加需要调整的参数
  • 通常比其他方法准确
  • 缺点:更多Hyper Parameter,包括要取最值的切片大小,以及去切片的步长

LENET-5, ALEXNET

  • Average Pooling 在卷积层输出中,取切片,取平均值代表这个切片

1x1 Convolutions

在一个卷积层的输出层上,加一个1x1的卷积层,这样就形成了一个小型的神经网络。

  • cheap for deeper model
  • 结合Average Pooling食用效果更加 Inception 对同一个卷积层输出,执行各种二次计算,将各种结果堆叠到新输出的depth方向上

TensorFlow卷积神经网络实践

数据处理

  • dataset处理成四维的,label仍然作为one-hot encoding def reformat(dataset, labels, image_size, num_labels, num_channels): dataset = dataset.reshape( (-1, image_size, image_size, num_channels)).astype(np.float32) labels = (np.arange(num_labels) == labels[:, None]).astype(np.float32) return dataset, labels
  • 将lesson2的dnn转为cnn很简单,只要把WX+b改为conv2d(X)+b即可
  • 关键在于conv2d

`conv2d

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)

给定四维的inputfilter tensor,计算一个二维卷积

Args:
  • input: A Tensor. type必须是以下几种类型之一: half, float32, float64.
  • filter: A Tensor. type和input必须相同
  • strides: A list of ints.一维,长度4, 在input上切片采样时,每个方向上的滑窗步长,必须和format指定的维度同阶
  • padding: A string from: "SAME", "VALID". padding 算法的类型
  • use_cudnn_on_gpu: An optional bool. Defaults to True.
  • data_format: An optional string from: "NHWC", "NCHW", 默认为"NHWC"。 指定输入输出数据格式,默认格式为"NHWC", 数据按这样的顺序存储: [batch, in_height, in_width, in_channels] 也可以用这种方式:"NCHW", 数据按这样的顺序存储: [batch, in_channels, in_height, in_width]
  • name: 操作名,可选.
Returns:

A Tensor. type与input相同

Given an input tensor of shape [batch, in_height, in_width, in_channels] and a filter / kernel tensor of shape [filter_height, filter_width, in_channels, out_channels]

conv2d实际上执行了以下操作:

  1. 将filter转为二维矩阵,shape为 [filter_height * filter_width * in_channels, output_channels].
  2. 从input tensor中提取image patches,每个patch是一个virtual tensor,shape[batch, out_height, out_width, filter_height * filter_width * in_channels].
  3. 将每个filter矩阵和image patch向量相乘

具体来讲,当data_format为NHWC时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
output[b, i, j, k] =
    sum_{di, dj, q} input[b, strides[1] * i + di, strides[2] * j + dj, q] *
                    filter[di, dj, q, k]

input 中的每个patch都作用于filter,每个patch都能获得其他patch对filter的训练 需要满足strides[0] = strides[3] = 1. 大多数水平步长和垂直步长相同的情况下:strides = [1, stride, stride, 1]. - - -

  • 然后再接一个WX+b连Relu连WX+b的全连接神经网络即可

Max Pooling

在tf.nn.conv2d后面接tf.nn.max_pool,将卷积层输出减小,从而减少要调整的参数

max_pool

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tf.nn.max_pool(value, ksize, strides, padding, data_format='NHWC', name=None)

Performs the max pooling on the input.

Args:
  • value: A 4-D Tensor with shape [batch, height, width, channels] and type tf.float32.
  • ksize: A list of ints that has length >= 4. 要执行取最值的切片在各个维度上的尺寸
  • strides: A list of ints that has length >= 4. 取切片的步长
  • padding: A string, either 'VALID' or 'SAME'. padding算法
  • data_format: A string. 'NHWC' and 'NCHW' are supported.
  • name: 操作名,可选
Returns:

A Tensor with type tf.float32. The max pooled output tensor.

优化

仿照lesson2,添加learning rate decay 和 drop out,可以将准确率提高到90.6%

参考链接

觉得我的文章对您有帮助的话,给个star可好?

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[Tensorflow] Tensorflow卷积理解
CNN对于学习深度学习的人来说应该是比较耳熟的名词了.但很多人只是听过,但不知道是什么.
wOw
2018/09/18
1.9K0
[Tensorflow] Tensorflow卷积理解
tenforflow学习笔记(七):cnn
1.tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None) 2.tf.nn.depthwise_conv2d(input, filter, strides, padding, name=None) 3.tf.nn.separable_conv2d(input, depthwise_filter, pointwise_filter, strides, padding, name=None) 4.tf.nn.atrous_conv2d(value, filters, rate, padding, name=None)
ke1th
2019/05/26
6190
tensorflow学习笔记(十三):conv3d
这是官方给的解释,还不如conv2d解释的详细呢,至少在介绍conv2d的时候还给了公式. 和conv2d对比一下:
ke1th
2019/05/26
1.9K0
基于tensorflow实现简单卷积神经网络Lenet5
参考博客:https://blog.csdn.net/u012871279/article/details/78037984 https://blog.csdn.net/u014380165/article/details/77284921 目前人工智能神经网络已经成为非常火的一门技术,今天就用tensorflow来实现神经网络的第一块敲门砖。 首先先分模块解释代码。 1.先导入模块,若没有tensorflow还需去网上下载,这里使用mnist训练集来训练,进行手写数字的识别。 from tensorflo
徐飞机
2018/05/15
1.1K0
TensorFlow 手写数字识别与一步一步实现卷积神经网络(附代码实战)
手写数字识别 接下来将会以 MNIST 数据集为例,使用卷积层和池化层,实现一个卷积神经网络来进行手写数字识别,并输出卷积和池化效果。 数据准备 MNIST 数据集下载 MNIST 数据集可以从 THE MNIST DATABASE of handwritten digits 的网站直接下载。 网址:http://yann.lecun.com/exdb/mnist/ train-images-idx3-ubyte.gz: 训练集图片 train-labels-idx1-ubyte.gz: 训练集列标 t10
磐创AI
2018/04/24
2.8K0
TensorFlow 手写数字识别与一步一步实现卷积神经网络(附代码实战)
深度学习之卷积神经网络CNN及tensorflow代码实现示例
在人工的全连接神经网络中,每相邻两层之间的每个神经元之间都是有边相连的。当输入层的特征维度变得很高时,这时全连接网络需要训练的参数就会增大很多,计算速度就会变得很慢,例如一张黑白的 28×28 28×28 的手写数字图片,输入层的神经元就有784个,如下图所示:
全栈程序员站长
2022/09/10
1.1K0
深度学习之卷积神经网络CNN及tensorflow代码实现示例
深度使用卷积--使用tensorflow实现卷积
在上一篇我们了解了卷积的概念,并且使用numpy实现了卷积。但是现在其实很少会需要自己去实现卷积操作了,因为很多深度学习框架已经很好的封装了基础API甚至封装好了网络模型,比如tensorflow,pytorch,caffe等等。今天我们就使用tensorflow来实现卷积,顺便和我们自己实现的卷积结果对比,验证我们的实现是否正确。
languageX
2021/01/29
5110
深度学习之卷积
今日休假,把卷积神经网络梳理下。先从一些基本概念入手,什么是卷积?为什么叫这么个名字? 搜索了一遍,网上有很多人已经表述的非常好了,这里用自己理解的语言重述下。
breezedancer
2018/09/12
5170
深度学习之卷积
tensorflow oom报错OOM when allocating tensor with shape
今天在GPU上运行卷积神经网络手写数字,报了如下错误Resource exhausted: OOM when allocating tensor with shape[10000,32,28,28] 一开始还不知道因为什么,因为我的训练集我已经分批训练了啊,竟然换回出现这样的问题,后来在StackOverflow上发现了原因。原来我在做测试的时候一下子把测试集全部读进去了,这就造成了显卡的显存不能容纳这么多的数据,造成的崩溃,只需要改改最后测试就行了。 即将print("test accuracy
听城
2018/04/27
2.4K0
讲透卷积函数tf.nn.conv2d的使用详解
(1)input: 指需要做卷积的输入图像,它要求是一个Tensor, 具有[batch, in_height,in_width, in_channels]这样的形状,具体含义是“训练时一个batch的图片数量, 图片高度,图片宽度,图像通道数”,注意这是一个四维的Tensor,要求类型为float32和float64其中之一。
代码医生工作室
2019/09/10
8.7K0
讲透卷积函数tf.nn.conv2d的使用详解
tensorflow模型查看参数(pytorch conv2d函数详解)
定义: tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None) 功能:将两个4维的向量input(样本数据矩阵)和filter(卷积核)做卷积运算,输出卷积后的矩阵 input的形状:[batch, in_height ,in_width, in_channels] batch: 样本的数量 in_height :每个样本的行数 in_width: 每个样本的列数 in_channels:每个样本的通道数,如果是RGB图像就是3 filter的形状:[filter_height, filter_width, in_channels, out_channels] filter_height:卷积核的高 filter_width:卷积核的宽 in_channels:输入的通道数 out_channels:输出的通道数 比如在tensorflow的cifar10.py文件中有句:
全栈程序员站长
2022/07/30
8750
tensorflow模型查看参数(pytorch conv2d函数详解)
优达学城深度学习之六——TensorFlow实现卷积神经网络
TensorFlow提供了tf.nn.conv2d() 和tf.nn.bias_add() 函数来创建你自己的卷积层。
墨明棋妙27
2022/08/24
2480
优达学城深度学习之六——TensorFlow实现卷积神经网络
卷积神经网络实战MNIST
本节学习来源斯坦福大学cs20课程,有关本节源代码已同步只至github,欢迎大家star与转发,收藏!
公众号guangcity
2019/09/20
7330
卷积神经网络实战MNIST
【深度学习】多通道图像卷积过程及计算方式
之前,有写了一篇博文,【深度学习入门】——亲手实现图像卷积操作介绍卷积的相应知识,但那篇文章更多的是以滤波器的角度去讲解卷积。但实际上是神经网络中该博文内容并不适应。
Frank909
2019/01/14
3.1K0
手把手教你如何用 TensorFlow 实现 CNN
CNN 的引入 在人工的全连接神经网络中,每相邻两层之间的每个神经元之间都是有边相连的。当输入层的特征维度变得很高时,这时全连接网络需要训练的参数就会增大很多,计算速度就会变得很慢,例如一张黑白的 2
AI研习社
2018/03/29
1.7K0
手把手教你如何用 TensorFlow 实现 CNN
深度学习——LeNetLeNet解析
前言::LeNet是最早用于数字识别的CNN网络,本文就以数字识别为例,分析下这个最基本的CNN网络。 LeNet解析 网络结构如下图所示: C1层是一个卷积层 6个特征图,每个特征图中的每个神经元与
DC童生
2018/06/12
4460
tensorflow cnn常用函数解析
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None) 除去name参数用以指定该操作的name,与方法有关的一共五个参数:
YG
2018/10/10
7330
tf.nn.conv2d
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)   除去name参数用以指定该操作的name,与方法有关的一共五个参数: Args Annotation 第一个参数input 指需要做卷积的输入图像,它要求是一个Tensor,具有[batch, in_height, in_width, in_channels]这样的shape,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度
JNingWei
2018/09/28
5890
一看就懂的Tensorflow实战(卷积神经网络)
注意,这里只需要给出输入数据,输出通道数,卷积核大小即可。 Pooling layers 模块提供了多个池化方法,这几个池化方法都是类似的,包括 max_pooling1d()、max_pooling2d()、max_pooling3d()、average_pooling1d()、average_pooling2d()、average_pooling3d(),分别代表一维二维三维最大和平均池化方法,它们都定义在 tensorflow/python/layers/pooling.py 中,这里以 > max_pooling2d() 方法为例进行介绍。 max_pooling2d( inputs, pool_size, strides, padding='valid', data_format='channels_last', name=None ) 参数说明如下:
AI异构
2020/07/29
5360
一看就懂的Tensorflow实战(卷积神经网络)
手机端运行卷积神经网络实现文档检测功能(二) -- 从 VGG 到 MobileNetV2 知识梳理
前言 这是 上一篇博客 ((http://fengjian0106.github.io/2017/05/08/Document-Scanning-With-TensorFlow-And-OpenCV/)) 的后续和补充,这次对边缘检测算法的升级优化,起源于一个意外事件,前一个版本是使用 TensorFlow 1.0 部署的, 并且是用 TF-Slim API 编写的代码,最近想使用 TensorFlow 1.7 重新部署一遍,本来以为是一件比较容易的事情,结果实操的时候才发现全是坑,首先遇到的就是废弃 A
腾讯Bugly
2018/06/11
2K3
推荐阅读
相关推荐
[Tensorflow] Tensorflow卷积理解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文