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日

相关文章

  • UFLDL深度学习笔记 (六)卷积神经网络

    1. 主要思路 “UFLDL 卷积神经网络”主要讲解了对大尺寸图像应用前面所讨论神经网络学习的方法,其中的变化有两条,第一,对大尺寸图像的每个小的patch矩阵应用相同的权值来计算隐藏层特征,称为卷积特征提取;第二,对计算出来的特征矩阵做“减法”,把特征矩阵纵横等分为多个区域,取每个区域的平均值(或最大值)作为输出特征,称为池化。这样做的原因主要是为了降低数…

    2023年4月8日
    00
  • TensorFlow人工智能学习按索引取数据及维度变换详解

    TensorFlow人工智能学习按索引取数据及维度变换详解 在TensorFlow中,我们经常需要按照索引来操作数据以及对数据的维度进行变换。本文将详细讲解如何使用TensorFlow对数据进行索引和维度变换操作。 按索引取数据 对于一个张量tensor,我们可以使用tf.gather(tensor, indices)函数来按索引获取张量中的数据。 其中,t…

    卷积神经网络 2023年5月15日
    00
  • 什么是卷积?

    以离散信号为例,连续信号同理。  已知 x[0] = a, x[1] = b, x[2]=c   已知 y[0] = i, y[1] = j, y[2]=k     下面通过演示求 x[n] * y[n]的过程,揭示卷积的物理意义。  第一步,x[n]乘以 y[0]并平移到位置 0:  第二步,x[n]乘以 y[1]并平移到位置 1:  第三步,x[n]乘以…

    2023年4月8日
    00
  • Kaggle系列1:手把手教你用tensorflow建立卷积神经网络实现猫狗图像分类

    去年研一的时候想做kaggle上的一道题目:猫狗分类,但是苦于对卷积神经网络一直没有很好的认识,现在把这篇文章的内容补上去。(部分代码参考网上的,我改变了卷积神经网络的网络结构,其实主要部分我加了一层1X1的卷积层,至于作用,我会在后文详细介绍) 题目地址:猫狗大战 同时数据集也可以在上面下载到。 既然是手把手,那么就要从前期的导入数据开始: 导入数据 #i…

    2023年4月6日
    00
  • 「笔记」多项式任意长度循环卷积

    我们知道\(FFT\)是一个循环卷积。本质上的离散傅里叶变换满足的是这个性质: \[c_k=\sum\limits_{i,j}[i+j=k(mod\ n)]a_ib_j \] 但是由于我们做的长度足够大(\(n\)足够大)所以这种循环卷积卷不回去。这导致我们只能做特定长度的\(FFT,n=2^w\)如果我们需要做任意长度循环卷积呢? 其实稍微推推式子就可以了…

    卷积神经网络 2023年4月7日
    00
  • 深度学习面试题24:在每个深度上分别卷积(depthwise卷积)

      举例   单个张量与多个卷积核在深度上分别卷积   参考资料   举例 如下张量x和卷积核K进行depthwise_conv2d卷积   结果为: depthwise_conv2d和conv2d的不同之处在于conv2d在每一深度上卷积,然后求和,depthwise_conv2d没有求和这一步,对应代码为: import tensorflow as tf…

    2023年4月7日
    00
  • 卷积,reLu,池化的意义

    1.卷积 提取局部特征 2.Relu 留下相关特征,去掉不相关特征,卷积之后的正值越大,说明与卷积核相关性越强,负值越大,不相关性越大。 3.池化 池化的目的: (1)留下最相关的特征,或者说留下最明显的特征。 (2)增大感受野,所谓感受野,即一个像素对应回原图的区域大小,假如没有pooling,一个3*3,步长为1的卷积,那么输出的一个像素的感受野就是3*…

    卷积神经网络 2023年4月8日
    00
  • 机器学习—卷积的概念

     参看大神的微博:http://blog.csdn.net/liyaohhh/article/details/50363184 和 http://blog.csdn.net/zouxy09/article/details/49080029             线性滤波可以说是图像处理最基本的方法,它可以允许我们对图像进行处理,产生很多不同的效果。做法很简…

    2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部