之前半个月的时间几乎都在看理论书籍,最近两天开始撸代码,一个跟Hello World同级别的教程例子就出来了,那就是MNIST。实现代码应该很多地方都有:

 #!/usr/bin/env python
# -*- coding: utf-8 -*- # @Author : mario
# @File : mnist_main.py
# @Project : base
# @Time : 2018-12-18 22:56:38
# @Desc : File is ... import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("data/", one_hot=True) x = tf.placeholder(tf.float32, [None, 784], "image")
W = tf.Variable(tf.zeros([784, 10]), name="weight")
b = tf.Variable(tf.zeros([10]), name="bias") y = tf.nn.softmax(tf.matmul(x, W) + b) y_ = tf.placeholder(tf.float32, [None, 10]) cross_entropy = -tf.reduce_sum(y_ * tf.log(y)) train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) init = tf.global_variables_initializer() sess = tf.Session() sess.run(init) for _ in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) correct_rate = tf.reduce_mean(tf.cast(correct_prediction, "float")) print(sess.run(correct_rate, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

python版本:Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 05:52:31) ;tensor flow版本:1.12.0

11行,12行:导入tensorflow模块和读取数据的模块

14行:读取当前目录下data目录下的数据,在data目录下应该是下载好的数据文件(train-images-idx3-ubyte.gz、train-labels-idx1-ubyte.gz、10k-images-idx3-ubyte.gz、t10k-labels-idx1-ubyte.gz)

16行,17行,18行:为了构建模型方程设置的参数,模型方程是:y = xW+b,其中,x是自变量也就是输入参数,W是权重值,b是偏置量,所以在定义时,为一个占位符需要后期输入;W和b设置为变量参数,因为会随着训练而改变。

20行:构建整个算法模型关于softmax函数可以查一查,简单来说就是一种结果转换。y是每次训练的结果。

22行:y_是测试数据的对应标签。设置为占位符是因为我们需要输入标准的测试数据的标签。

24行:计算交叉熵

26行:实现梯度下降,学习率为0.01,学习率大小直接影响成功率和训练时间

28行:初始化

30行,32行:使用session提交执行图

34行:设置训练次数1000次

35行:读取训练数据,每次100个

36行:开始运行训练模型,其中feed_dict是为占位变量设置值

38行,40行:比较标准标签结果和测试结果,计算成功率

42行:运行计算成功率,将带测试的数据赋值给占位符

整个过程是不很复杂,其中一些算法的实现原理资料上都随便找得到。不过在这其中遇到过两个异常:

1:没有导入from tensorflow.examples.tutorials.mnist import input_data,而是将tensorflow.examples.tutorials.mnist 当作了14行的mnist使用,在执行到35行时抛出异常,异常为:AttributeError: module 'tensorflow.examples.tutorials.mnist.mnist' has no attribute 'train',一开始一直不知道原因,后来发给朋友,她告诉我没有导入数据集,突然才意识到真的忘记导入数据集了。

2:异常信息:
InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'Placeholder' with dtype float and shape [?,10]
     [[node Placeholder (defined at /Users/mario/CodeRepository/PycharmProjects/base/cn/mario/tensorflow/mnist/mnist_main.py:22)  = Placeholder[dtype=DT_FLOAT, shape=[?,10], _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

网上貌似也有一些人遇到了这个问题,开始也是很郁闷的,错误信息是没有给占位符赋值,placeholder需要一个类型为float形状为[?,10],我尝试了改变几种类型,但是如果类型不一致的话,错误信息会很直接的说明,它需要的是类型A,而你给了类型B,更改shape也是如此,所以开始感觉应该是不是类型不对dtype和shape的匹配问题,而是占位符就根本没有赋值,于是我检查了两个占位符,发现是我在36行将y_误写为了y。

可能很多人写在这个例子的时候没有遇到什么问题,但我觉得遇到问题也不是坏事,遇到问题,解决问题,能理解的更多一些。

记录MNIST实现与理解的更多相关文章

  1. 记录MNIST采用卷积方式实现与理解

    从时间上来说,这篇文章写的完了,因为这个实验早就做完了:但从能力上来说,这篇文章出现的早了,因为很多地方我都还没有理解.如果不现在写,不知道什么时候会有时间是其一,另外一个原因是怕自己过段时间忘记. ...

  2. Bootstrap 我的学习记录3 导航条理解

    以下理论内容copy自Bootstrap中文网 (一个不错的bootstrap学习网站) 导航条 默认样式的导航条 导航条是在您的应用或网站中作为导航页头的响应式基础组件.它们在移动设备上可以折叠(并 ...

  3. SPU、SKU、ARPU是什么,我来记录一下我的理解

    在电商系统里经常会提到“商品”.“单品”.“SPU”.“SKU”这几个词,那么这几个词到底是什么意思呢? 既然不知道是什么,那么我们就查一下:SPU = Standard Product Unit ( ...

  4. Spring学习记录(十二)---AOP理解和基于注解配置

    Spring核心之二:AOP(Aspect Oriented Programming) --- 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软 ...

  5. Mybatis学习记录(三)----理解SqlMapConfig.xml文件

    SqlMapConfig.xml mybatis的全局配置文件SqlMapConfig.xml,配置内容如下: properties(属性) settings(全局配置参数) typeAliases( ...

  6. TensorFlow使用记录 (二): 理解tf.nn.conv2d方法

    方法定义 tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=True, data_format="NHWC&quo ...

  7. 初步理解JNDI

    今天初步学习了jndi的基本原理,主要是 学习了收藏中的一篇博文,讲的很好,现在记录一下自己的理解. 其实jndi就和jdbc很相似, 我们希望通过相同的jdbc api来访问不同的数据库,就必须提供 ...

  8. 深入理解Linux中内存管理

    前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看 ...

  9. nRF51800 蓝牙学习 进程记录 2:关于二维数组 执念执战

    前天在玩OLED时想完成一直想弄得一个东西,就是简单的单片机游戏.因为STM32和nRF51822的内存足够,所以就用缓存数组的方法来显示图像(我也不知道术语是啥,反正就是在内存中建立一个128X64 ...

随机推荐

  1. HTML批量修改——正则表达式实践

    目录 1.问题描述 2.初步研究 3.进一步研究 3.1提取2.*中的序号* 3.2提取标题 3.3选取全文 3.4替换 参考资料 1.问题描述 如下所示的一段HTML代码: ... <h2 a ...

  2. java序列化的相关介绍

    1.什么是序列化?为什么要用序列化? 序列化就是将对象状态转换为可保持或传输的格式的过程.与序列化相对的就是反序列化,他将流转换成对象.这两个过程结合起来,可以轻松地存储和传输数据. 注意:对象序列化 ...

  3. Spring数据库连接池 c3p0、dbcp、spring-jdbc

    在用dbcp的时候 后面加上 destroy-method="close" 销毁的方法没事 但是用 spring的jdbc就会报错 提示找不到close这个方法  这是为什么? D ...

  4. Windows组决策

    https://blog.csdn.net/wangjunjun2008/article/details/82426587

  5. js的预解析和作用域

    预解析指的就是,在js文件或者script里面的代码在正式开始执行之前,进行的一些解析工作.这个工作很简单,就是在全局中寻找var关键字声明的变量和通过function关键字声明的函数. 1.寻找 v ...

  6. 基于Opencv自有模型识别人脸与人眼

    #!/usr/bin/python # -*- coding: utf-8 -*- import cv2 face_cascade = cv2.CascadeClassifier("D:/O ...

  7. Android 虚线实现绘制 - DashPathEffect

    前言: 通过view绘制虚实线,采用Android自带API--DashPathEffect.具体使用请参考更多的链接,这里只是讲解. 构造函数 DashPathEffect 的构造函数有两个参数: ...

  8. OC学习--继承

     1.什么是继承? 继承是指一个对象直接使用另一对象的属性和方法. 继承可以使得子类具有父类的各种属性和方法,而不是再次编写相同的代码.在子类继承父类的同时,可以重新定义某些属性,并重写某些方法, 即 ...

  9. sd卡无法启动及zc706更改主频后可以进入uboot无法启动kernel的坑

    好长的标题 +_+ 1.sd卡无法启动 起因:kernel底下通过dd测试速度,擦写了sd卡,再启动时发现无法启动 于是重新格式化,再将BOOT.bin 相关dtb u-rootfs zImage和u ...

  10. 【串线篇】SQL映射文件select简单查询标签

    一.参数(Parameters)传递 单个参数 基本类型:取值#{hahaha}随便写 多个参数 <!--   public Employee getEmpById(Integer id,Str ...