当前位置: 首页 > news >正文

Transformer模型:WordEmbedding实现

前言

        最近在学Transformer,学了理论的部分之后就开始学代码的实现,这里是跟着b站的up主的视频记的笔记,视频链接:19、Transformer模型Encoder原理精讲及其PyTorch逐行实现_哔哩哔哩_bilibili


正文

        首先导入所需要的包:

import torch
import numpy as np
import torch.nn as nn
import torch.nn.functional as F

         关于Word Embedding,这里以序列建模为例,考虑source sentence、target sentence,构建序列,序列的字符以其在词表中的索引的形式表示。

        首先使用定义batch_size的大小,并且使用torch.randint()函数随机生成序列长度,这里的src是生成原本的序列,tgt是生成目标的序列。

        以机器翻译实现英文翻译为中文来说,src就是英文句子,tgt就是中文句子,这也就是规定了要翻译的英文句子的长度和翻译出来的句子长度。(举个例子而已,不用纠结为什么翻译要限制句子的长度)

batch_size = 2src_len=torch.randint(2,5,(batch_size,))
tgt_len=torch.randint(2,5,(batch_size,))

        将生成的src_len、tgt_len输出:

tensor([2, 3])    生成的原序列第一个句子长度为2,第二个句子长度为3
tensor([4, 4])    生成的目标序列第一个句子长度为4,第二个句子长度为4

        因为随机生成的,所以每次运行都会有新的结果,也就是生成的src和tgt两个序列,其子句的长度每次都是随机的,这里改成生成固定长度的序列:

src_len = torch.Tensor([11, 9]).to(torch.int32)
tgt_len = torch.Tensor([10, 11]).to(torch.int32)

         将生成的src_len、tgt_len输出,此时就固定好了序列长度了:

tensor([11,  9], dtype=torch.int32)
tensor([10, 11], dtype=torch.int32)

        接着是要实现单词索引构成的句子,首先定义单词表的大小和序列的最大长度。

# 单词表大小
max_num_src_words = 10
max_num_tgt_words = 10# 序列的最大长度
max_src_seg_len = 12
max_tgt_seg_len = 12

         以生成原序列为例,使用torch.randint()生成第一个句子和第二个句子,然后放到列表中:

src_seq = [torch.randint(1, max_num_src_words, (L,)) for L in src_len]
[tensor([5, 3, 7, 5, 6, 3, 4, 3]), tensor([1, 6, 3, 1, 1, 7, 4])]

         可以发现生成的两个序列长度不一样(因为我们自己定义的时候就是不一样的),在这里需要使用F.pad()函数进行padding保证序列长度一致:

src_seq = [F.pad(torch.randint(1, max_num_src_words, (L,)), (0, max_src_seg_len-L)) for L in src_len]
[tensor([8, 5, 2, 4, 6, 8, 1, 4, 0, 0, 0, 0]), tensor([5, 5, 5, 3, 7, 9, 3, 0, 0, 0, 0, 0])]

         此时已经填充为同样的长度了,但是不同的句子各为一个张量,需要使用torch.cat()函数把不同句子的tensor转化为二维的tensor,在此之前需要先把每个张量变成二维的,使用torch.unsqueeze()函数:

src_seq = torch.cat([torch.unsqueeze(F.pad(torch.randint(1, max_num_src_words, (L,)),(0, max_src_seg_len-L)), 0) for L in src_len])
tensor([[9, 7, 7, 4, 7, 3, 9, 4, 7, 8, 8, 0],[1, 1, 5, 9, 5, 6, 2, 7, 4, 0, 0, 0]])
tensor([[3, 3, 2, 8, 3, 4, 1, 2, 9, 4, 0, 0],[1, 6, 3, 8, 5, 1, 5, 5, 1, 5, 3, 0]])

         这里把tgt的也补充了,得到的就是src和tgt的内容各自在一个二维张量里(batch_size,max_seg_len),batch_size也就是句子数,max_seg_len也就是句子的单词数(分为src的长度跟tgt两种)。

        补充:可以看到上面三次运行出来的结果都不一样,因为三次运行的时候,每次都是随机生成,所以结果肯定不一样,第三次为什么有两个二维的tensor是因为第三次把tgt的部分也补上去了,所以就有两个二维的tensor。

        接下来就是构造embedding了,这里nn.Embedding()传入了两个参数,第一个是embedding的长度,也就是单词个数+1,+1的原因是因为有个0是作为填充的,第二个参数就是embedding的维度,也就是一个单词会被映射为多少维度的向量。

        然后调用forward,得到我们的src和tgt的embedding

src_embedding_table = nn.Embedding(max_num_src_words+1, model_dim)
tgt_embedding_table = nn.Embedding(max_num_tgt_words+1, model_dim)
src_embedding = src_embedding_table(src_seq)   
tgt_embedding = tgt_embedding_table(tgt_seq)
print(src_embedding_table.weight)    # 每一行代表一个embedding向量,第0行让给pad,从第1行到第行分配给各个单词,单词的索引是多少就取对应的行位置的向量
print(src_embedding)    # 根据src_seq,从src_embedding_table获取得到的embedding vector,三维张量:batch_size、max_seq_len、model_dim
print(tgt_embedding)

        此时src_embedding_table.weight的输出内容如下,第一行为填充(0)的向量:

tensor([[-0.3412,  1.5198, -1.7252,  0.6905, -0.3832, -0.8586, -2.0788,  0.3269],
        [-0.5613,  0.3953,  1.6818, -2.0385,  1.1072,  0.2145, -0.9349, -0.7091],
        [ 1.5881, -0.2389, -0.0347,  0.3808,  0.5261,  0.7253,  0.8557, -1.0020],
        [-0.2725,  1.3238, -0.4087,  1.0758,  0.5321, -0.3466, -0.9051, -0.8938],
        [-1.5393,  0.4966, -1.4887,  0.2795, -1.6751, -0.8635, -0.4689, -0.0827],
        [ 0.6798,  0.1168, -0.5410,  0.5363, -0.0503,  0.4518, -0.3134, -0.6160],
        [-1.1223,  0.3817, -0.6903,  0.0479, -0.6894,  0.7666,  0.9695, -1.0962],
        [ 0.9608,  0.0764,  0.0914,  1.1949, -1.3853,  1.1089, -0.9282, -0.9793],
        [-0.9118, -1.4221, -2.4675, -0.1321,  0.7458, -0.8015,  0.5114, -0.5023],
        [-1.7504,  0.0824,  2.2088, -0.4486,  0.7324,  1.8790,  1.7644,  1.2731],
        [-0.3791,  1.9915, -1.0117,  0.8238, -2.1784, -1.2824, -0.4275,  0.3202]],
       requires_grad=True)

        src_embedding的输出结果如下所示,往前看src_seq的第一个句子前三个为9  7  7,往前看第9+1行与第7+1行的向量,就是现在输出的前3个向量:

tensor([[[-1.7504,  0.0824,  2.2088, -0.4486,  0.7324,  1.8790,  1.7644, 1.2731],[ 0.9608,  0.0764,  0.0914,  1.1949, -1.3853,  1.1089, -0.9282, -0.9793],[ 0.9608,  0.0764,  0.0914,  1.1949, -1.3853,  1.1089, -0.9282, -0.9793],[-1.5393,  0.4966, -1.4887,  0.2795, -1.6751, -0.8635, -0.4689, -0.0827],[ 0.9608,  0.0764,  0.0914,  1.1949, -1.3853,  1.1089, -0.9282, -0.9793],[-0.2725,  1.3238, -0.4087,  1.0758,  0.5321, -0.3466, -0.9051, -0.8938],[-1.7504,  0.0824,  2.2088, -0.4486,  0.7324,  1.8790,  1.7644, 1.2731],[-1.5393,  0.4966, -1.4887,  0.2795, -1.6751, -0.8635, -0.4689, -0.0827],[ 0.9608,  0.0764,  0.0914,  1.1949, -1.3853,  1.1089, -0.9282, -0.9793],[-0.9118, -1.4221, -2.4675, -0.1321,  0.7458, -0.8015,  0.5114, -0.5023],[-0.9118, -1.4221, -2.4675, -0.1321,  0.7458, -0.8015,  0.5114, -0.5023],[-0.3412,  1.5198, -1.7252,  0.6905, -0.3832, -0.8586, -2.0788, 0.3269]],[[-0.5613,  0.3953,  1.6818, -2.0385,  1.1072,  0.2145, -0.9349, -0.7091],[-0.5613,  0.3953,  1.6818, -2.0385,  1.1072,  0.2145, -0.9349, -0.7091],[ 0.6798,  0.1168, -0.5410,  0.5363, -0.0503,  0.4518, -0.3134, -0.6160],[-1.7504,  0.0824,  2.2088, -0.4486,  0.7324,  1.8790,  1.7644, 1.2731],[ 0.6798,  0.1168, -0.5410,  0.5363, -0.0503,  0.4518, -0.3134, -0.6160],[-1.1223,  0.3817, -0.6903,  0.0479, -0.6894,  0.7666,  0.9695, -1.0962],[ 1.5881, -0.2389, -0.0347,  0.3808,  0.5261,  0.7253,  0.8557, -1.0020],[ 0.9608,  0.0764,  0.0914,  1.1949, -1.3853,  1.1089, -0.9282, -0.9793],[-1.5393,  0.4966, -1.4887,  0.2795, -1.6751, -0.8635, -0.4689, -0.0827],[-0.3412,  1.5198, -1.7252,  0.6905, -0.3832, -0.8586, -2.0788, 0.3269],[-0.3412,  1.5198, -1.7252,  0.6905, -0.3832, -0.8586, -2.0788, 0.3269],[-0.3412,  1.5198, -1.7252,  0.6905, -0.3832, -0.8586, -2.0788, 0.3269]]], grad_fn=<EmbeddingBackward>)

         同理tgt_embedding的输出结果如下所示:

tensor([[[-1.3681, -0.1619, -0.3676,  0.4312, -1.3842, -0.6180,  0.3685, 1.6281],[-1.3681, -0.1619, -0.3676,  0.4312, -1.3842, -0.6180,  0.3685, 1.6281],[-2.6519, -0.8566,  1.2268,  2.6479, -0.2011, -0.1394, -0.2449, 1.0309],[-0.8919,  0.5235, -3.1833,  0.9388, -0.6213, -0.5146,  0.7913, 0.5126],[-1.3681, -0.1619, -0.3676,  0.4312, -1.3842, -0.6180,  0.3685, 1.6281],[-0.4984,  0.2948, -0.2804, -1.1943, -0.4495,  0.3793, -0.1562, -1.0122],[ 0.8976,  0.5226,  0.0286,  0.1434, -0.2600, -0.7661,  0.1225, -0.7869],[-2.6519, -0.8566,  1.2268,  2.6479, -0.2011, -0.1394, -0.2449, 1.0309],[ 2.2026,  1.8504, -0.6285, -0.0996, -0.0994, -0.0828,  0.6004, -0.3173],[-0.4984,  0.2948, -0.2804, -1.1943, -0.4495,  0.3793, -0.1562, -1.0122],[ 0.3637,  0.4256,  0.7674,  1.4321, -0.1164, -0.6032, -0.8182, -0.6119],[ 0.3637,  0.4256,  0.7674,  1.4321, -0.1164, -0.6032, -0.8182, -0.6119]],[[ 0.8976,  0.5226,  0.0286,  0.1434, -0.2600, -0.7661,  0.1225, -0.7869],[-1.0356,  0.8212,  1.0538,  0.4510,  0.2734,  0.3254,  0.4503, 0.1694],[-1.3681, -0.1619, -0.3676,  0.4312, -1.3842, -0.6180,  0.3685, 1.6281],[-0.8919,  0.5235, -3.1833,  0.9388, -0.6213, -0.5146,  0.7913, 0.5126],[-0.4783, -1.5936,  0.5033,  0.3483, -1.3354,  1.4553, -1.1344, -1.9280],[ 0.8976,  0.5226,  0.0286,  0.1434, -0.2600, -0.7661,  0.1225, -0.7869],[-0.4783, -1.5936,  0.5033,  0.3483, -1.3354,  1.4553, -1.1344, -1.9280],[-0.4783, -1.5936,  0.5033,  0.3483, -1.3354,  1.4553, -1.1344, -1.9280],[ 0.8976,  0.5226,  0.0286,  0.1434, -0.2600, -0.7661,  0.1225, -0.7869],[-0.4783, -1.5936,  0.5033,  0.3483, -1.3354,  1.4553, -1.1344, -1.9280],[-1.3681, -0.1619, -0.3676,  0.4312, -1.3842, -0.6180,  0.3685, 1.6281],[ 0.3637,  0.4256,  0.7674,  1.4321, -0.1164, -0.6032, -0.8182, -0.6119]]], grad_fn=<EmbeddingBackward>)

        实际想要把文本句子嵌入到Embedding中,需要先根据自己的词典,将文本信息转化为每个词在词典中的位置,然后第0个位置依旧要让给Padding,得到索引然后构建Batch再去构造Embedding,以索引为输入得到每个样本的Embedding。 

代码

import torch
import numpy as np
import torch.nn as nn
import torch.nn.functional as F# 句子数
batch_size = 2# 单词表大小
max_num_src_words = 10
max_num_tgt_words = 10# 序列的最大长度
max_src_seg_len = 12
max_tgt_seg_len = 12# 模型的维度
model_dim = 8# 生成固定长度的序列
src_len = torch.Tensor([11, 9]).to(torch.int32)
tgt_len = torch.Tensor([10, 11]).to(torch.int32)
print(src_len)
print(tgt_len)#单词索引构成的句子
src_seq = torch.cat([torch.unsqueeze(F.pad(torch.randint(1, max_num_src_words, (L,)),(0, max_src_seg_len-L)), 0) for L in src_len])
tgt_seq = torch.cat([torch.unsqueeze(F.pad(torch.randint(1, max_num_tgt_words, (L,)),(0, max_tgt_seg_len-L)), 0) for L in tgt_len])
print(src_seq)
print(tgt_seq)# 构造embedding
src_embedding_table = nn.Embedding(max_num_src_words+1, model_dim)
tgt_embedding_table = nn.Embedding(max_num_tgt_words+1, model_dim)
src_embedding = src_embedding_table(src_seq)  
tgt_embedding = tgt_embedding_table(tgt_seq)
print(src_embedding_table.weight)    
print(src_embedding)    
print(tgt_embedding)

参考

 torch.randint — PyTorch 2.3 documentation

torch.nn.functional.pad — PyTorch 2.3 文档

F.pad 的理解_domain:luyixian.cn-CSDN博客

嵌入 — PyTorch 2.3 文档

相关文章:

Transformer模型:WordEmbedding实现

前言 最近在学Transformer&#xff0c;学了理论的部分之后就开始学代码的实现&#xff0c;这里是跟着b站的up主的视频记的笔记&#xff0c;视频链接&#xff1a;19、Transformer模型Encoder原理精讲及其PyTorch逐行实现_哔哩哔哩_bilibili 正文 首先导入所需要的包&#xff1a;…...

如何压缩pdf文件大小,怎么压缩pdf文件大小

在数字化时代&#xff0c;pdf文件因其稳定的格式和跨平台兼容性&#xff0c;成为了工作与学习中不可或缺的一部分。然而&#xff0c;随着pdf文件内容的丰富&#xff0c;pdf文件的体积也随之增大&#xff0c;给传输和存储带来了不少挑战。本文将深入探讨如何高效压缩pdf文件大小…...

Spring Boot集成Atomix快速入门Demo

1.什么是Atomix&#xff1f; Atomix是一个能用的Java框架&#xff0c;用来构建高可用的分布式系统。它是基于RAFT协议的实现&#xff0c;为用户提供了各种原子数据结构&#xff0c;比如map/set/integer等&#xff0c;这些数据结构都可以在整个集群中共享并保证一致性&#xff…...

Go语言map并发安全,互斥锁和读写锁谁更优?

并发编程是 Go 语言的一大特色&#xff0c;合理地使用锁对于保证数据一致性和提高程序性能至关重要。 在处理并发控制时&#xff0c;sync.Mutex&#xff08;互斥锁&#xff09;和 sync.RWMutex&#xff08;读写锁&#xff09;是两个常用的工具。理解它们各自的优劣及擅长的场景…...

Java多线程性能调优

Synchronized同步锁优化方法 1.6之前比较重量级&#xff0c;1.6后经过优化性能大大提升 使用Synchronized实现同步锁住要是两种方式&#xff1a;方法、代码块。 1.代码块 Synchronized在修饰同步代码块时&#xff0c;是由 monitorenter和monitorexit指令来实现同步的。进入mo…...

MacOS 通过Docker安装宝塔面板搭建PHP开发环境

1、docker拉取ubuntu系统 docker pull ubuntu2、运行容器 docker run -i -t -d --name bt -p 20:20 -p 21:21 -p 80:80 -p 443:443 -p 888:888 -p 8888:8888 -p 3306:3306 -p 6379:6379 --privilegedtrue -v /Users/oi/Sites:/www/wwwroot ubuntu-v 后的 /Users/oi/Sites 代表…...

Unity发布webgl之后修改StreamingAssets 内的配置文件读取到的还是之前的配置文件的解决方案

问题描述 unity发布webgl之后&#xff0c;修改在StreamingAssets 中的配置信息&#xff0c;修改之后读取的还是之前的配置信息 读取配置文件的代码IEnumerator IE_WebGL_LoadWebSocketServerCopnfig(){var uri new System.Uri(Path.Combine(Application.streamingAssetsPath…...

离线语音识别芯片在智能生活中的应用

离线语音识别芯片&#xff0c;这一技术正逐渐渗透到我们日常生活的每一个角落&#xff0c;为众多产品带来前所未有的智能体验。它能够应用到多种产品中&#xff0c;‌包括但不限于&#xff1a;‌ 1、智能音箱&#xff1a;‌语音识别芯片作为智能音箱的核心&#xff0c;‌使用户…...

替换:show-overflow-tooltip=“true“ ,使用插槽tooltip,达到内容可复制

原生的show-overflow-tooltip“true” 不能满足条件&#xff0c;使用插槽自定义编辑&#xff1b; 旧code <el-table-column prop"reason" label"原因" align"center" :show-overflow-tooltip"true" /> <el-table-column pro…...

219.贪心算法:柠檬水找零(力扣)

代码解决 class Solution { public:bool lemonadeChange(vector<int>& bills) {int num50, num100; // 初始化5美元和10美元的计数器for(int i0; i < bills.size(); i) // 遍历所有账单{if(bills[i]5) // 如果账单是5美元{num5; // 增加5美元的计数continue; // …...

通过 Azure OpenAI 服务使用 GPT-35-Turbo and GPT-4(win版)

官方文档 Azure OpenAI 是微软提供的一项云服务&#xff0c;旨在将 OpenAI 的先进人工智能模型与 Azure 的基础设施和服务相结合。通过 Azure OpenAI&#xff0c;开发者和企业可以访问 OpenAI 的各种模型&#xff0c;如 GPT-3、Codex 和 DALL-E 等&#xff0c;并将其集成到自己…...

MySQL 面试真题(带答案)

MySQL 场景面试题 目录 场景1&#xff1a;用户注册和登录系统 1.1 数据库设计1.2 用户注册1.3 用户登录 场景2&#xff1a;订单管理系统 2.1 数据库设计2.2 创建订单2.3 查询订单 场景3&#xff1a;博客系统 3.1 数据库设计3.2 发布文章3.3 评论功能 场景1&#xff1a;用户…...

《A++ 敏捷开发》- 10 二八原则

团队成员协作&#xff0c;利用项目数据&#xff0c;分析根本原因&#xff0c;制定纠正措施&#xff0c;并立马尝试&#xff0c;判断是否有效&#xff0c;是改善的“基本功”。10-12章会探索里面的注意事项&#xff0c;13章会看两家公司的实施情况和常见问题。 如果已经获得高层…...

Spring Boot 框架知识汇总

1、什么是SpringBoot&#xff1f; 通过Spring Boot&#xff0c;可以轻松地创建独立的&#xff0c;基于生产级别的Spring的应用程序&#xff0c;您可以“运行"它们。大多数Spring Boot应用程序需要最少的Spring配置&#xff0c;集成了大量常用的第三方库配置&#xff0c;使…...

国产麒麟、uos在线编辑word文件并控制编辑区域(局部编辑)

windows系统也适用&#xff0c;该插件可同时支持windows和国产系统 在实际项目开发中&#xff0c;以下场景可能会用到Word局部编辑功能&#xff1a; 合同审批公文流转策划设计报告汇签单招投标&#xff08;标书文件&#xff09;其他&#xff0c;有模板且需要不同人员协作编辑…...

Go:基本变量与数据类型

目录 前言 前期准备 Hello World! 一、基本变量 1.1 声明变量 1.2 初始化变量 1.3 变量声明到初始化的过程 1.4 变量值交换 1.5 匿名变量 1.6 变量的作用域 二、数据类型 1.1 整型 1.2 浮点型 1.3 字符串 1.4 布尔类型 1.5 数据类型判断 1.6 数据类型转换 1.…...

计算器原生js

目录 1.HTML 2.CSS 2.JS 4.资源 5.运行截图 6.下载连接 7.注意事项 1.HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…...

怎样将aac转换mp3格式?推荐四个aac转MP3的方法

怎样将aac转换mp3格式&#xff1f;当需要将aac格式音频转换为MP3格式时&#xff0c;有几种方法可以轻松实现这一目标。MP3是一种广泛支持的音频格式&#xff0c;几乎所有设备和平台都能播放MP3文件&#xff0c;包括各种音乐播放器、手机、平板电脑和汽车音响系统。而且它也提供…...

MongoDB - 查询操作符:比较查询、逻辑查询、元素查询、数组查询

文章目录 1. 构造数据2. MongoDB 比较查询操作符1. $eq 等于1.1 等于指定值1.2 嵌入式文档中的字段等于某个值1.3 数组元素等于某个值1.4 数组元素等于数组值 2. $ne 不等于3. $gt 大于3.1 匹配文档字段3.2 根据嵌入式文档字段执行更新 4. $gte 大于等于5. $lt 小于6. $lte 小于…...

html5——CSS高级选择器

目录 属性选择器 E[att^"value"] E[att$"http"] E[att*"http"] 关系选择器 子代&#xff1a; 相邻兄弟&#xff1a; 普通兄弟&#xff1a; 结构伪类选择器 链接伪类选择器 伪元素选择器 CSS的继承与层叠 CSS的继承性 CSS的层叠性 …...

Python-数据爬取(爬虫)

~~~理性爬取~~~ 杜绝从入门到入狱 1.简要描述一下Python爬虫的工作原理&#xff0c;并介绍几个常用的Python爬虫库。 Python爬虫的工作原理 发送请求&#xff1a;爬虫向目标网站发送HTTP请求&#xff0c;通常使用GET请求来获取网页内容。解析响应&#xff1a;接收并解析HTTP响…...

虚幻引擎ue5如何调节物体锚点

当发现锚点不在物体上时&#xff0c;如何调节瞄点在物体上。 步骤1&#xff1a;按住鼠标中键拖动锚点&#xff0c;在透视图中多次调节锚点位置。 步骤2:在物体上点击鼠标右键点击-》锚定--》“设置为枢轴偏移”即可。...

Xcode持续集成之道:自动化构建与部署的精粹

标题&#xff1a;Xcode持续集成之道&#xff1a;自动化构建与部署的精粹 在快节奏的软件开发中&#xff0c;持续集成&#xff08;Continuous Integration, CI&#xff09;是提升开发效率和软件质量的关键实践。Xcode作为苹果生态中的核心开发工具&#xff0c;提供了与多种持续…...

Java高频面试基础知识点整理13

干货分享&#xff0c;感谢您的阅读&#xff01;背景​​​​​​高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09; 最全文章见&#xff1a;Java高频面试基础知识点整理 &#xff08;一&#xff09;Java基础高频知识考点 针对人员&#xff1a; 1.全部人员都…...

css画半圆画圆弧

利用border-radius和border完成&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>test</title> <style> .semicircle {width: 100px;height: 50px;border-radius: 0 0 50px 50px;background:…...

LeetCode HOT100(四)字串

和为 K 的子数组&#xff08;mid&#xff09; 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2 解法1&#xff1a;前缀和Map 这…...

uniapp引入 uview( HBuilder 和 npm 两种安装方式) #按需引入

方式一、HBuilder 安装 uview 1.1. HBuider安装-链接-》》 1.2. 在uni.scss 中引入 import "uni_modules/uview-ui/theme.scss";1.3. main.js 引入&#xff08;import Vue from ‘vue’ 下面&#xff09; import uView from "uni_modules/uview-ui"; V…...

使用uni-app和Golang开发影音类小程序

在数字化时代&#xff0c;影音内容已成为人们日常生活中不可或缺的一部分。个人开发者如何快速构建一个功能丰富、性能优越的影音类小程序&#xff1f;本文将介绍如何使用uni-app前端框架和Golang后端语言来实现这一目标。 项目概述 本项目旨在开发一个个人影音类小程序&#…...

基于Go1.19的站点模板爬虫详细介绍

构建一个基于Go1.19的站点模板爬虫是一项有趣且具有挑战性的任务。这个爬虫将能够从网站上提取数据&#xff0c;并按照指定的模板进行格式化。以下是详细的介绍和实现步骤。 1. 准备工作 工具和库&#xff1a; Go 1.19colly&#xff1a;一个强大的Go爬虫库goquery&#xff1…...

永恒之蓝:一场网络风暴的启示

引言 在网络安全的漫长历史中&#xff0c;“永恒之蓝”&#xff08;EternalBlue&#xff09;是一个不可忽视的里程碑事件。它不仅揭示了网络世界的脆弱性&#xff0c;还促使全球范围内对网络安全的重视达到了前所未有的高度。本文将深入探讨“永恒之蓝”漏洞的起源、影响及其对…...

凡科网上商城/seo网站推广助理招聘

我们经常想在一个数据表中随机地选取出数据来&#xff0c;比如随机生成考试试卷等。 利用 SQL Server 的 NewID() 方法就可以很轻松地达到这个目的。 NewID() 方法返回一个 GUID&#xff0c;如&#xff1a;EE95A489-B721-4E8A-8171-3CA8CB6AD9E4 在 select 表的时候&#xf…...

网站建设的基本步骤/友情链接你会回来感谢我

资源下载地址&#xff1a;https://download.csdn.net/download/sheziqiong/85948720 资源下载地址&#xff1a;https://download.csdn.net/download/sheziqiong/85948720 五子棋人机博弈问题 摘 要 五子棋的人机博弈是two-agent对抗搜索算法的一个很具有标志性的应用&#xff0…...

wordpress文档怎么制作/手机管家一键优化

目录 一、reactor设计模式简介 1、在Reactor模式中&#xff0c;有5个关键的参与者 1&#xff09;、描述符&#xff08;handle&#xff09; 2&#xff09;、同步事件分离器&#xff08;demultiplexer&#xff09; 3&#xff09;、事件处理器接口&#xff08;event handler&…...

大岭山做网站/站外引流推广渠道

冀中能源峰峰集团关于做好2015年度河北省职称计算机应用能力考试考务工作的通知根据邯郸市人力资源和社会保障局《关于做好2015年度河北省职称计算机应用能力考试考务工作有关问题的通知》文件通知&#xff0c;现将2015年度全省职称计算机应用能力统一考试考务工作有关问题通知…...

用react做的网站上传/企业网站优化关键词

ccf 201712-4 行车路线 解题思路&#xff1a; 首先Dijkstra是基于贪心算法的&#xff0c;即每一次作出的选择都具有贪心选择性。此题由于有“如果连续走小道&#xff0c;小明的疲劳值会快速增加&#xff0c;连续走s公里小明会增加s2的疲劳度。”这种情况&#xff0c;所以不能使…...

天津市建设安全协会网站/2023年新闻小学生摘抄

vim 查看字符编码相关的命令 echo &fenc &#xff1a;查看文件编码 set fenc &#xff1a;设置编码转载于:https://www.cnblogs.com/mliudong/archive/2012/09/14/2684616.html...