TensorFlow实战:手写数字识别之K近邻

导语

自从Google发布了TensorFlow之后,作为一款开源的深度学习框架,在全世界范围内产生了巨大的影响力,如今在GitHub上深度学习框架居于第一名,且远远领先其他深度学习开源项目,并且也在工业界被大量运用。学习TensorFlow不仅可以加深对深度学习的理解,而且可以知道如何将深度学习这一门高深的学问用于实践当中。

TensorFlow就像其名字一样,由“tensor”和“flow”组成,“tensor”即“张量”的意思。框架的主要思想是先构建需要的计算图,图中每个定点表示一个操作,边表示张量之间的流向或依赖关系。当整个计算图构建完之后,启动计算图,系统会自动按照节点之间的依赖关系计算节点值,就能在需要的节点上获取数据。

本文并不打算详细介绍TensorFlow的原理,想要看原理的可以直接去官网。本文主要内容是用TensorFlow写一个入门级的算法K近邻实现手写数字识别MNIST。

加载数据

Keras提供了实现深度学习所需要的绝大部分函数库,可实现多种神经网络模型,并可加载多种数据集来评价模型的效果。下面的代码会自动加载数据,如果是第一次调用,数据会保存在你的hone目录下~/.keras/datasets/mnist.pkl.gz,大约15MB。

from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()

对数据的维度进行reshape,原数据是28*28大小的图片,要将其展开成784长度的向量,便于计算样本间的距离。

num_pixels = X_train.shape[1] * X_train.shape[2]
X_train = X_train.reshape(X_train.shape[0], num_pixels).astype('float32')
X_test = X_test.reshape(X_test.shape[0], num_pixels).astype('float32')
## 取一部分作为训练数据
Xtr, Ytr = X_train[:5000],y_train[:5000]
Xte, Yte = X_test,y_test

K近邻实现

计算训练集中的样本距离,采用L1距离,取距离最近的一个样本,将其标签赋值给测试样本

distance = tf.reduce_sum(tf.abs(tf.add(xtr, tf.negative(xte))), reduction_indices=1)
pred = tf.arg_min(distance, 0)

对测试集进行预测

accuracy = 0.

# 初始化
init = tf.global_variables_initializer()
## 启动session
with tf.Session() as sess:
    sess.run(init)
    # 对每个测试样本进行预测
    for i in range(len(Xte)):
        # 得到最近距离的样本
        nn_index = sess.run(pred, feed_dict={xtr: Xtr, xte: Xte[i, :]})
        # 输出预测结果
        print("Test", i, "Prediction:", np.argmax(Ytr[nn_index]), 
            "True Class:", np.argmax(Yte[i]))
        # 计算准确率
        if np.argmax(Ytr[nn_index]) == np.argmax(Yte[i]):
            accuracy += 1./len(Xte)
print("测试完成!")
print("Accuracy:", accuracy)

小结

用最近邻处理MNIST问题可以取得较好的效果,需要调节的参数主要是近邻的数目(K),模型的效果相当程度上依赖K的取值。虽然过程很简单,但对于了解和熟悉TensorFlow也很有帮助,同时也可以用TensorFlow实现逻辑回归、线性回归等模型,后面会一一将其实现。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值