8.2 TensorFlow实现KNN与TensorFlow中的损失函数,优化函数
来源:互联网 发布:apache bench post 编辑:程序博客网 时间:2024/05/22 05:25
前言
8.1 mnist_soft,TensorFlow构建回归模型中对主要对计算图的概念与公式与计算图的转化进行了介绍,8.2则主要介绍一下TensorFlow中自带的几个算子,与优化函数,损失函数的定义,并以KNN的例子进行整体的串联.
加载数据,依旧使用mnist手写数字的数据
# 导入数据from tensorflow.contrib.learn.python.learn.datasets import mnistFLAGS = Nonedata_sets = mnist.read_data_sets('/home/fonttian/Data/MNIST_data/',one_hot=True)# 我们对mnist的数据集做一个数量限制Xtrain,Ytrain = data_sets.train.next_batch(5000) # 5000 用于训练Xtest,Ytest = data_sets.test.next_batch(200) # 200 用于测试print('Xtrain.shape: ',Xtrain.shape,'Xtest.shape: ',Xtest.shape)print('Ytrain.shape: ',Ytrain.shape,'Ytest.shape: ',Ytest.shape)
KNN的实现
- 计算数据的L1距离
- 寻找最小距离的数据标签,确定其为类别
由上可知,我们仅仅实现了一个几乎算是最原始的KNN算法,但是无妨于我们的演示,你要是想练习的话可以写的复杂一点,但是实际使用还是使用skleran吧.
核心代码如下:
# 使用L1距离进行最近邻近算# 计算L1 距离distance = tf.reduce_sum(tf.abs(tf.add(xtrain,tf.negative(xtest))),axis=1)# 预测; 获得最小距离的索引(根据最近邻的类标签进行判断pred = tf.argmin(distance,0)# 评估: 判断给定的一条测试数据是否判断正确
- tf.negative() :取相反数
- tf.abs():取绝对值
- tf.argmin():返回最小值的索引
启动session并运行
# 启动会话with tf.Session() as sess: # 初始化节点 tf.global_variables_initializer().run() Ntest = len(Xtest) # 测试样本的数据 # 在测试集上进行循环 for i in range(Ntest): # 获取当前测试样本的最近邻 nn_index = sess.run(pred,feed_dict={xtrain:Xtrain,xtest:Xtest[i,:]}) # 获取最近邻预测标签,然后与真实的类标签比较 pred_class_label = np.argmax(Ytrain[nn_index]) true_class_label = np.argmax(Ytest[i]) print('Test',i,'Predicted Class Label:',pred_class_label,'True Class label:',true_class_label) # 计算准确率 if pred_class_label == true_class_label: accuracy += 1 print('Done!') accuracy /= Ntest print('Accuracy:',accuracy)
中场休息
由上我们已经实现了一个TensorFlow版本的KNN,但是KNN本来就简单到了很多类库可以很随意的实现,那么TensorFlow的特殊之处又在哪里呢?有二
1. 计算图式的计算方式,
2. 因为是计算图的形式运算,所以必须使用TensorFlow自带的函数进行运算,还在TensorFlow还提供了部分基础运算符号,比如”+”,”-“等运算符号,其也可以代替TensorFlow的运算函数tf.add(),和tf.subtract()
但是其实我们真正经常使用的TensorFlow自带的运算函数并不多,除了上面的几个函数外,最常用的恐怕就是tf.matmul()
了吧,这个函数是乘法的函数,在神经网络的全连接中我们经常用到这个函数.其他的函数因为运用并不多,所以此处不在过多叙述.
KNN所没有用到的
KNN相较于其它很多算法一个很不明显不同的地方就是可以通过已有数据计算出结果,而无需进行训练和降低预测误差的反向传播过程,但是在现在的深度学习中这个过程则是必然存在的,所以反向传播的过程则是必然的.而TensorFlow的一个强大之处,就在于此处,对反向传播的自动求导,依靠计算图的机制,在我们使用TensorFlow进行深度学习的开发之时,只需要简单的定义损失函数以及通过一行简简单单的代码,选择要进行优化的损失函数之后,TensorFlow就可以对损失函数进行自动求导,训练我们所构建的计算图.
定义损失函数与优化损失函数
我们以之前8.1 中的代码为例子:
# 此处就是定义我们的损失函数,# Define loss and optimizercross_entropy = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))# 我们通过下面的代码添加我们的损失函数train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
另外一个BP神经网络的例子
# 接下来构建损失函数: 计算输出层的预测值和真是值间的误差,对于两者差的平方求和,再取平均,得到损失函数.运用梯度下降法,以0.1的效率最小化损失loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction), reduction_indices=[1]))train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) # 优化算法选取SGD,随机梯度下降
至此,通过TensorFlow基础篇前八章的例子,你已经基本上手了TensorFlow
而在8.3 TensorFlow BP神经网络构建与超参数的选取中我将会给出上面的BP神经网络的完整代码.其实现在,你可以试着用TensorFlow自己构建一个自己的神经网络了,祝好远.
- 8.2 TensorFlow实现KNN与TensorFlow中的损失函数,优化函数
- 10、TensorFLow 中的损失函数
- Tensorflow实现经典损失函数
- Tensorflow 损失函数定义
- TensorFlow损失函数专题
- TensorFlow自定义损失函数
- tensorflow中的优化函数
- tensorflow中损失函数总结
- [tensorflow损失函数系列]sigmoid_cross_entropy_with_logits
- [tensorflow损失函数系列]weighted_cross_entropy_with_logits
- [tensorflow损失函数系列]softmax_cross_entropy_with_logits
- [tensorflow损失函数系列]sparse_softmax_cross_entropy_with_logits
- TensorFlow四种损失函数
- tensorflow学习之损失函数设置和参数优化
- tensorflow系列1:两种方式优化损失函数
- 罗斯基白话:TensorFlow+实战系列(三)常用损失函数与参数优化
- TensorFlow中的tf.nn.softmax_cross_entropy_with_logits 交叉熵 损失函数
- (#########优化器函数########)TensorFlow实现与优化深度神经网络
- 怎样减少 Android 应用包大小
- Linux学习笔记之服务管理
- 模板系列
- NMS——非极大值抑制
- Spring Boot(四):利用注解自定义日期格式化
- 8.2 TensorFlow实现KNN与TensorFlow中的损失函数,优化函数
- 计算图片相似度的多种解决方案
- ionic3中文文档:悬浮按钮FabButton
- Servlet(4)ServletContext接口 (获取web.xml中所有Servlet共有的信息)
- 在线小说阅读网站开源项目地址整合
- Html页面优化
- 创建一个将某个数分配为多少份的随机数的表值函数
- [JZOJ5358]【NOIP2017提高A组模拟9.12】BBQ
- Android BitmapFactory 解码总结