tensorflow入门之mnist手写数据集识别
来源:互联网 发布:女白色t恤淘宝店铺推荐 编辑:程序博客网 时间:2024/06/01 23:54
最近开始研究机器学习,整个模型都自己写的话不太现实,所以还是得用框架。几经查找,选择了Google的Tensorflow框架,这个起步也还比较好用,网上参考资料也很多。
参考的教程官网:tensorflow
环境安装的话,我用的python3.6,这里强烈推荐安装个Anaconda,python包管理工具,用起来特别方便,切换python版本什么的也很简单。python库管理也是都可视化的。
在官网下载Anaconda安装包,安装完成之打开Navigator,如下:
搜索框输入tensorflow然后直接安装就行。
IDE我用的VSCode,安装一下python插件就可以用了。
然后开始入门的教程学习:
首先数据集要从mnist网站上下下来。下面是链接
mnist数据集下载地址
train-images-idx3-ubyte.gz: 训练数据集手写数字图片
train-labels-idx1-ubyte.gz: 训练数据集标签(对应于图片的答案)
t10k-images-idx3-ubyte.gz: 测试数据集图片
t10k-labels-idx1-ubyte.gz: 测试数据集标签
下载下来解压,这是用python struct打包了的byte文件,我们需要用代码再把它解析出来然后转成向量数组便于tensorflow引用,可以在教程上看到,图片集需要转成[60000,784]的矩阵,一个[,784]代表一张图片,即28*28展开成一维数组,这就是训练样本x,初步的计算公式就是y = Wx +b。W是权重,这个就是要不断训练得出来的最优解,b是偏移量,这些都是入门所需知识,在此便不多加赘述。
数据集解析比较麻烦,下面直接贴代码:
def read_train_image(self,filename): index = 0 binfile = open(filename,'rb') buf = binfile.read() magic, self.train_img_num, self.numRows,self.numColums = struct.unpack_from('>IIII',buf,index) self.train_img_list = np.zeros((self.train_img_num, 28 * 28)) index += struct.calcsize('>IIII') # print (magic, ' ', self.train_img_num, ' ', self.numRows, ' ', self.numColums) for i in range(self.train_img_num): im = struct.unpack_from('>784B',buf,index) index += struct.calcsize('>784B') im = np.array(im) # print(im) im = im/255 im = im.reshape(1,28*28) # im = im.reshape(28,28) self.train_img_list[i,:] = im # plt.imshow(im,cmap='binary') # plt.show() def read_train_lable(self,filename): index = 0 binfile = open(filename,'rb') buf = binfile.read() magic, self.train_label_num = struct.unpack_from('>II',buf,index) self.train_label_list = np.zeros((self.train_label_num, 10)) index += struct.calcsize('>II') # print(magic, self.train_label_num) for i in range(self.train_label_num): lblTemp = np.zeros(10) lbl = struct.unpack_from('>1B',buf,index) index += struct.calcsize('>1B') lbl = np.array(lbl) lblTemp[lbl[0]] = 1 self.train_label_list[i,:] = lblTemp # print(lblTemp) def next_batch_image(self,batchCount): rnd = np.random.randint(1,60000) return self.train_img_list[rnd:rnd+batchCount],self.train_label_list[rnd:rnd+batchCount] def read_test_image(self,filename): index = 0 binfile = open(filename,'rb') buf = binfile.read() magic, self.test_img_num, self.numRows,self.numColums = struct.unpack_from('>IIII',buf,index) self.test_img_list = np.zeros((self.test_img_num, 28 * 28)) index += struct.calcsize('>IIII') # print (magic, ' ', self.test_img_num, ' ', self.numRows, ' ', self.numColums) for i in range(self.test_img_num): im = struct.unpack_from('>784B',buf,index) index += struct.calcsize('>784B') im = np.array(im) im = im/255 im = im.reshape(1,28*28) # im = im.reshape(28,28) self.test_img_list[i,:] = im def read_test_lable(self,filename): index = 0 binfile = open(filename,'rb') buf = binfile.read() magic, self.test_label_num = struct.unpack_from('>II',buf,index) self.test_label_list = np.zeros((self.test_label_num, 10)) index += struct.calcsize('>II') # print(magic, self.test_label_num) #train for i in range(self.test_label_num): lblTemp = np.zeros(10) lbl = struct.unpack_from('>1B',buf,index) index += struct.calcsize('>1B') lbl = np.array(lbl) lblTemp[lbl[0]] = 1 self.test_label_list[i,:] = lblTemp # print(lblTemp)
其中四个方法分别返回四个数据集展开来的向量。因为数据样本有限以及模型比较简单,所以教程采用了随机训练(随机梯度下降训练),所以有个next_batch方法是返回随机100个(连续)样本。这里也可以改进成不连续的。
然后就是tensorflow这边的训练模型代码:
def tfOperate(): filename_t_image = "D:\\PY_Image\\handnum\\train-images.idx3-ubyte" filename_t_label = "D:\\PY_Image\\handnum\\train-labels.idx1-ubyte" filename_test_image = "D:\\PY_Image\\handnum\\train-images.idx3-ubyte" filename_test_label = "D:\\PY_Image\\handnum\\train-labels.idx1-ubyte" t = DP() t.read_train_image(filename_t_image) t.read_train_lable(filename_t_label) t.read_test_image(filename_test_image) t.read_test_lable(filename_test_label) # 训练样本image placeholder 是 n*784 x = tf.placeholder("float",[None,784]) #权重 W = tf.Variable(tf.zeros([784,10])) # bias b = tf.Variable(tf.zeros([10])) #训练模型 softmax y = tf.nn.softmax(tf.matmul(x,W) + b)# 交叉熵 cost or loss y_ = tf.placeholder("float", [None,10]) cross_entropy = -tf.reduce_sum(y_*tf.log(y)) # 梯度下降算法 最小化交叉熵 train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) # init = tf.initialize_all_variables() init = tf.global_variables_initializer() sess = tf.Session() sess.run(init) for i in range (3000): batch_xs,batch_ys = t.next_batch_image(100) # print(batch_ys.shape) sess.run(train_step,feed_dict = {x:batch_xs,y_:batch_ys}) if (i%500 == 0 and i >0): correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) print (sess.run(accuracy, feed_dict={x: t.test_img_list, y_: t.test_label_list}))
最后三句是用来测试识别成功率,大概是0.91左右。
最后顺便说一句,想要把这几个公式都看懂的话,最起码得入门线代,概率论和微积分三门课程。
线代可以学习MIT Gilbert Strang教授的线性代数公开课,网易公开课上有带字幕的。另外俩这上面也有公开课,看个人需求学习,博客写的有点糙。。主要就是打个笔记。
路还很长。。慢慢学。
数据集解析参考链接:
http://blog.csdn.net/supercally/article/details/54236658
- tensorflow入门之mnist手写数据集识别
- Tensorflow之基于MNIST手写识别的入门介绍
- 【Tensorflow入门】手写字体识别(MNIST)
- Tensorflow入门 mnist手写数字识别
- Tensorflow MNIST 手写识别
- tensorflow-mnist手写数字识别
- 【TensorFlow】神经网络MNIST手写识别
- 基于tensorflow的MNIST手写数字识别--入门篇
- [TensorFlow]入门学习笔记(2)-卷积神经网络mnist手写识别
- tensorflow入门实践例子—MNIST手写数字识别
- tensorflow的入门--手写数字识别mnist的傻瓜教程
- tensorflow 入门小例子(mnist手写数字识别)
- tensorflow入门-mnist手写数字识别(一)
- TensorFlow入门之训练mnist数据集
- Tensorflow测试Mnist手写数据集
- Tensorflow入门-简单神经网络进行MNIST数据集识别
- 手写字体识别 --MNIST数据集
- 经典手写数字mnist数据集识别
- WebClient 通过get和post请求api
- 树状数组(二叉索引树)
- linux目录常用命令简单
- Windows平台安装Hadoop
- sendSubviewToBack和bringSubviewToFront
- tensorflow入门之mnist手写数据集识别
- MongoDB 创建地图索引及根据位置坐标查询地点小例子
- CSS3的几个属性和文字翻页效果练习
- erlang高性能网络库esockd的编译和使用(三)-keepalive
- Java基本类型计算不准时,防坑妙招
- 03JXV支持分布式集群部署
- java学习之ArrayList容器类详解
- apply、call和bind的区别
- HashSet 对象去重复处理