tensorflow实现KNN识别MNIST

下面我将为您详细讲解如何使用TensorFlow实现KNN识别MNIST数字手写图片的完整攻略。这个过程主要包括以下两个示例:

  • 使用TensorFlow实现KNN识别MNIST
  • 使用TensorFlow实现基于KNN的手写数字图片识别

示例一:使用TensorFlow实现KNN识别MNIST

准备工作

在开始实现之前,需要安装TensorFlow及MNIST数据集。安装TensorFlow请参考官方文档的安装教程,安装MNIST数据集则可以通过TensorFlow自带的下载脚本实现:

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

接下来,我们需要使用欧几里得距离计算一个样本与训练集中每个样本之间的距离。代码如下:

# 计算欧几里得距离
def euclidean_dist(v1, v2):
    return np.sqrt(np.sum(np.power(v1 - v2, 2)))

# 使用KNN算法对图像进行分类
def knn_classify(test_image, train_images, train_labels, k):
    distances = []
    # 计算测试图片与训练集中所有图片的距离
    for i in range(train_images.shape[0]):
        dist = euclidean_dist(train_images[i], test_image)
        distances.append((dist, train_labels[i]))
    # 按距离从小到大排序
    distances.sort(key=lambda x: x[0])
    # 返回距离最小的前k个训练实例的类别标签
    return Counter([x[1] for x in distances[:k]]).most_common(1)[0][0]

使用KNN进行分类

使用上述代码实现对手写数字图片的识别。具体步骤包括:

  1. 加载MNIST数据集;
  2. 对测试集中每个图片进行预测,并输出结果。

代码如下:

k = 5 # 假定k=5
batch_size = 100
accurate_count = 0
for i in range(mnist.test.images.shape[0] // batch_size):
    test_images = mnist.test.images[i * batch_size:(i + 1) * batch_size]
    test_labels = mnist.test.labels[i * batch_size:(i + 1) * batch_size]
    for j in range(batch_size):
        predicted_label = knn_classify(test_images[j], mnist.train.images, mnist.train.labels, k)
        true_label = np.argmax(test_labels[j])
        if predicted_label == true_label:
            accurate_count += 1
accuracy = accurate_count / mnist.test.images.shape[0]
print("Accuracy: {:.2f}%".format(accuracy * 100))

这里我们假设K=5,对测试集中的每个图片进行预测。最后输出分类准确率。

示例二:使用TensorFlow实现基于KNN的手写数字图片识别

准备工作

在开始实现之前,需要安装TensorFlow及MNIST数据集。安装TensorFlow请参考官方文档的安装教程,安装MNIST数据集则可以通过TensorFlow自带的下载脚本实现,同示例一。

网络架构

我们使用TensorFlow实现基于KNN的手写数字图片识别。我们采用的网络架构如下所示:

  1. 输入层:将手写数字图片简化为一维向量,作为神经网络的输入;
  2. 输出层:根据输入图片,计算出图片属于数字0 ~ 9的概率;
  3. KNN层:对输出层的结果进行KNN分类,得到最终的分类结果。

网络实现

由于网络架构中包含了KNN层,因此我们需要实现一个KNN层,来完成对输出层的分类任务。

# 定义KNN层
class KNNLayer(Layer):

    def __init__(self, k, **kwargs):
        super(KNNLayer, self).__init__(**kwargs)
        self.k = k

    def build(self, input_shape):
        self.train_labels = self.add_weight(name='train_labels', shape=(60000,), initializer='uniform', trainable=False)
        super(KNNLayer, self).build(input_shape)

    def euclidean_dist(self, v1, v2):
        return tf.sqrt(tf.reduce_sum(tf.square(v1 - v2)))

    def call(self, inputs):
        outputs = []
        for test_instance in inputs:
            distances = []
            for i in range(self.train_labels.shape[0]):
                dist = self.euclidean_dist(self.train_labels[i], test_instance)
                distances.append((dist, i))
            distances.sort(key=lambda x: x[0])
            indices = [x[1] for x in distances[:self.k]]
            labels = [self.train_labels[i] for i in indices]
            counter = tf.math.bincount(tf.cast(labels, tf.int32), minlength=10)
            output = tf.expand_dims(tf.argmax(counter, axis=0), axis=0)
            outputs.append(output)
        return tf.concat(outputs, axis=0)

    def compute_output_shape(self, input_shape):
        return (input_shape[0], 1)

我们还需要实现一个自定义的softmax层,这里不详细展开。

接下来,我们可以使用TensorFlow来定义我们的网络模型,并进行训练和测试。

# 定义模型
model = Sequential([
    Dense(512, input_shape=(784,), activation='relu'),
    Dropout(0.2),
    Dense(512, activation='relu'),
    Dropout(0.2),
    Dense(10, activation='softmax'),
    KNNLayer(5)
])

# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# 训练模型
model.fit(mnist.train.images, mnist.train.labels, epochs=10, batch_size=128, validation_data=(mnist.test.images, mnist.test.labels))

# 测试模型
test_loss, test_accuracy = model.evaluate(mnist.test.images, mnist.test.labels)
print("Test Loss: {:.4f}, Test Accuracy: {:.2f}%".format(test_loss, test_accuracy * 100))

这里,我们共训练10个epochs,batch size设置为128。测试时直接使用evaluate函数得到损失和准确率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:tensorflow实现KNN识别MNIST - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • 卷积神经网络在tenserflow的实现

    卷积神经网络的理论基础看这篇:http://blog.csdn.net/stdcoutzyx/article/details/41596663/ 卷积神经网络的tenserflow教程看这里:http://www.tensorfly.cn/tfdoc/tutorials/deep_cnn.html 卷积神经网络(convolutional neural ne…

    2023年4月8日
    00
  • 深度拾遗(06) – 1X1卷积/global average pooling

    什么是1X1卷积 11的卷积就是对上一层的多个feature channels线性叠加,channel加权平均。只不过这个组合系数恰好可以看成是一个11的卷积。这种表示的好处是,完全可以回到模型中其他常见N*N的框架下,不用定义新的层。比如上一层通过100个卷积核得到了 W * H * 100的数据,进行10个1X1卷积后得到 W * H * 10 的数据,…

    2023年4月6日
    00
  • FMT 与 子集(逆)卷积

    本文参考了 Dance of Faith 大佬的博客 我们定义集合并卷积 \[h_{S} = \sum_{L \subseteq S}^{} \sum_{R \subseteq S}^{} [L \cup R = S] f_{L} * g_{R} \] 最暴力的时候只能 \(O(4^n)\) 完成,进行 一些优化 可以在 \(O(3^n)\) 内完成,当然我…

    卷积神经网络 2023年4月8日
    00
  • SRCNN 卷积神经网络

    2019-05-19 从GitHub下载了代码(这里) 代码量虽然不多,但是第一次学,花了时间还是挺多的。根据代码有跑出结果(基本没有改),但是对于数据集的处理还是看的很懵逼,主要是作者的实现都是用类封装,然后调用函数实现,而且每一个代码块没有测试,所以很多代码不知道什么意思,所以,我把能够拆分的进行了拆分,用jupyter重新实现下   一、数据集的理解 …

    2023年4月8日
    00
  • Tensorflow 如何从checkpoint文件中加载变量名和变量值

    在Tensorflow中,保存和加载变量以checkpoint文件的方式进行。从checkpoint文件中加载变量名和变量值的方法在使用Tensorflow训练模型,在后续的模型迁移、fine-tune等场景中都具有很高的实用性。本文将就如何从checkpoint文件中加载变量名和变量值进行详细的讲解,并提供两条示例说明。 加载变量名和变量值的方法 1. 通…

    卷积神经网络 2023年5月15日
    00
  • 『cs231n』卷积神经网络工程实践技巧_上

    数据增强 思路:在训练的时候引入干扰,在测试的时候避免干扰。 翻转图片增强数据。       随机裁切图片后调整大小用于训练,测试时先图像金字塔制作不同尺寸,然后对每个尺寸在固定位置裁切固定大小进入训练,最后对所有结果取平均值。   对颜色信息进行主成分分析并重建   迁移学习 三种网络训练思路: 中量数据的训练思路:先训练附加层,收敛后整体整体微调(fun…

    卷积神经网络 2023年4月7日
    00
  • 职场剧《精英律师》也种草?讯飞录音笔SR501让你体验高效办公

    以下是详细的攻略: 职场剧《精英律师》也种草? 为什么看《精英律师》可以种草讯飞录音笔SR501? 在职场剧《精英律师》中,主人公们用讯飞录音笔SR501来记录各种会议、庭审和客户会面。这种高效的记录方式,可以极大的提高工作效率,让律师们更容易胜诉。 而对于我们普通公民而言,在听讲座、参加会议、实习培训、采访等场景中,也可以使用讯飞录音笔SR501进行高效的…

    卷积神经网络 2023年5月15日
    00
  • GCN 图神经网络使用详解 可视化 Pytorch

    下面是关于GCN图神经网络使用详解及其可视化的攻略,包含两个示例说明。 示例1:定义GCN图神经网络类 以下是一个定义GCN图神经网络类的示例: import torch import torch.nn as nn import torch.nn.functional as F from torch_geometric.nn import GCNConv c…

    卷积神经网络 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部