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自己构建一个自己的神经网络了,祝好远.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个基本的KNN分类器函数的Python实现: ```python import numpy as np def knn_classifier(train_data, train_labels, test_data, k): """ KNN分类器函数 :param train_data: 训练数据矩阵,每行为一个样本 :param train_labels: 训练标签列表,与训练数据矩阵行对应 :param test_data: 测试数据矩阵,每行为一个样本 :param k: K值,即选取最近邻的个数 :return: 测试样本的预测标签列表 """ # 计算训练数据和测试数据之间的距离矩阵 dists = np.sqrt(np.sum(np.square(train_data[:, np.newaxis, :] - test_data), axis=2)) # 对距离矩阵的每一行进行排序,并返回排序后的索引 sorted_indices = np.argsort(dists, axis=0) # 对于每个测试样本,选取距离最近的K个训练样本 k_nearest_labels = train_labels[sorted_indices[:k, :]] # 对K个最近邻的标签进行投票,返回票数最多的标签作为预测结果 pred_labels = np.argmax(np.bincount(k_nearest_labels, axis=0)) return pred_labels ``` 该函数接受四个参数: - `train_data`:训练数据矩阵,每行为一个训练样本,每列为一个特征。 - `train_labels`:训练标签列表,与训练数据矩阵行对应。 - `test_data`:测试数据矩阵,每行为一个测试样本,每列为一个特征。 - `k`:K值,即选取最近邻的个数。 该函数首先计算训练数据和测试数据之间的距离矩阵,然后对距离矩阵的每一行进行排序,并返回排序后的索引。对于每个测试样本,选取距离最近的K个训练样本,并对K个最近邻的标签进行投票,返回票数最多的标签作为预测结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Font Tian

写的很好,请给我钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值