• 8.2 TensorFlow实现KNN与TensorFlow中的损失函数,优化函数


    前言

    8.1 mnist_soft,TensorFlow构建回归模型中对主要对计算图的概念与公式与计算图的转化进行了介绍,8.2则主要介绍一下TensorFlow中自带的几个算子,与优化函数,损失函数的定义,并以KNN的例子进行整体的串联.

    加载数据,依旧使用mnist手写数字的数据

    # 导入数据
    from tensorflow.contrib.learn.python.learn.datasets import mnist
    FLAGS = None
    
    data_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 optimizer
    
    cross_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自己构建一个自己的神经网络了,祝好远.

  • 相关阅读:
    【luogu P1343 地震逃生】 题解
    【luogu P3931 SAC E#1
    【luogu P3275 [SCOI2011]糖果】 题解
    【luogu P2947 [USACO09MAR]向右看齐Look Up】 题解
    【luogu P1456 Monkey King】 题解
    【luogu P3377 左偏树(可并堆)】 模板
    【luogu P1993 小K的农场】 题解
    Sqlmap注入Base64编码的注入点
    kali高速更新源以及主题修改方法
    DiscuzX3.1搬家全过程
  • 原文地址:https://www.cnblogs.com/fonttian/p/7582476.html
Copyright © 2020-2023  润新知