聚类(K-means)实现手写数字识别-2

2023-05-16

其他实现手写数字识别的方法:
1.KNN实现手写数字识别
2. 卷积神经网络(CNN)实现手写数字识别
3. 全连接神经网络实现手写数字识别
4. 聚类(K-means)实现手写数字识别

  1. 实验数据是老师收集了所有人的手写数字图片,且经过处理将图像生成了.txt文件,如何生成点击这,如下图
    在这里插入图片描述
  2. 代码实现
from __future__ import print_function
import numpy as np
import tensorflow as tf
from tensorflow.contrib.factorization import KMeans
from os import listdir
from keras.utils import to_categorical

"""
函数说明:将32x32的二进制图像转换为1x1024向量
"""
def img2vector(filename):
    # 创建1x1024零向量
    returnVect = np.zeros((1, 1024))
    # 打开文件
    fr = open(filename)
    # 按行读取
    for i in range(32):
        # 读一行数据
        lineStr = fr.readline()
        # 每一行的前32个元素依次添加到returnVect中
        for j in range(32):
            returnVect[0, 32 * i + j] = float(lineStr[j])
    # 返回转换后的1x1024向量
    return returnVect

'''
函数说明:获取标签
'''
def getLabel(Datapath):
    # 训练集的Labels
    hwLabels = []
    # 返回Datapath目录下的文件名
    trainingFileList = listdir(Datapath)
    # 返回文件夹下文件的个数
    m = len(trainingFileList)
    # 从文件名中解析出训练集的类别
    for i in range(m):
        # 获得文件的名字
        fileNameStr = trainingFileList[i]
        # 获得分类的数字
        classNumber = int(fileNameStr.split('_')[0])
        # 将获得的类别添加到hwLabels中
        hwLabels.append(classNumber)
    return hwLabels

'''
函数说明:获取数据
'''
def getData(Datapath):
    # 返回train目录下的文件名
    trainingFileList = listdir(Datapath)
    # 返回文件夹下文件的个数
    m = len(trainingFileList)
    # 初始化训练的Mat矩阵,训练集
    trainingMat = np.zeros((m, 1024))
    for i in range(m):
        # 获得文件的名字
        fileNameStr = trainingFileList[i]
        # 将每一个文件的1x1024数据存储到trainingMat矩阵中
        trainingMat[i, :] = img2vector(Datapath+'/%s' % (fileNameStr))
    return trainingMat

# 加载数据
train_images = getData('train')
test_images = getData('testless')
train_labels = getLabel('train')
train_labels = to_categorical(train_labels)
test_labels = getLabel('testless')
test_labels = to_categorical(test_labels)

full_data_x = train_images

# 参数
num_steps = 1000  # 训练次数
batch_size = 10  # 每一批的样本数
k = 60  # clusters的数量
num_classes = 10  # 10分类
num_features = 1024  # 每张图片是32*32

# 输入图片
X = tf.placeholder(tf.float32, shape=[None, num_features])
# Labels (将标签分配给质心并用于测试)
Y = tf.placeholder(tf.float32, shape=[None, num_classes])

# K-Means 的参数
# inputs:输入张量或输入张量列表。假设数据点先前已被随机置换。
# num_clusters:一个整数张量,指定簇的数量。如果initial_clusters是张量或numpy数组,则忽略此参数。
# distance_metric:用于群集的距离度量。支持的选项:“squared_euclidean”,“cosine”。
# use_mini_batch:如果为true,请使用小批量k-means算法。
# mini_batch_steps_per_iteration:更新的集群中心同步回主副本的步骤数。
kmeans = KMeans(inputs=X, num_clusters=k, distance_metric='cosine',
                use_mini_batch=True)

# 创建 KMeans 模型
training_graph = kmeans.training_graph()

# 返回值
# all_scores: 每个向量到每个簇的距离,是一个[样本数, 簇数]的矩阵
# cluster_idx: 每个样本被分到的簇的标记,为([样本数], type)的元组
# scores: 每个样本到其被分到的簇的距离,为[样本数]大小的矩阵,
# cluster_centers_initialized:返回bool值,cluster是否被初始化(不知道有什么用)
# init_op: 初始化操作,sess init的时候需要传入样本
# training_op: 训练操作

if len(training_graph) > 6:
    (all_scores, cluster_idx, scores, cluster_centers_initialized,
     cluster_centers_var, init_op, train_op) = training_graph
else:
    (all_scores, cluster_idx, scores, cluster_centers_initialized,
     init_op, train_op) = training_graph

cluster_idx = cluster_idx[0]
avg_distance = tf.reduce_mean(scores)  # 用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值

# 初始化变量 (用默认值)
init_vars = tf.global_variables_initializer()


sess = tf.Session()
sess.run(init_vars, feed_dict={X: full_data_x})
sess.run(init_op, feed_dict={X: full_data_x})  # 使用之前 一定要使用数据初始化 KMeans

# 训练
for i in range(1, num_steps + 1):
    _, d, idx = sess.run([train_op, avg_distance, cluster_idx],
                         feed_dict={X: full_data_x})
    if i % 10 == 0 or i == 1:
        print("Step %i, Avg Distance: %f" % (i, d))

# 为每个质心分配标签
# 使用每次训练的标签计算每个质心的标签总数
# 计算样本到最近的质心
counts = np.zeros(shape=(k, num_classes))
# print(len(idx))
for i in range(len(idx)):
    counts[idx[i]] += train_labels[i]
# 将最频繁的标签分配给质心
labels_map = [np.argmax(c) for c in counts]
# print(labels_map)
labels_map = tf.convert_to_tensor(labels_map)  # 将给定值转换为张量

# 评估
#  查找:centroid_id 的标签
cluster_label = tf.nn.embedding_lookup(labels_map, cluster_idx)
# print(cluster_label)
# 计算准确路
# tf.equal(x,y,name=None)
# 判断,x, y 是不是相等,它的判断方法不是整体判断,
# 而是逐个元素进行判断,如果相等就是True,不相等,就是False
# 由于是逐个元素判断,所以x,y 的维度要一致。

# tf.cast():用于改变某个张量的数据类型

# tf.argmax(input,axis)根据axis取值的不同返回每行或者每列最大值的索引。
# axis=0时比较每一列的元素,将每一列最大元素所在的索引记录下来,
# 最后输出每一列最大元素所在的索引数组。
# axis=1的时候,将每一行最大元素所在的索引记录下来,
# 最后返回每一行最大元素所在的索引数组
correct_prediction = tf.equal(cluster_label, tf.cast(tf.argmax(Y, 1), tf.int32))
accuracy_op = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

# 测试模型
test_x, test_y = test_images, test_labels
print("Test Accuracy:", sess.run(accuracy_op, feed_dict={X: test_x, Y: test_y}))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

聚类(K-means)实现手写数字识别-2 的相关文章

随机推荐

  • (1)touchgfx 添加时钟控件

    第一步 xff1a 新建空白模版 添加图片 xff1a 放入 链接 xff1a https pan baidu com s 1NI6LUYrTUs64Z2jZE6AAQQ 提取码 xff1a 2odw 添加控件 xff1a 位置部件属性1T
  • 【基于51】红外寻迹智能小车 - 代码篇

    文章目录 前言一 准备工作二 使用步骤1 模块化编程2 电机模块3 小车动作模块4 PWM 和定时器 中断系统5 寻迹逻辑 总结 前言 关于硬件部分可以看我上次写的帖子https blog csdn net ZER00000001 arti
  • C++关键字override

    一 什么是override override的翻译是覆盖 实际上它在C 43 43 中可以检测哪些虚函数没有被重写并报错 注 xff1a 在派生类的成员函数中使用override时 xff0c 如果基类中无此函数 xff0c 或基类中的函数
  • 邻接矩阵和邻接表

    图的概述和存储结构 xff08 一 xff09 文章目录 前言一 图的概述1 xff09 图的分类2 xff09 图的要素 二 图的存储结构三 邻接矩阵四 邻接表 前言 有一种说法是程序是由数据结构和算法组成的 xff0c 这很能体现出数据
  • 图解迪杰斯特拉(Dijkstra)最短路径算法

    往期文章目录 干货满满 xff01 最小生成树 Prim算法 最小生成树 Kruskal算法 目录 前言 一 最短路径的概念及应用 二 Dijkstra迪杰斯特拉 1 什么是Dijkstra 2 逻辑实现 总结 前言 无论是什么程序都要和数
  • Vscode配置Git+快速入门,一篇学会80%的Git操作

    前言 团队开发中经常会用到Git xff0c 能极大简化开发的流程 xff0c 而个人开发也可以利用Git管理自己的代码 同样作为一个初学者 xff0c 我在学完Git之后写下这篇文章总结个人走过的坑 xff0c 大家一起进步 Git下载和
  • 【C++11】三大神器之——智能指针

    文章目录 前言 一 智能指针的原理1 RAII机制2 简单的实现 二 智能指针的用法1 智能指针的分类2 unique ptr基本语法 3 shared ptr基本语法 4 删除器5 weak ptr 前言 一 智能指针的原理 1 RAII
  • 【C++11】三大神器之——右值、移动语义、完美转发

    前言 如果你还不知道C 43 43 11引入的右值 移动语义 完美转发是什么 xff0c 可以阅读这篇文章 xff1b 如果你已经对这些知识了如指掌 xff0c 也可以看看有什么可以补充 x1f60f 一 右值 值类别vs变量类型 在正式认
  • 【C++11】三大神器之——包装器和绑定器

    前言 如果你还不知道 C 43 43 11 引入的包装器和绑定器是什么 xff0c 可以读读这篇文章 xff0c 看看有什么 启发 xff1b 如果你已经对包装器和绑定器了如指掌 xff0c 也可以读读这篇文章 xff0c 看看有什么 补充
  • 【神经网络和深度学习-开发案例】第四章 神经网络如何对数字进行分类

    神经网络和深度学习 第四章 神经网络如何对数字进行分类 案例 xff1a 使用神经网络识别手写数字 好了 xff0c 让我们来写一个程序 xff0c 学习如何识别手写的数字 xff0c 使用随机梯度下降和MNIST的训练数据 我们将用一个简
  • Win7下安装Ubuntu(双硬盘)的简要步骤

    0 硬件准备 一个至少4G大小的U盘 xff0c 用于刻录Ubuntu系统并安装 1 下载Ubuntu镜像及刻录 Ubuntu镜像 Ubuntu镜像可从官网下载 xff08 外网 xff0c 速度太慢 xff09 xff0c 或使用国内镜像
  • C++ Primer Plus拾遗

    本博文整理了C 43 43 Primer Plus前六章中的部分知识点 xff0c 一般为不常用的小技巧或基础概念性的内容 C与C 43 43 的语言特性 C语言特性 结构化编程 xff08 Structured Programming x
  • 时隔一年,对全国大学生智能车竞赛做段总结(五)

    早期粗糙的赛道元素处理 说这个没有别的意思 xff0c 就是觉得 xff0c 遇到实际应用上的问题 xff0c 虽然脑海里的知识技巧并不能让我们有多高明的手法去解决这个问题 xff0c 但也要努力去尝试 元素判断 这里的元素判断也是粗糙的
  • Windows7 VMware USB Arbitration Service启动失败解决

    转自 http huxiaodan666 blog 163 com blog static 162090542201091014749373 前几日安装了Windows7 xff0c 不过vmware虚拟机安装之后却无法使用usb 软件是官
  • Windows下以太坊公钥加密功能python实现

    文章目录 一 什么是公钥 私钥 地址二 实现过程1 从keystore文件中解出私钥以及私钥 gt 公钥 gt 地址2 利用公钥进行消息加密 解密 一 什么是公钥 私钥 地址 私钥 xff1a 32字节 xff08 256位 xff09 x
  • fatal error: mav_msgs/Actuators.h: 没有那个文件或目录

    编译ros gz包的时候 xff0c ros ign bridge一直报错 xff0c 最开始都已经放弃了 xff0c 但是今天发现不得不跑 xff0c 唉 xff0c 一直报 xff1a fatal error mav msgs Actu
  • stalled和Initial connection偶尔请求时间长

    Queueing 请求排队的时间 关于这个 xff0c 需要知道一个背景 xff0c 就是浏览器与同一个域名建立的TCP连接数是有限制的 xff0c chrome设置的6个 xff0c 如果说同一时间 xff0c 发起的同一域名的请求超过了
  • 自制stm32F103c6t6出现No target connected或者Internal command error的原因猜测和解决方法

    刚刚焊好的最小系统板 xff0c 在使用ST LINK下载程序的时候 xff0c 发现没有啥问题 xff0c 之后再下载的时候便出现了这样的问题 xff0c 怀疑是单片机供电出现了问题 xff0c 但是每个脚都供好了电 xff0c 网上说可
  • QEMU来创建一个,[教程在这]。

    RASPBERRY PI ON QEMU Let s start setting up a Lab VM We will use Ubuntu and emulate our desired ARM versions inside of i
  • 聚类(K-means)实现手写数字识别-2

    其他实现手写数字识别的方法 xff1a 1 KNN实现手写数字识别 2 卷积神经网络 xff08 CNN xff09 实现手写数字识别 3 全连接神经网络实现手写数字识别 4 聚类 xff08 K means xff09 实现手写数字识别