机器学习/深度学习个人进阶日志-基于Tensorflow的手写数字识别初步

tensorflow官方给的教程里面的手写数字识别项目,今天奉上第一版,代码如下,运行环境python3.5,最终的准确率大约是92%.

首先安装相应的python库,包括三个,tensorflow、pandas、numpy。通过基本的pip命令安装即可。

整个代码分成三块:数据处理模块、建立模型模块、训练模型模块。比较繁琐的部分就是数据处理模块,需要读入数据,然后分开label和image数据,对image数据矩阵归一化处理,对label数据one-dot化处理。并且考虑到后面要用随机梯度下降算法,因此对于训练数据分成一块一块的。数据处理模块用到的就是pandas和numpy模块的函数。

接下来就是建立模型和训练模型了。定义占位符和变量,然后建立softmax回归模型,利用交叉熵作为代价函数,通过随机梯度下降算法进行模型优化。创建完一系列节点后,把图放在session中运行训练模型即可。

最终的准确率并不高,之后会参考相应的教程进行优化处理。

经过本次学习,大概熟悉了一部分python语言和常用库。希望能通过一系列的项目提高动手能力,这才是我们的初衷。


import tensorflow as tf
import pandas as pd
import numpy as np
#读入数据
train = pd.read_csv("train.csv")
#获得images并归一化
images = train.iloc[:,1:].values
images=images.astype(np.float)
images=np.multiply(images,1.0/255.0)
image_size=images.shape[1]
#获得label
labels_flat=train.iloc[:,0].values.ravel()
labels_count=np.unique(labels_flat).shape[0]
#定义转换函数
def dense_to_one_dot(labels_dense,num_classes):
    num_labels_dense=labels_dense.shape[0]#对于一维数组 shape[0]即一维数组长度
    labels_one_dot=np.zeros((num_labels_dense,num_classes))
    index_offset=np.arange(num_labels_dense)*num_classes
    labels_one_dot.flat[index_offset+labels_dense.ravel()]=1
    return labels_one_dot
#将标签数据转换成one-dot格式
labels=dense_to_one_dot(labels_flat,labels_count)
labels=labels.astype(np.uint8)
#验证数据
VALIDATION_SIZE=2000
validation_images=images[:VALIDATION_SIZE]
validation_labels=labels[:VALIDATION_SIZE]
#训练数据
train_images=images[VALIDATION_SIZE:]
train_labels=labels[VALIDATION_SIZE:]
#数据分批  向下取整
batch_size=100
n_batch=int(len(train_images)/batch_size)
#定义占位符 x为训练模型的image数据 y为训练模型的label数据
x=tf.placeholder(tf.float32,shape=[None,image_size])
y=tf.placeholder(tf.uint8,shape=[None,labels_count])
#定义变量W和b 可在模型训练过程中优化
W=tf.Variable(tf.zeros([image_size,labels_count]))
b=tf.Variable(tf.zeros([labels_count]))
#创建线性加权操作节点 result是一个labels_count大小的一维数组
result=tf.matmul(x,W)+b
#将result输入进激活函数中得到预测的概率分布数组y_
y_=tf.nn.softmax(result)
#创建损失函数交叉熵的平均值
loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=y_))
#使用梯度下降优化算法优化得到参数
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)
#初始化变量
init=tf.global_variables_initializer()
#创建计算准确度的节点
correct=tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
accuracy=tf.reduce_mean(tf.cast(correct,tf.float32))
#创建session来运行图
with tf.Session() as sess:
    sess.run(init)
    for i in range(50):
        for batch in range(n_batch):
            #随机梯度下降算法
            batch_x=train_images[batch*batch_size:(batch+1)*batch_size]
            batch_y = train_labels[batch * batch_size:(batch + 1) * batch_size]
            #进行训练
            sess.run(train_step,feed_dict={x:batch_x,y:batch_y})
        #对于每次循环 计算准确度
        a=sess.run(accuracy,feed_dict={x:validation_images,y:validation_labels})
        print("第"+str(i+1)+"轮,准确度为:"+str(a))






阅读更多
个人分类: tensorflow
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭