tensorflow处理mnist(二)
用卷积神经网络解决mnist的分类问题.
简单的例子
一行一行解释这个代码. 这个不是google官方的例子,但是很简洁,便于入门.tensorflow是先定义模型,最后赋值,计算.为了讨论问题方便,还是按照以前的讨论方法,先假定数据集只有16张图片.x是16*784的矩阵.weights是一个包含多个矩阵的map. biases是包含多个向量的map.算法就是为了训练weights和biases.
def conv2d(x, W, b, strides=1):
x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding='SAME')
x = tf.nn.bias_add(x, b)
return tf.nn.relu(x)
x = tf.reshape(x, shape=[-1, 28, 28, 1])
conv1 = conv2d(x, weights['wc1'], biases['bc1'])
把x转化成16*28*28*1. 16表示有几张图片,28表示宽是几个像素,第2个28表示长有几个像素,1表示通道数,mnist是黑白图片,所以通道数是1.wc1是5*5*1*32的矩阵,bc1是长度为32的向量.strides的4个数分别代表滑动时4个值的偏移量.现在先暂时关注中间2个,长宽的偏移量.对于padding这个参数,这时不讨论它的实际意义,根据参考资料1,它影响的是图片周围补充0的个数.当padding=SAME时,图片周围补充0的个数计算方法如下:
pad_along_height = max((out_height - 1) * strides[1] + filter_height - in_height, 0)
pad_along_width = max((out_width - 1) * strides[2] + filter_width - in_width, 0)
pad_top = pad_along_height
pad_bottom = pad_along_height - pad_top
pad_left = pad_along_width
pad_right = pad_along_width - pad_left
输出的宽高计算方法如下:
out_height = ceil(float(in_height) / float(strides[1]))
out_width = ceil(float(in_width) / float(strides[2]))
这里有可以运行的python代码:
import math
class PaddingConv:
def __init__(self, strides, in_height, in_width, filter_height, filter_width):
self.out_height = math.ceil(float(in_height) / float(strides[1]))
self.out_width = math.ceil(float(in_width) / float(strides[2]))
pad_along_height = max((self.out_height - 1) * strides[1] + filter_height - in_height, 0)
pad_along_width = max((self.out_width - 1) * strides[2] + filter_width - in_width, 0)
self.pad_top = pad_along_height
self.pad_bottom = pad_along_height - self.pad_top
self.pad_left = pad_along_width
self.pad_right = pad_along_width - self.pad_left
print("pad_top=" + str(p.pad_top))
print("pad_bottom=" + str(p.pad_bottom))
print("pad_left=" + str(p.pad_left))
print("pad_right=" + str(p.pad_right))
print("out_height=" + str(p.out_height))
print("out_width=" + str(p.out_width))
tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding='SAME')之后x变成16*28*28*32,计算方法见上面的公式.bias_add,relu都不影响结果的结构.所以第一次conv2d之后,返回的是16*28*28*32的矩阵.
def maxpool2d(x, k=2):
return tf.nn.max_pool(x, ksize=[1, k, k, 1], strides=[1, k, k, 1],
padding='SAME')
卷积之后要进行池化操作.max_pool的strides,padding参数和conv2d中的是一样的.ksize只用关注中间2个数.代表卷积核的宽长是多少,就是上面filter_width,filter_height的大小.可以同样用PaddingConv计算池化后的宽长.
p = PaddingConv(strides=[1, 2, 2, 1], in_height=28, in_width=28, filter_height=2, filter_width=2)
print("out_height=" + str(p.out_height))
print("out_width=" + str(p.out_width))
print("pad_top=" + str(p.pad_top))
print("pad_bottom=" + str(p.pad_bottom))
print("pad_left=" + str(p.pad_left))
print("pad_right=" + str(p.pad_right))
池化不影响通道数.wc2是5*5*32*64的矩阵.bc2是长度为64的一维数组.输入是16*14*14*32的矩阵.通过PaddingConv可以计算出输出的长宽为14*14.输出通道数是64,即输出是16*14*14*64的矩阵.通过PaddingConv可以计算出池化后为16*7*7*64的矩阵.
fc1 = tf.reshape(conv2, [-1, weights['wd1'].get_shape().as_list()[0]])
conv2被转化为fc1,结果是16*3136.再乘下wd1(3136*1024),加上bd1.
fc1 = tf.add(tf.matmul(fc1, weights['wd1']), biases['bd1'])
fc1变成16*1024的矩阵
fc1 = tf.nn.relu(fc1)
fc1 = tf.nn.dropout(fc1, dropout)
relu和dropout都不改变结果的形状.fc1仍为16*1024.
tf.add(tf.matmul(fc1, weights['out']), biases['out'])
out是1024*10,所以最终结果是16*10的矩阵.后面的代码和上一篇是非常类似的.不再解释.
问题
官方的例子没有完全弄明白.
参考资料
- tensorflow官方api
tensorflow处理mnist(二)的更多相关文章
- 基于tensorflow的MNIST手写数字识别(二)--入门篇
http://www.jianshu.com/p/4195577585e6 基于tensorflow的MNIST手写字识别(一)--白话卷积神经网络模型 基于tensorflow的MNIST手写数字识 ...
- 深入浅出TensorFlow(二):TensorFlow解决MNIST问题入门
2017年2月16日,Google正式对外发布Google TensorFlow 1.0版本,并保证本次的发布版本API接口完全满足生产环境稳定性要求.这是TensorFlow的一个重要里程碑,标志着 ...
- Android+TensorFlow+CNN+MNIST 手写数字识别实现
Android+TensorFlow+CNN+MNIST 手写数字识别实现 SkySeraph 2018 Email:skyseraph00#163.com 更多精彩请直接访问SkySeraph个人站 ...
- Ubuntu16.04安装TensorFlow及Mnist训练
版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com TensorFlow是Google开发的开源的深度学习框架,也是当前使用最广泛的深度学习框架. 一.安 ...
- 使用Tensorflow操作MNIST数据
MNIST是一个非常有名的手写体数字识别数据集,在很多资料中,这个数据集都会被用作深度学习的入门样例.而TensorFlow的封装让使用MNIST数据集变得更加方便.MNIST数据集是NIST数据集的 ...
- 2、TensorFlow训练MNIST
装载自:http://www.tensorfly.cn/tfdoc/tutorials/mnist_beginners.html TensorFlow训练MNIST 这个教程的目标读者是对机器学习和T ...
- tensorflow学习笔记——使用TensorFlow操作MNIST数据(2)
tensorflow学习笔记——使用TensorFlow操作MNIST数据(1) 一:神经网络知识点整理 1.1,多层:使用多层权重,例如多层全连接方式 以下定义了三个隐藏层的全连接方式的神经网络样例 ...
- tensorflow学习笔记——使用TensorFlow操作MNIST数据(1)
续集请点击我:tensorflow学习笔记——使用TensorFlow操作MNIST数据(2) 本节开始学习使用tensorflow教程,当然从最简单的MNIST开始.这怎么说呢,就好比编程入门有He ...
- 基于TensorFlow的MNIST手写数字识别-初级
一:MNIST数据集 下载地址 MNIST是一个包含很多手写数字图片的数据集,一共4个二进制压缩文件 分别是test set images,test set labels,training se ...
随机推荐
- C++中对C的扩展学习新增内容———面向对象(封装)
面向对象(封装) 1.对封装的理解: 1.封装就是把变量和函数放在一起统一表示某一个食物. class 2.给类内部的成员增加访问控制权限. 3.封装的语法就是class定义一个类. 2.给对象成员增 ...
- 力扣(LeetCode)移除链表元素 个人题解
删除链表中等于给定值 val 的所有节点. 这题粗看并不困难,链表的特性让移除元素特别轻松,只用遇到和val相同的就跳过,将指针指向下一个,以此类推. 但是,一个比较麻烦的问题是,当链表所有元素都和v ...
- 反汇编分析NSString,你印象中的NSString是这样吗
我们先来定义三个NSString -(void) testNSString { NSString* a = @"abc"; NSString* b = [NSString stri ...
- 使用ASP.NET Core 3.x 构建 RESTful API - 3.2 路由和HTTP方法
ASP.NET Core 3.x 的路由 路由机制会把一个请求的URI映射到一个Controller上面的Action,所以当你发送一个HTTP请求的时候,MVC框架会解析这个请求的URI,并尝试着把 ...
- ASP.NET Core gRPC 使用 Consul 服务注册发现
一. 前言 gRPC 在当前最常见的应用就是在微服务场景中,所以不可避免的会有服务注册与发现问题,我们使用gRPC实现的服务可以使用 Consul 或者 etcd 作为服务注册与发现中心,本文主要介绍 ...
- 【翻译】全球用尽IPv4的一点思考
作者:Dimple 公众号:奔跑吧攻城狮 简介:专属于Java和Android开发,和你聊聊职场话题,一同展望未来 作为小小号主的我表示很无力啊,这几天,天天都是热点.前有网易员工勇敢发声维护自己的利 ...
- k8s 获取 Pod ip 添加到环境变量
0x00 事件 有一个需要将 Pod 自身的 ip 地址添加到环境变量的需求,可以在 yaml 文件的 env 中这样设置: env: - name: POD_OWN_IP_ADDRESS value ...
- 【2018寒假集训 Day2】【动态规划】钱币兑换(exchange)(自己翻译的2333)
钱币兑换(exchange) 问题描述: Dave偶然获得了未来几天的美元(dollars)与马克(marks)之间的兑换率.例如Dave开始有100marks,请编写个程序帮助Dave找出最好的买卖 ...
- SQL SERVER中SELECT和SET赋值相同点与不同点
SELECT和SET在SQL SERVER中都可以用来对变量进行赋值,但其用法和效果在一些细节上有些不同. 1. 在对变量赋值方面,SET是ANSI标准的赋值方式,SELECT则不是.这也是SET方式 ...
- requests请求库
# coding = utf-8 """ 同urllib一样 requests 也是发送http请求的第三方库 兼容Python2和3 实现了http的绝大部分功能. 安 ...