热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TensorFlow学习笔记(二)之卷积神经网络

环境反向传播神经网络存在的问题及优化方法存在问题优化方法随机梯度下降Mini-Batch梯度下降动量梯度下降解决方法主要问题主要解决方法相关计算卷积及卷积核

环境

反向传播

神经网络存在的问题及优化方法

存在问题

优化方法

随机梯度下降

Mini-Batch梯度下降

动量梯度下降

解决方法

主要问题

主要解决方法

相关计算

卷积及卷积核

卷积核的物理含义

卷积处理多通道生成单通道图像

卷积处理多通道生成多通道图像

激活函数

卷积核的参数

池化

基本计算

池化的特点

全连接

卷积神经网络结构

卷积神经网络

全卷积神经网络

代码

参考资料




环境

python 3.6 + TensorFlow 1.13.1 + Jupyter Notebook


反向传播

即复合函数求导,链式法则为实现基础。


神经网络存在的问题及优化方法


存在问题

1、每次都在整个数据集上计算Loss和梯度,导致:

(1)计算量大;

(2)内存可能承载不了;

2、梯度方向确定的时候,仍然是每次走一个单位步长,导致:速度太慢。


优化方法


随机梯度下降

每次只使用一个样本。

缺点:不能反应整个数据集的梯度方向,导致每次训练的收敛速度较慢。


Mini-Batch梯度下降

每次使用小部分随机选择的数据进行训练。

缺点:梯度下降存在震荡问题(Mini-Batch越大,这个问题越不明显);存在局部极值和saddle point问题。


动量梯度下降

解决了收敛速度慢、震荡、局部极值、saddle point的问题。

(1)开始训练时,积累动量,加速训练;

(2)局部极值附近震荡时,梯度为0,由于动量,跳出陷阱;

(3)梯度改变方向的时候,动量缓解动荡。

    


解决方法


主要问题

神经网络遇到的最主要问题:参数过多,导致:

(1)计算量大;

(2)容易过拟合,需要更多的训练数据;

(3)收敛到较差的局部极值。


主要解决方法

卷积:

(1)局部连接(全连接变为局部连接,减少数据量):图像的区域性;

(2)参数共享:图像特征与位置无关。


相关计算

卷积计算:每个位置进行内积运算。


输出size = 输入size – 卷积核size + 1


步长:卷积核每步滑动的长度(卷积的默认步长为1)。

Padding:使输出size不变。

(下图的“输出size = 输入size – 卷积核size + 1”,输入size是指已经加上Padding的size)


输出size = 输入size + Padding * 2 – 卷积核size + 1



卷积及卷积核


卷积核的物理含义

可认为卷积核是用于提取某个特征的,输入图像若具有卷积核所标识的特征,则输出值较大,否则较小。


卷积处理多通道生成单通道图像


卷积处理多通道生成多通道图像

即增加多个参数不共享的卷积核。


激活函数

激活函数的特征(常用ReLU,快速):

(1)具有单调性;

(2)非线性函数(原因:神经网络层级之间全连接相当于矩阵运算,矩阵的操作具有合并性,若为线性运算,多层神经网络相当于单层神经网络)。


卷积核的参数

n为输入图像大小。


池化


基本计算

池化默认步长与核相等,卷积默认步长为1。

(1)最大值池化;(2)平均值池化。


池化的特点

精度与计算量的trade off。

(1)常使用不重叠、不补零;

(2)没有用于求导的参数;

(3)池化层参数为步长和池化核大小;

(4)用于减少图像尺寸,从而减少计算量;

(5)一定程度解决平移鲁棒;

(6)损失了空间位置精度。


全连接

全卷积之后不能再加卷积和池化层。

全连接层的参数数目占据整个神经网络参数的大部分(约60%~80%)。

(1)将上一层输出展开并连接到每一个神经元上;

(2)即普通神经网络的层;

(3)相比于卷积层,参数数目较大。


参数数目 = Ci * Co

(Ci/Co为输入输出通道数目)



卷积神经网络结构


卷积神经网络


卷积神经网络 = 卷积层 + 池化层 + 全连接层


图像 --> 图像的操作:去除全连接层;

小图 --> 大图:反卷积。


全卷积神经网络


全卷积神经网络 = 卷积层 + 池化层



代码

TensorFlow实现:卷积层与池化层

conv1 = tf.layers.conv2d(x_image,32, # output channel number(3,3), # kernel sizepadding = 'same',activation = tf.nn.relu,name = 'conv1')
# 16 * 16
pooling1 = tf.layers.max_pooling2d(conv1,(2, 2), # kernel size(2, 2), # stridename = 'pool1')
conv2 = tf.layers.conv2d(pooling1,32, # output channel number(3,3), # kernel sizepadding = 'same',activation = tf.nn.relu,name = 'conv2')
# 8 * 8
pooling2 = tf.layers.max_pooling2d(conv2,(2, 2), # kernel size(2, 2), # stridename = 'pool2')
conv3 = tf.layers.conv2d(pooling2,32, # output channel number(3,3), # kernel sizepadding = 'same',activation = tf.nn.relu,name = 'conv3')
# 4 * 4 * 32
pooling3 = tf.layers.max_pooling2d(conv3,(2, 2), # kernel size(2, 2), # stridename = 'pool3')

TensorFlow实现:全连接层

# [None, 4 * 4 * 32]
flatten = tf.layers.flatten(pooling3)

TensorFlow实现:卷积神经网络

x = tf.placeholder(tf.float32, [None, 3072])
y = tf.placeholder(tf.int64, [None])
# [None], eg: [0,5,6,3]
x_image = tf.reshape(x, [-1, 3, 32, 32])
# 32*32
x_image = tf.transpose(x_image, perm=[0, 2, 3, 1])conv1 = tf.layers.conv2d(x_image,32, # output channel number(3,3), # kernel sizepadding = 'same',activation = tf.nn.relu,name = 'conv1')
# 16 * 16
pooling1 = tf.layers.max_pooling2d(conv1,(2, 2), # kernel size(2, 2), # stridename = 'pool1')
conv2 = tf.layers.conv2d(pooling1,32, # output channel number(3,3), # kernel sizepadding = 'same',activation = tf.nn.relu,name = 'conv2')
# 8 * 8
pooling2 = tf.layers.max_pooling2d(conv2,(2, 2), # kernel size(2, 2), # stridename = 'pool2')
conv3 = tf.layers.conv2d(pooling2,32, # output channel number(3,3), # kernel sizepadding = 'same',activation = tf.nn.relu,name = 'conv3')
# 4 * 4 * 32
pooling3 = tf.layers.max_pooling2d(conv3,(2, 2), # kernel size(2, 2), # stridename = 'pool3')
# [None, 4 * 4 * 32]
flatten = tf.layers.flatten(pooling3)
y_ = tf.layers.dense(flatten, 10)loss = tf.losses.sparse_softmax_cross_entropy(labels=y, logits=y_)
# y_ -> sofmax
# y -> one_hot
# loss = ylogy_# indices
predict = tf.argmax(y_, 1)
# [1,0,1,1,1,0,0,0]
correct_prediction = tf.equal(predict, y)
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float64))with tf.name_scope('train_op'):train_op = tf.train.AdamOptimizer(1e-3).minimize(loss)

参考资料

图片、内容引自:https://coding.imooc.com/class/259.html

 


推荐阅读
  • 本文探讨了SQLAlchemy ORM框架中如何利用外键和关系(relationship)来建立表间联系,简化复杂的查询操作。通过示例代码详细解释了relationship的定义、使用方法及其与外键的相互作用。 ... [详细]
  • 酷家乐 Serverless FaaS 产品实践探索
    本文探讨了酷家乐在 Serverless FaaS 领域的实践与经验,重点介绍了 FaaS 平台的构建、业务收益及未来发展方向。 ... [详细]
  • 字符、字符串和文本的处理之Char类型
    .NetFramework中处理字符和字符串的主要有以下这么几个类:(1)、System.Char类一基础字符串处理类(2)、System.String类一处理不可变的字符串(一经 ... [详细]
  • 本文详细探讨了在 Xamarin.Forms 中使用 AbsoluteLayout 进行精确布局的方法,以及如何利用 Device.StartTimer 实现定时任务。通过具体的代码示例,帮助开发者更好地理解和应用这些功能。 ... [详细]
  • 计算机视觉初学者指南:如何顺利入门
    本文旨在为计算机视觉领域的初学者提供一套全面的入门指南,涵盖基础知识、技术工具、学习资源等方面,帮助读者快速掌握计算机视觉的核心概念和技术。 ... [详细]
  • 本文深入探讨了JLine库中的ConsoleReader.drawBuffer()方法的使用场景和具体实现,通过多个实际代码示例,帮助开发者更好地理解和应用此方法。 ... [详细]
  • 本文介绍了一种算法,用于在一个给定的二叉树中找到一个节点,该节点的子树包含最大数量的值小于该节点的节点。如果存在多个符合条件的节点,可以选择任意一个。 ... [详细]
  • 本文探讨了如何通过rand7()函数利用拒绝采样的技术来实现rand10()函数。拒绝采样是一种当生成的随机数符合特定条件时,才返回该数的方法。 ... [详细]
  • 本文探讨了在Qt框架下实现TCP多线程服务器端的方法,解决了一个常见的问题:服务器端仅能与最后一个连接的客户端通信。通过继承QThread类并利用socketDescriptor标识符,实现了多个客户端与服务器端的同时通信。 ... [详细]
  • J2EE平台集成了多种服务、API和协议,旨在支持基于Web的多层应用开发。本文将详细介绍J2EE平台中的13项关键技术规范,涵盖从数据库连接到事务处理等多个方面。 ... [详细]
  • 本文探讨了在Node.js环境中如何有效地捕获标准输出(stdout)的内容,并将其存储到变量中。通过具体的示例和解决方案,帮助开发者解决常见的输出捕获问题。 ... [详细]
  • Cadence SPB 16.5 安装指南与注意事项
    本文提供了详细的 Cadence SPB 16.5 安装步骤,包括环境配置、安装过程中的关键步骤以及常见问题的解决方案。适合初次安装或遇到问题的技术人员参考。 ... [详细]
  • 本文探讨了Web API 2中特性的路由机制,特别是如何利用它来构建RESTful风格的URI。文章不仅介绍了基本的特性路由使用方法,还详细说明了如何通过特性路由进行API版本控制、HTTP方法的指定、路由前缀的应用以及路由约束的设置。 ... [详细]
  • Navicat Premium中MySQL用户管理:创建新用户及高级设置
    本文作为Navicat Premium用户管理系列的第二部分,主要介绍如何创建新的MySQL用户,包括设置基本账户信息、密码策略、账户限制以及SSL配置等。 ... [详细]
  • 正文♦时间复杂度:\(\mathcal{O}(n)\)思维题,不需要建树。设数组\(a\)记录每一个节点是否尊重它的父节点,数组\(b\)记录是否有节点尊重它,特别的,叶子节点必然 ... [详细]
author-avatar
个信2602907025
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有