机器学习之分类

这篇具有很好参考价值的文章主要介绍了机器学习之分类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

分类任务和回归任务的不同之处在于,分类任务需要做出离散的预测。对于多分类任务的神经网络模型,其输出目标通常会用one-hot编码来表示,在输出层中使用softmax函数,同时使用分类交叉熵损失函数进行训练。在本博客中,我们将使用TensorFlow的底层API实现一个基于全连接层的神经网络来进行MNIST数字图像分类。下面是涉及到的相关概念:

深度学习是一种机器学习方法,它通过多层神经网络层次化地提取特征,以解决各种复杂的分类和回归问题。

神经网络是深度学习的基本组成部分,由多个层次化的神经元组成。输入层接受数据,中间的隐藏层通过权重和激活函数处理数据,最终输出层产生分类结果。在这个示例中,我们将手动实现神经网络的核心组件。

前向传播是神经网络中的信息传递过程,从输入层到输出层,每一层的神经元根据权重和激活函数计算输出。这个过程将输入数据映射到预测输出。

反向传播是训练神经网络的关键步骤,它通过计算预测与真实标签之间的误差,并将误差反向传播到网络中的每一层来更新权重,以最小化误差。

内容大纲

  1. 神经网络核心组件的实现
  2. 数据加载处理
  3. 构建训练模型
  4. 总结

神经网络核心组件的实现

以下代码分别实现了密集层DenseLayer,网络模型SequentialModel,批次生成器BatchGenerator,批次权重更新one_training_step 以及 训练函数fit

from keras.datasets import mnist
import math
import tensorflow as tf
import numpy as np

class DenseLayer:  # 简单的Dense类
    def __init__(self, input_size, output_size, activation):
        self.activation = activation

        w_shape = (input_size, output_size)  # 创建一个形状为(input_size, output_size)的矩阵W,并将其随机初始化
        w_initial_value = tf.random.uniform(w_shape, minval=0, maxval=1e-1)
        self.W = tf.Variable(w_initial_value)

        b_shape = (output_size,)  # 创建一个形状为(output_size,)的零向量b
        b_initial_value = tf.zeros(b_shape)
        self.b = tf.Variable(b_initial_value)

    def __call__(self, inputs):  # 前向传播
        return self.activation(tf.matmul(inputs, self.W) + self.b)

    @property
    def weights(self):  # 获取该层权重
        return [self.W, self.b]


class SequentialModel:  # 简单的Sequential类
    def __init__(self, layers):
        self.layers = layers

    def __call__(self, inputs):
        x = inputs
        for layer in self.layers:
            x = layer(x)
        return x

    @property
    def weights(self):
        weights = []
        for layer in self.layers:
            weights += layer.weights
        return weights



class BatchGenerator:  # 批量生成器
    def __init__(self, images, labels, batch_size=128):
        assert len(images) == len(labels)
        self.index = 0
        self.images = images
        self.labels = labels
        self.batch_size = batch_size
        self.num_batches = math.ceil(len(images) / batch_size)

    def next(self):
        images = self.images[self.index: self.index + self.batch_size]
        labels = self.labels[self.index: self.index + self.batch_size]
        self.index += self.batch_size
        return images, labels


# 更新参数
learning_rate = 1e-3 # 学习率
def update_weights(gradients, weights):
    for g, w in zip(gradients, weights):
        w.assign_sub(g * learning_rate)  # assign_sub相当于TensorFlow变量的-=

# 计算梯度,并更新权重
def one_training_step(model, images_batch, labels_batch):
    with tf.GradientTape() as tape:  # 运行前向传播,即在GradientTape作用域内计算模型预测值
        predictions = model(images_batch)
        # 标签编码为整数,使用sparse_categorical_crossentropy损失函数
        per_sample_losses = tf.keras.losses.sparse_categorical_crossentropy(labels_batch, predictions)
        average_loss = tf.reduce_mean(per_sample_losses)
    gradients = tape.gradient(average_loss, model.weights)  # 计算损失相对于权重的梯度。输出gradients是一个列表,每个元素对应model.weights列表中的权重
    update_weights(gradients, model.weights)  # 利用梯度来更新权重
    return average_loss


# 完整的训练循环
def fit(model, images, labels, epochs, batch_size=128):
    for epoch_counter in range(epochs):
        print(f"Epoch {epoch_counter}")
        batch_generator = BatchGenerator(images, labels)
        for batch_counter in range(batch_generator.num_batches):
            images_batch, labels_batch = batch_generator.next()
            loss = one_training_step(model, images_batch, labels_batch)
            if batch_counter % 100 == 0:
                print(f"loss at batch {batch_counter}: {loss:.2f}")

数据加载处理

首先,我们需要准备数据。MNIST数据集包含手写数字图像,每个图像是28x28像素的灰度图像,总共有10个类别(0到9)。

# 加载MNIST数据集
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

# 归一化像素值到0到1之间
train_images = train_images.reshape((60000, 28 * 28)).astype("float32") / 255
test_images = test_images.reshape((10000, 28 * 28)).astype("float32") / 255

构建训练模型

接下来,我们将使用DenseLayerSequentialModel 类构建一个两层的全连接神经网络模型。

# 利用这个DenseLayer类和SequentialModel类,创建一个与Keras类似的模型
model = SequentialModel([
    DenseLayer(input_size=28 * 28, output_size=512, activation=tf.nn.relu),# 全连接层,512个单元,ReLU激活函数
    DenseLayer(input_size=512, output_size=10, activation=tf.nn.softmax) # 输出层,10个输出单元对应0-9的数字,使用softmax激活函数
])

现在,我们将使用手动实现的神经网络模型来进行训练。

# 开始训练
fit(model, train_images, train_labels, epochs=10, batch_size=128)

# 预测结果准确率
predictions = model(test_images).numpy()
predicted_labels = np.argmax(predictions, axis=1)
matches = predicted_labels == test_labels
print(f"accuracy: {matches.mean():.2f}")

总结

在本博客中,我们使用TensorFlow的底层API手动实现了一个基于全连接层的神经网络模型,并将其应用于MNIST数字图像分类。我们涵盖了深度学习分类的基本原理,包括神经网络、前向传播和反向传播。通过适当的数据处理、模型构建、训练和预测,我们成功地分类了手写数字图像,这是深度学习在计算机视觉中的一个典型应用。希望本文能帮助你了解深度学习分类的基本流程和实现细节。通过底层API的实现,你可以更深入地理解深度学习模型的内部工作原理。文章来源地址https://www.toymoban.com/news/detail-700506.html

到了这里,关于机器学习之分类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spark-机器学习(4)回归学习之逻辑回归

    在之前的文章中,我们来学习我们回归中的线性回归,了解了它的算法,知道了它的用法,并带来了简单案例。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-机器学习(3)回归学习之线性

    2024年04月25日
    浏览(72)
  • 机器学习之逻辑回归模型

            逻辑回归(Logistic Regression, LR)又称为逻辑回归分析,是一种机器学习算法,属于分类和预测算法中的一种,主要用于解决二分类问题。逻辑回归通过历史数据的表现对未来结果发生的概率进行预测。例如,我们可以将购买的概率设置为因变量,将用户的特征属性,

    2024年02月09日
    浏览(49)
  • 机器学习之回归

    回归是机器学习中最常见的任务之一,回归(regression)问题预测的是一个连续值,而不是离散标签,比如根据气象数据预测明日气温,或者根据房地产数据估算房价(标量回归问题)。 接下来就以回归问题最经典的波士顿房价为例,了解标量回归问题的基本配置。当然主要

    2024年02月16日
    浏览(31)
  • 机器学习之逻辑回归

    1.1 监督学习 1.1.1 回归(线性回归) 1.1.1.1 描述 线性回归模型公式: 多元线性关系:一个通过特征的的线性组合来进行预测的函数 其中,h(x)是因变量,x1、x2、…、xn是自变量,o1、o2、…、bn是回归系数。回归系数表示自变量对因变量的影响程度,可以通过最小二乘法来求解

    2023年04月13日
    浏览(41)
  • Python | 机器学习之逻辑回归

    🌈个人主页: Sarapines Programmer 🔥 系列专栏:《人工智能奇遇记》 🔖墨香寄清辞:诗馀墨痕深,梦漫星辰寂。 曲径通幽意犹在,剑指苍穹气势立。 目录结构 1. 机器学习之逻辑回归概念 1.1 机器学习 1.2 逻辑回归 2. 逻辑回归 2.1 实验目的 2.2 实验准备 2.3 实验题目 2.4 实验内容

    2024年02月05日
    浏览(48)
  • 机器学习之常用的回归预测模型

    本文全面整理了各种回归预测模型,旨在帮助读者更好地学习回归预测模型。 转载自:https://mp.weixin.qq.com/s/7m2waIASOEg90NONgRpQFQ 线性回归是一种线性模型,通过特征的线性组合来预测连续值标签。线性回归通过拟合系数 (可选择是否设置截距)的线性模型,以最小化真实值和预

    2024年04月08日
    浏览(42)
  • Pytorch代码入门学习之分类任务(二):定义数据集

           (1)数据集介绍:         CIFAR10数据集共60000个样本,其中有50000个训练样本和10000个测试样本。每个样本都是一张32*32像素的 RGB图像 (彩色图像),每个图像分为3个通道(R通道、G通道与B通道)。          CIFAR10数据集用来进行监督学习训练,每个样本包含一个

    2024年02月08日
    浏览(35)
  • Pytorch代码入门学习之分类任务(三):定义损失函数与优化器

    目录 一、定义损失函数 1.1 代码 1.2 损失函数简介 1.3 交叉熵误差(cross entropy error) 二、定义优化器 2.1 代码 2.2 构造优化器 2.3 随机梯度下降法(SGD)         神经网络的学习通过某个指标表示目前的状态,然后以这个指标为基准,寻找最优的权重参数。神经网络以某个指标

    2024年02月07日
    浏览(45)
  • 机器学习之分类

    分类任务和回归任务的不同之处在于,分类任务需要做出离散的预测。对于多分类任务的神经网络模型,其输出目标通常会用 one-hot 编码来表示,在输出层中使用 softmax 函数,同时使用分类交叉熵损失函数进行训练。在本博客中,我们将使用 TensorFlow 的底层API实现一个基于全

    2024年02月09日
    浏览(32)
  • 机器学习之支持向量回归(SVR)预测房价—基于python

          大家好,我是带我去滑雪!       本期使用爬取到的有关房价数据集data.csv,使用支持向量回归(SVR)方法预测房价。该数据集中“y1”为响应变量,为房屋总价,而x1-x9为特征变量,依次表示房屋的卧室数量、客厅数量、面积、装修情况、有无电梯、、房屋所在楼层位

    2024年02月04日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包