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日

相关文章

  • 相关与卷积(数字信号处理)的数学原理及 Python 实现

    数学原理   在数字信号处理中,相关(correlation)可以分为互相关(cross correlation)和自相关(auto-correlation). 互相关是两个数字序列之间的运算;自相关是单个数字序列本身的运算,可以看成是两个相同数字序列的互相关运算.互相关用来度量一个数字序列移位后,与另一个数字序列的相似程度.其数学公式如下:   其中,f …

    2023年4月8日
    00
  • 卷积神经网络中十大拍案叫绝的操作【转】

    原文:https://cloud.tencent.com/developer/article/1038802 CNN从2012年的AlexNet发展至今,科学家们发明出各种各样的CNN模型,一个比一个深,一个比一个准确,一个比一个轻量。我下面会对近几年一些具有变革性的工作进行简单盘点,从这些充满革新性的工作中探讨日后的CNN变革方向。   注:水平所限,下面…

    2023年4月6日
    00
  • 基于Python的卷积神经网络和特征提取

    用户1737318发表于人工智能头条订阅 224 在这篇文章中: Lasagne 和 nolearn 加载MNIST数据集 ConvNet体系结构与训练 预测和混淆矩阵 过滤器的可视化 Theano层的功能和特征提取 作者:Christian S.Peron 译者:刘帝伟 摘要:本文展示了如何基于nolearn使用一些卷积层和池化层来建立一个简单的ConvN…

    2023年4月8日
    00
  • python实现拼接图片

    下面是关于Python实现拼接图片的完整攻略。 拼接图片的原理 拼接图片是将多张图片按照一定的顺序和排列方式拼接成一张大图的过程。在Python中,可以使用Pillow库来实现拼接图片的功能。Pillow库是Python中一个常用的图像处理库,可以用于打开、操作和保存多种图像格式。 拼接图片的原理是将多张图片按照一定的顺序和排列方式合并成一张大图。在Pill…

    卷积神经网络 2023年5月16日
    00
  • 总结了6种卷积神经网络压缩方法

    摘要:神经网络的压缩算法是,旨在将一个庞大而复杂的预训练模型(pre-trained model)转化为一个精简的小模型。 本文分享自华为云社区《卷积神经网络压缩方法总结》,作者:嵌入式视觉 。 我们知道,在一定程度上,网络越深,参数越多,模型越复杂,其最终效果越好。神经网络的压缩算法是,旨在将一个庞大而复杂的预训练模型(pre-trained model)…

    2023年4月5日
    00
  • 深度卷积网络CNN与图像语义分割

    转载请注明出处: http://xiahouzuoxin.github.io/notes/html/深度卷积网络CNN与图像语义分割.html 级别1:DL快速上手 级别2:从Caffe着手实践 级别3:读paper,网络Train起来 级别4:Demo跑起来 读一些源码玩玩 熟悉Caffe接口,写Demo这是硬功夫 分析各层Layer输出特征 级别5:何不…

    2023年4月5日
    00
  • 机器学习:利用卷积神经网络实现图像风格迁移 (三)

    前面介绍了利用卷积神经网络实现图像风格迁移的算法原理和基于TensroFlow 的代码实现,这篇博客对前面的代码做了一些改变,设置了一个 image resize 函数,这样可以处理任意size的 input image,而且我们尝试利用 L-BFGS 优化算法替代之前的 Adam 优化算法,对卷积层以及pooling层函数做了修改。 import nump…

    2023年4月8日
    00
  • Unity3D ShaderLab 漫反射卷积光照模型

    http://www.cnblogs.com/2Yous/p/4251444.html   Unity3D ShaderLab 漫反射卷积光照模型 漫反射卷积【Diffuse convolution】是一个模糊立方体的过程,它保留了立方图的整体光照强度,只模糊了细节。 这种效果在我们要活得一个更具全局光照表面效果的时候非常有用。 为了实现这种效果,我们需要创…

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