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的实现

  1. 计算数据的L1距离
  2. 寻找最小距离的数据标签,确定其为类别
    由上可知,我们仅仅实现了一个几乎算是最原始的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自己构建一个自己的神经网络了,祝好远.

阅读全文
1 0
原创粉丝点击