首页 > 其他分享 >矩阵向量点积、Batch(批)理解、one-hot编码

矩阵向量点积、Batch(批)理解、one-hot编码

时间:2024-07-18 14:44:17浏览次数:10  
标签:训练 点积 样本 矩阵 hot Batch assert shape 512

矩阵向量点积

output = relu(dot(W, input) + b)

image-20240717205906102

input的每个元素为三维的特征向量的特征,

W矩阵:

  • 行:存储节点权重数组
  • 列数表示节点数量

所以result[1]result[0]运算互不干扰,能够并行加速

上述数学角度运算代码如下:

def naive_matrix_vector_dot(x, y):
    assert len(x.shape) == 2  # (x为W矩阵,x.shape=(2,3), len(x.shape)=2)
    assert len(y.shape) == 1 # (y为input向量)
    assert x.shape[1] == y.shape[0]
    z = np.zeros(x.shape[0])
    for i in range(x.shape[0]):
        for j in range(x.shape[1]):
            z[i] += x[i, j] * y[j]
    return z

两个矩阵点积(矩阵乘法)

def naive_matrix_dot(x, y):
    assert len(x.shape) == 2
    assert len(y.shape) == 2
    assert x.shape[1] == y.shape[0]

    z = np.zeros((x.shape[0], y.shape[1]))
    for i in range(x.shape[0]):
        for j in range(y.shape[1]):
            row_x = x[i, :]
            column_y = y[:, j]
            z[i, j] = naive_vector_dot(row_x, column_y)
    return z

# naive_vector_dot, 两个向量对应位置相乘再相加
def naive_vector_dot(x, y):
    assert len(x.shape) == 1
    assert len(y.shape) == 1
    assert x.shape[0] == y.shape[0]
    z = 0.
    for i in range(x.shape[0]):
        z += x[i] * y[i]
    return z

image-20240717222650280

随机梯度下降(SGD)

随机是每批小批量数据选取是随机的,但是梯度下降

image-20240717224318781

Batch(批)——每个批、epoch的理解

model.add(layers.Dense(16, activation='relu', input_shape=(1000,))) # 每个样本大小为1000的词向量

每个样本如下(每个样本大小为1000的词向量):

image-20240718104055141

history = model.fit(partial_x_train,
                    partial_y_train,
                    epochs=20, # 20轮次
                    batch_size=512, # batch size为512
                    validation_data=(x_val, y_val))
  • epochs=20:这里的“epochs”指的是训练周期。在每个 epoch 中,模型将对整个训练数据集进行一次完整的前向和反向传播。换句话说,每个 epoch 都会遍历整个训练数据集。因此,当设置 epochs=20 时,意味着模型将对训练数据集进行 20 次完整的前向和反向传播。在每个 epoch 结束时,模型会计算训练数据集上的损失值和准确率等指标。

  • batch_size=512:这里的“batch_size”指的是每次迭代时使用的样本数量。在训练神经网络时,通常不会对整个训练数据集进行单次前向和反向传播(这称为批量梯度下降,Batch Gradient Descent),因为这可能会非常耗时。相反,我们会将训练数据集分成许多较小的批次(称为 mini-batches),并在每个批次上执行一次前向和反向传播。batch_size=512 表示每次迭代时从训练数据集中随机抽取 512 个样本进行训练。在每个批次的训练完成后,模型会更新权重以最小化损失函数。然后,在下一次迭代时,模型会从剩余的数据中抽取另一个 512 个样本的批次进行训练,直到整个训练数据集都被遍历一遍,完成一个 epoch。

    (总结:每个批次取512个,直到取完完成一轮epoch)

疑问点:每个batch会同时处理这 512 个样本,对这 512 个样本执行前向传播。这是为什么呢?

在每次迭代过程中,神经网络会同时接收一个包含 512 个样本的批次。这些样本会被组织成一个形状为 (512, 1000) 的二维数组。

image-20240718105903398

  • 右图:之前理解的单个词向量竖向排列,权重矩阵为(1000,16)——>输出(1,16)

  • 左图:【每一行】都是【右图的一个词向量】,权重矩阵进行【并行运算】后——>输出(512,16)

并行计算:在神经网络的训练过程中,矩阵乘法操作可以并行化。这意味着我们可以将这个操作分解为许多独立的子任务,这些子任务可以在不同的 CPU 核心或 GPU 核心上同时执行。例如,在上面的例子中,我们可以将权重矩阵与 512 个样本的词向量的矩阵乘法操作分解为 512 个独立的子任务。每个子任务都涉及一个样本的词向量与权重矩阵相乘。通过将这些子任务分配给多个 CPU 核心或 GPU 核心,我们可以同时执行它们,从而大大加速训练过程。

Keras 和底层实现:Keras 是一个高级深度学习库,它抽象了底层计算的细节。当您在 Keras 中定义模型结构并调用 fit() 方法进行训练时,Keras 会自动处理并行计算的细节。对于 CPU 训练,Keras 会使用 NumPy 库执行矩阵运算,NumPy 会自动利用多个 CPU 核心进行并行计算。对于 GPU 训练,Keras 可以与底层深度学习库(如 TensorFlow、Theano 或 CNTK)集成,这些库专门针对 GPU 进行了优化,以实现更高效的并行计算。

one-hot编码

假设总共有1000个不同的单词,其中每个sequence单词个数不定。

python方法实现:

def vectorize_sequences(sequences, dimension=10000):
    results = np.zeros((len(sequences), dimension))
    for i, sequence in enumerate(sequences):
        results[i, sequence] = 1.
    return results

# Our vectorized training data
x_train = vectorize_sequences(train_data)

使用keras.utils.np_utilskeras

from tensorflow.python.keras.utils.np_utils import to_categorical

one_hot_train_labels = to_categorical(train_labels)

标签:训练,点积,样本,矩阵,hot,Batch,assert,shape,512
From: https://www.cnblogs.com/sherioc/p/18309463

相关文章

  • 【YashanDB知识库】存储过程报错snapshot too old
    问题描述20231127上午客户反馈绩效系统20231125、20231126出现2次YAS-02020snapshottooold的问题,测试也有类似问题。该过程是客户新增的存储过程,目的是通过PRO_RUN_JOB作为主控,调度其他存储过程,后续不用其他调度引擎。原因分析错误信息收集分析分析存储过程报错日志,核查UN......
  • [1033] Run the batch file of the PyQt GUI, but don't show the CMD
    IbuiltaGUIlayoutusingPyQt,andIrunthePythonfilewitha.batfile.However,thismethodinitiallydisplaystheCMDwindowbeforeshowingtheprogram'smainwindow,whichlooksabitodd.TopreventorminimizetheCMDwindowfromappearing,......
  • prompt第四讲-fewshot
    文章目录前提回顾FewShotPromptTemplateforamt格式化前提回顾前面已经实现了一个翻译助手了[prompt第三讲-PromptTemplate],prompt模板设计中,有说明、案例、和实际的问题#-*-coding:utf-8-*-"""@Time:2024/7/89:44@Auth:leon"""fromlangchain_core.pro......
  • [深入理解Java虚拟机]HotSpot虚拟机对象
    对象的创建Java是一门面向对象的编程语言,Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象通常(例外:复制、反序列化)仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建又是怎样一个过程呢?当Java虚拟机遇......
  • 使用ScaleBar调整CAD设计的尺寸-devDept EyeShot 2024.2
    使用新的ScaleBar调整CAD设计的尺寸2024年7月10日devDeptSoftware的EyeShot2024.2提供了一个屏幕标尺,用于实时尺寸估算,从而消除了初始设计阶段的猜测。devDeptSoftware的Eyeshot可让您将强大的CAD功能集成到.NET应用程序中。......
  • 易优cms网站hotwords功能:获取网站搜索的热门关键字-Eyoucms
    【基础用法】名称:hotwords功能:获取网站搜索的热门关键字语法:{eyou:hotwordsnum='6'subday='365'maxlength='20'id='field'}  <ahref='{$field.url}'target="_blank">{$field.word}</a><br/>{/eyou:hotwords......
  • AutoHotKey自动热键(五)添加WINDOWS秘笈指令-输入瞬间启动功能
    在AUTOHOTKEY的使用中,不仅仅可以监听组合热键,还可以监听正常文本击键录入,这是另一种监听方式,比如依次击键jsq之后直接弹出<计算器>工具,或者依次击键sj之后直接输出135****5564的手机号码,等等,这就是autohotkey的录入击键监听,以双冒号为开头::因这种录入监听像极了......
  • FewShot Learning
    Few-ShotLearning1.背景介绍1.1问题的由来在机器学习领域,面对新任务时通常需要大量的训练数据来构建有效的模型。然而,在现实世界中,获取大量数据往往具有成本高、耗时久或受制于数据收集限制的问题。这导致了对于“少样本学习”(Few-shotlearning)的需求,即在有限数据的......
  • 【完结】LeetCode 热题 HOT 100分类+题解+代码详尽指南
    目录LeetCode热题100前言LeetcodeTop100题目和答案-哈希LeetcodeTop100题目和答案-双指针篇LeetcodeTop100题目和答案-滑动窗口篇LeetcodeTop100题目和答案-子串篇LeetcodeTop100题目和答案-普通数组篇LeetcodeTop100题目和答案-矩阵篇LeetcodeTop100题目和......
  • GOLLIE : ANNOTATION GUIDELINES IMPROVE ZERO-SHOT INFORMATION-EXTRACTION
    文章目录题目摘要引言方法实验消融题目Gollie:注释指南改进零样本信息提取论文地址:https://arxiv.org/abs/2310.03668摘要    大型语言模型(LLM)与指令调优相结合,在泛化到未见过的任务时取得了重大进展。然而,它们在信息提取(IE)方面不太成功,落后于特定任......