【深度学习】TensorFlow之卷积神经网络

卷积神经网络的概念

在多层感知器(Multilayer Perceptrons,简称MLP)中,每一层的神经元都连接到下一层的所有神经元。一般称这种类型的层为完全连接。

 

多层感知器示例

 

反向传播

几个人站成一排第一个人看一幅画(输入数据),描述给第二个人(隐层)……依此类推,到最后一个人(输出)的时候,画出来的画肯定不能看了(误差较大)。

反向传播就是,把画拿给最后一个人看(求取误差),然后最后一个人就会告诉前面的人下次描述时需要注意哪里(权值修正)

其实反向传播就是梯度下降的反向继续

 

什么是卷积:convolution

卷积运算

 

 

计算步骤解释如下,原图大小为7*7,通道数为3:,卷积核大小为3*3,Input Volume中的蓝色方框和Filter W0中红色方框的对应位置元素相乘再求和得到res(即,下图中的步骤1.res的计算),再把res和Bias b0进行相加(即,下图中的步骤2),得到最终的Output Volume

卷积示例

以下是一组未经过滤的猫咪照片:

 

如果分别应用水平和垂直边缘滤波器,会得出以下结果:

 

可以看到某些特征是变得更加显著的,而另一些特征逐渐消失。有趣的是,每个过滤器都展示了不同的特征。

这就是卷积神经网络学习识别图像特征的方法。

 

卷积函数如下:卷积函数tf.nn.conv2d

第一个参数:input [训练时一个batch图像的数量,图像高度,图像宽度, 图像通道数])

第二个参数:filter

filter就是卷积核(这里要求用Tensor来表示卷积核,并且Tensor(一个4维的Tensor,要求类型与input相同)的shape为[filter_height, filter_width, in_channels, out_channels]具体含义[卷积核高度,卷积核宽度,图像通道数,卷积核个数],这里的图片通道数也就input中的图像通道数,二者相同。)

第三个参数:strides

strides就是卷积操作时在图像每一维的步长,strides是一个长度为4的一维向量

第四个参数:padding

第五个参数:use_cudnn_on_gpu

第六个参数:data_format

NHWC:[batch, height, width, channels]

第七个参数:name

padding是一个string类型的变量,只能是 "SAME" 或者 "VALID",决定了两种不同的卷积方式。下面我们来介绍 "SAME" 和 "VALID" 的卷积方式,如下图我们使用单通道的图像,图像大小为5*5,卷积核用3*3

如果以上参数不明白如何使用如下示例:

简单的单层神经网络预测手写数字图片

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_datafrom tensorflow.contrib.slim.python.slim.nets.inception_v3 import inception_v3_baseFLAGS = tf.app.flags.FLAGStf.app.flags.DEFINE_integer("is_train", 1, "指定程序是预测还是训练")def full_connected():# 获取真实的数据mnist = input_data.read_data_sets("./data/mnist/input_data/", one_hot=True)# 1、建立数据的占位符 x [None, 784]    y_true [None, 10]with tf.variable_scope("data"):x = tf.placeholder(tf.float32, [None, 784])y_true = tf.placeholder(tf.int32, [None, 10])# 2、建立一个全连接层的神经网络 w [784, 10]   b [10]with tf.variable_scope("fc_model"):# 随机初始化权重和偏置weight = tf.Variable(tf.random_normal([784, 10], mean=0.0, stddev=1.0), name="w")bias = tf.Variable(tf.constant(0.0, shape=[10]))# 预测None个样本的输出结果matrix [None, 784]* [784, 10] + [10] = [None, 10]y_predict = tf.matmul(x, weight) + bias# 3、求出所有样本的损失,然后求平均值with tf.variable_scope("soft_cross"):# 求平均交叉熵损失loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict))# 4、梯度下降求出损失with tf.variable_scope("optimizer"):train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)# 5、计算准确率with tf.variable_scope("acc"):equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))# equal_list  None个样本   [1, 0, 1, 0, 1, 1,..........]accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))# 收集变量 单个数字值收集tf.summary.scalar("losses", loss)tf.summary.scalar("acc", accuracy)# 高纬度变量收集tf.summary.histogram("weightes", weight)tf.summary.histogram("biases", bias)# 定义一个初始化变量的opinit_op = tf.global_variables_initializer()# 定义一个合并变量de opmerged = tf.summary.merge_all()# 创建一个saversaver = tf.train.Saver()# 开启会话去训练with tf.Session() as sess:# 初始化变量sess.run(init_op)# 建立events文件,然后写入filewriter = tf.summary.FileWriter("./tmp/summary/test/", graph=sess.graph)if FLAGS.is_train == 1:# 迭代步数去训练,更新参数预测for i in range(2000):# 取出真实存在的特征值和目标值mnist_x, mnist_y = mnist.train.next_batch(50)# 运行train_op训练sess.run(train_op, feed_dict={x: mnist_x, y_true: mnist_y})# 写入每步训练的值summary = sess.run(merged, feed_dict={x: mnist_x, y_true: mnist_y})filewriter.add_summary(summary, i)print("训练第%d步,准确率为:%f" % (i, sess.run(accuracy, feed_dict={x: mnist_x, y_true: mnist_y})))# 保存模型saver.save(sess, "./tmp/ckpt/fc_model")else:# 加载模型saver.restore(sess, "./tmp/ckpt/fc_model")# 如果是0,做出预测for i in range(100):# 每次测试一张图片 [0,0,0,0,0,1,0,0,0,0]x_test, y_test = mnist.test.next_batch(1)print("第%d张图片,手写数字图片目标是:%d, 预测结果是:%d" % (i,tf.argmax(y_test, 1).eval(),tf.argmax(sess.run(y_predict, feed_dict={x: x_test, y_true: y_test}), 1).eval()))return None# 定义一个初始化权重的函数
def weight_variables(shape):w = tf.Variable(tf.random_normal(shape=shape, mean=0.0, stddev=1.0))return w# 定义一个初始化偏置的函数
def bias_variables(shape):b = tf.Variable(tf.constant(0.0, shape=shape))return bdef model():"""自定义的卷积模型:return:"""# 1、准备数据的占位符 x [None, 784]  y_true [None, 10]with tf.variable_scope("data"):x = tf.placeholder(tf.float32, [None, 784])y_true = tf.placeholder(tf.int32, [None, 10])# 2、一卷积层 卷积: 5*5*1,32个,strides=1 激活: tf.nn.relu 池化with tf.variable_scope("conv1"):# 随机初始化权重, 偏置[32]w_conv1 = weight_variables([5, 5, 1, 32])b_conv1 = bias_variables([32])# 对x进行形状的改变[None, 784]  [None, 28, 28, 1]x_reshape = tf.reshape(x, [-1, 28, 28, 1])# [None, 28, 28, 1]-----> [None, 28, 28, 32]x_relu1 = tf.nn.relu(tf.nn.conv2d(x_reshape, w_conv1, strides=[1, 1, 1, 1], padding="SAME") + b_conv1)# 池化 2*2 ,strides2 [None, 28, 28, 32]---->[None, 14, 14, 32]x_pool1 = tf.nn.max_pool(x_relu1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")# 3、二卷积层卷积: 5*5*32,64个filter,strides=1 激活: tf.nn.relu 池化:with tf.variable_scope("conv2"):# 随机初始化权重,  权重:[5, 5, 32, 64]  偏置[64]w_conv2 = weight_variables([5, 5, 32, 64])b_conv2 = bias_variables([64])# 卷积,激活,池化计算# [None, 14, 14, 32]-----> [None, 14, 14, 64]x_relu2 = tf.nn.relu(tf.nn.conv2d(x_pool1, w_conv2, strides=[1, 1, 1, 1], padding="SAME") + b_conv2)# 池化 2*2, strides 2, [None, 14, 14, 64]---->[None, 7, 7, 64]x_pool2 = tf.nn.max_pool(x_relu2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")# 4、全连接层 [None, 7, 7, 64]--->[None, 7*7*64]*[7*7*64, 10]+ [10] =[None, 10]with tf.variable_scope("conv2"):# 随机初始化权重和偏置w_fc = weight_variables([7 * 7 * 64, 10])b_fc = bias_variables([10])# 修改形状 [None, 7, 7, 64] --->None, 7*7*64]x_fc_reshape = tf.reshape(x_pool2, [-1, 7 * 7 * 64])# 进行矩阵运算得出每个样本的10个结果y_predict = tf.matmul(x_fc_reshape, w_fc) + b_fcreturn x, y_true, y_predictdef conv_fc():# 获取真实的数据mnist = input_data.read_data_sets("./data/mnist/input_data/", one_hot=True)# 定义模型,得出输出x, y_true, y_predict = model()# 进行交叉熵损失计算# 3、求出所有样本的损失,然后求平均值with tf.variable_scope("soft_cross"):# 求平均交叉熵损失# 求平均交叉熵损失loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict))# 4、梯度下降求出损失with tf.variable_scope("optimizer"):train_op = tf.train.GradientDescentOptimizer(0.0001).minimize(loss)# 5、计算准确率with tf.variable_scope("acc"):equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))# equal_list  None个样本   [1, 0, 1, 0, 1, 1,..........]accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))# 定义一个初始化变量的opinit_op = tf.global_variables_initializer()# 开启回话运行with tf.Session() as sess:sess.run(init_op)# 循环去训练for i in range(1000):# 取出真实存在的特征值和目标值mnist_x, mnist_y = mnist.train.next_batch(50)# 运行train_op训练sess.run(train_op, feed_dict={x: mnist_x, y_true: mnist_y})print("训练第%d步,准确率为:%f" % (i, sess.run(accuracy, feed_dict={x: mnist_x, y_true: mnist_y})))return Noneif __name__ == "__main__":conv_fc()

 

 Tensorflow-卷积神经网络构建.

代码:

​​import numpy as np
import tensorflow as tfinput_ = np.random.randn(1,32,32,1).astype('float32')
filter_ = np.random.randn(5,5,1,8).astype('float32')conv1 = tf.nn.conv2d(input_,filter_,[1,1,1,1],'VALID')conv1 = tf.nn.relu(conv1)# 池化
pool1 = tf.nn.max_pool(conv1,[1,2,2,1],[1,2,2,1],'SAME')#第二层卷积
filter2_ = np.random.randn(5,5,8,20).astype('float32')
conv2 = tf.nn.conv2d(pool1,filter2_,[1,1,1,1],'VALID')#第二层池化
pool2 = tf.nn.max_pool(conv2,[1,2,2,1],[1,2,2,1],'SAME')#第三层卷积
filter3_ = np.random.randn(5,5,20,120).astype('float32')conv3 = tf.nn.conv2d(pool2,filter3_,[1,1,1,1],'VALID')#全连接层
full = tf.reshape(conv3,shape = (1,120))W = tf.random_normal(shape = [120,9])fc = tf.matmul(full,W)
fc
nd = np.random.randn(30)tf.nn.relu(nd)
with tf.Session() as sess:ret =sess.run(tf.nn.relu(nd))print(ret)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang 的交叉编译

为什么80%的码农都做不了架构师?>>> Go是一门编译型语言,所以在不同平台上,需要编译生成不同格式的二进制包。 由于Go 1.5对跨平台编译有了一些改进,包括统一了编译器、链接器等。 编译时候只需要指定两个参数&#x…

【深度学习】Cifar-10-探究不同的改进策略对分类准确率提高

cifar10数据集上进行图片分类,基于tensorflow框架, 旨在探究不同的改进策略对分类准确率的影响,如何一步步得提高准确率 一、问题描述 当我们在处理图像识别或者图像分类或者其他机器学习任务的时候,我们总是迷茫于做出哪些改进…

Acer 4750 安装黑苹果_黑苹果 MacOS 10.15 Catalina安装教程

一、准备工作一个8G以上的U盘(安装 10.15 Catalina 必须要16G及以上的U盘 );Mac OS镜像、TransMac(刻录工具)、DiskGenius(分区工具)、EasyUEFI(引导工区)、EFI驱动文件。安装工具获取方式:关注公众号【远景论坛】,回复:黑苹果二、…

帧内16*16模式的宏块数据传输顺序

如果宏块以16*16帧内模式编码,那么块-1首先被传输,携带的信息是每个4*4亮度块的DC系数。然后,亮度残差块0-15被传输(此时,16*16帧内宏块的DC系数为零)。对于亮度分量Cb和Cr,16和17块携带DC系数的…

pcie1 4 速度_太阳系行星们谁转得最快?八大行星自转速度排行榜,地球排第五...

不知道大家有没有玩儿过陀螺呢?玩儿陀螺的技术如果很好的话,它可以在地上飞快地旋转并且能够旋转很长的时间。有趣的是,宇宙中的很多星球就像陀螺一样绕着一个中心轴旋转着。这就是星球的自转。在太阳系中有八颗大行星,它们都在自…

分布式资本沈波:未来区块链杀手级应用将出现在“+区块链”

雷锋网5月22日报道,日前“区块链技术和应用峰会”在杭州国际博览中心举行。会上,分布式资本创始管理人沈波作了《区块链的投资现状与发展趋势》演讲。 沈波表示,由于区块链的共识机制和无法篡改两大特点,它在各行各业皆有应用潜力…

帧间预测小记

帧间预测后,在比特流中会有相应的信息:残差信息,运动矢量信息,所选的模式。 宏块的色度分量分辨率是亮度分辨率的一半(Cr和Cb),水平和垂直均一半。色度块采用和亮度块一致的分割模式&#xff0…

ImageJ Nikon_科研论文作图之ImageJ

各位读者朋友们又见面了,今天给大家介绍一款图片处理软件——ImageJ,这是一款免费的科学图像分析工具,广泛应用于生物学研究领域。ImageJ软件能够对图像进行缩放、旋转、扭曲、模糊等处理,也可计算选定区域内分析对象的一系列几何…

【urllib】url编码问题简述

对url编解码总结 需要用到urllib库中的parse模块 import urllib.parse # Python3 url编码 print(urllib.parse.quote("天天")) # Python3 url解码 print(urllib.parse.unquote("%E5%A4%E5%A4%")) urlparse() # urllib.parse.urlparse(urlstring,scheme,…

独家| ChinaLedger白硕:区块链中的隐私保护

隐私问题一直是区块链应用落地的障碍问题之一,如何既能满足监管,又能不侵害数据隐私,是行业都在攻克的问题。那么,到底隐私问题为何难?有什么解决思路,以及实践创新呢?零知识证明、同态加密等技…

手机处理器排行榜2019_手机处理器AI性能排行榜出炉,高通骁龙第一,华为排在第十名...

↑↑↑击上方"蓝字"关注,每天推送最新科技新闻安兔兔在近日公布了今年四月份Android手机处理器AI性能排行榜,榜单显示高通骁龙865处理器的AI性能在Android阵营中排在第一名——该处理器的AI性能得分接近46万分,今年的小米10、三星G…

芯片支持的且会被用到的H.264特性 预测编码基本原理

视频压缩: 1.H.264基本档次和主要档次;2.CAVLC熵编码,即基于上下文的自适应变长编码;(不支持CABAC,即基于上下文的自适应算术编码)分辨率:仅用到1080p60,即分辨率为1920*…

MongoDB 数据库 【总结笔记】

一、MongoDB 概念解析 什么是MongoDB? ​ 1、MongoDB是有C语言编写的,是一个基于分布式文件存储的开源数据库系统,在高负载的情况下,添加更多节点,可以保证服务器的性能 ​ 2、MongoDB为web应用提供了高性能的数据存储…

PHP 函数截图 哈哈哈

转载于:https://www.cnblogs.com/bootoo/p/6714676.html

2016年光伏电站交易和融资的十大猜想

1领跑者计划备受关注,竞价上网或从试点开始 领跑者计划规模大,上网条件好,又有政府背书,虽说价格也不便宜,但省去很多隐性成本,对于致力于规模化发展的大型企业来说仍是首要选择。同时,从能源管…

loading gif 透明_搞笑GIF:有这样的女朋友下班哪里都不想去

原标题:搞笑GIF:有这样的女朋友下班哪里都不想去这样的广场舞看着不凉快吗?大哥慢点,机器经受不住你这样的速度求孩子的心里阴影面积生孩子就是用来玩的。有这样的媳妇做饭,下班哪里也不想去1.领导在门外用门夹核桃&am…

eigen库安装_OpenCV+Eigen上位机程序移植(七十一)

1、给硬盘分区现在小伙伴们对于给电脑硬盘分区想必比较头疼,给电脑硬盘分区分为两种情况,一是在安装系统之前给系统硬盘分区,二是在安装系统之后给硬盘分区,我们现在购买的品牌机和笔记本的用户比较多,而且笔记本和品牌…

【实战操作】使用FFmpeg将一个视频文件中音频合成到另一个视频中 只需三秒

直接进入主题 主要参数: -i——设置输入文件名。-f——设置输出格式。-y——若输出文件已存在时则覆盖文件。-fs——超过指定的文件大小时则结束转换。-t——指定输出文件的持续时间,以秒为单位。-ss——从指定时间开始转换,以秒为单位。-t从…

苹果依旧强大 物联网领域举足轻重

近几天科技界最火爆的话题就是苹果和谷歌两家公司,一是苹果发布财报,二是谷歌人工智能围棋战胜欧洲冠军以及谷歌母公司Alphabet或将超越苹果,成为世界上市值最大的公司。而在我眼里,未来五年内依然属于苹果。回顾下苹果公司公布的…

linux之SQL语句简明教程---SUBSTRING

SQL 中的 substring 函数是用来抓出一个栏位资料中的当中一部分。这个函数的名称在不同的资料库中不全然一样: MySQL: SUBSTR( ), SUBSTRING( )Oracle: SUBSTR( )SQL Server: SUBSTRING( )最经常使用到的方式例如以下 (在这里我们用 SUBSTR( ) 为例): SU…