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

sam_out 目标检测的应用

  • 缺点
  • 参考地址
  • 训练验证
  • 模型
  • 解析

缺点

词表太大量化才可

参考地址

https://aistudio.baidu.com/projectdetail/8103098

训练验证

import os
from glob import glob
import cv2
import paddle
import faiss
from out_yolo_model import GPT as GPT13
import pandas as pd
import json
from tqdm import tqdm
import numpy as np
from paddle.io import DataLoader, Dataset
import warningswarnings.filterwarnings('ignore')#  36 36
def gen_small_voc():num = "0123456789" + 'qwertyuiopasdfghjklzxcvbnm' + "QWERTYUIOPASDFGHJKLZXCVBNM"num = list(num)small_em_voc = dict()voc_id = 0for i in range(16):for n in num:small_em_voc[voc_id] = "{}_{}".format(i, n)voc_id += 1return small_em_vocdef random_gen_voc():num = "0123456789" + 'qwertyuiopasdfghjklzxcvbnm' + "QWERTYUIOPASDFGHJKLZXCVBNM"num = list(num)p_list = ["{}_{}".format(i, np.random.choice(num)) for i in range(16)]return "#".join(p_list)def gen_text_voc_to_token_id():large_em_voc = dict()large = []for x in range(28 * 28):for w in range(28):for h in range(28):for class_name in range(15):large.append("x_{}_w_{}_h_{}_class_{}".format(x, w, h, class_name))large.append("<|end|>")large.append("<|start|>")for ii in tqdm(large):while True:two = random_gen_voc()if large_em_voc.get(two, None) is None:large_em_voc[two] = iilarge_em_voc[ii] = twobreakpd.to_pickle(large_em_voc, "large_em_voc.pkl")class MyDataSet(Dataset):def __init__(self):super(MyDataSet, self).__init__()txt = glob("D:/chromedownload/VisDrone2019-DET-train/annotations/*")image = glob("D:/chromedownload/VisDrone2019-DET-train/images/*")data_txt_image = []for one in txt:two = one.replace("D:/chromedownload/VisDrone2019-DET-train/annotations\\","D:/chromedownload/VisDrone2019-DET-train/images\\").replace(".txt", ".jpg")if two in image:data_txt_image.append((one, two))self.data = data_txt_imageself.large_token_to_samll_token = pd.read_pickle("large_em_voc.pkl")self.small_token_to_token_id = gen_small_voc()self.small_token_to_token_id = {k: v for v, k in self.small_token_to_token_id.items()}def init_val(self):txt = glob("D:/chromedownload/VisDrone2019-DET-test-dev/annotations/*")image = glob("D:/chromedownload/VisDrone2019-DET-test-dev/images/*")data_txt_image = []for one in txt:two = one.replace("D:/chromedownload/VisDrone2019-DET-test-dev/annotations\\","D:/chromedownload/VisDrone2019-DET-test-dev/images\\").replace(".txt", ".jpg")if two in image:data_txt_image.append((one, two))self.data = data_txt_imageself.large_token_to_samll_token = pd.read_pickle("large_em_voc.pkl")self.small_token_to_token_id = gen_small_voc()self.small_token_to_token_id = {k: v for v, k in self.small_token_to_token_id.items()}def __len__(self):return len(self.data)def __getitem__(self, item):text, image = self.data[item]image = cv2.imread(image)h, w, c = image.shapeimage = cv2.resize(image, (224, 224)) / 256text_df = pd.read_csv(text)text_df = pd.DataFrame(text_df.values.tolist() + [text_df.columns.values.tolist()]).astype("float")center_x = (text_df[0] + text_df[2] / 2) * 224 / wcenter_y = (text_df[1] + text_df[3] / 2) * 224 / hcenter_w = text_df[2] / 2 * 224 / wcenter_h = text_df[3] / 2 * 224 / hxy_index = 0center_x_y = np.zeros(center_x.size)for i in range(0, 224, 8):j = i + 8for ii in range(0, 224, 8):jj = ii + 8center_x_y[(ii <= center_x.values) * (center_x.values <= jj) * (i <= center_y.values) * (center_y.values <= j)] = xy_indexxy_index += 1text_df["xy"] = center_x_ytext_df["w"] = center_wtext_df["h"] = center_htext_df = text_df.astype("int").sort_values([1, 0])text_df = text_df.iloc[:128]xy = "x_" + text_df.astype("str")["xy"] + "_w_" + text_df.astype("str")["w"] + "_h_" + text_df.astype("str")["h"] + "_class_" + text_df.astype("str")[5]xy = xy.valuestext_token = [self.large_token_to_samll_token.get(xy_i) for xy_i in xy]text_token = [[self.small_token_to_token_id.get(j) for j in jj.split("#")] for jj in text_token if jj]text_token = np.array(text_token).reshape([-1, 16])return image, text_token, [self.small_token_to_token_id.get(i) for i inself.large_token_to_samll_token.get("<|end|>").split("#")], [self.small_token_to_token_id.get(i) for i inself.large_token_to_samll_token.get("<|start|>").split("#")]def gn(items):seq_len = 0image = []for x, y, z, s in items:if y.shape[0] > seq_len:seq_len = y.shape[0]image.append(x.transpose([2, 0, 1]).reshape([1, 3, 224, 224]))seq_len += 1text = []for x, y, z, s in items:one = np.concatenate([[s], y, (seq_len - y.shape[0]) * [z]]).reshape([1, -1, 16])text.append(one)return np.concatenate(image), np.concatenate(text)def val():small_em_voc = gen_small_voc()# small_voc_em = {k: v for v, k in small_em_voc.items()}# large_em_voc = dict()model = GPT13(len(small_em_voc), 512, 32, 8)model.load_dict(paddle.load("duo_yang_xing.pkl"))model.eval()# model.load_dict(paddle.load("gpt.pdparams"))print("参数量:",sum([i.shape[0] * i.shape[-1] if len(i.shape) > 1 else i.shape[-1] for i in model.parameters()]) / 1000000000,"B")loss_func = paddle.nn.CrossEntropyLoss()bar = tqdm(range(1))batch_size = 5data_set = MyDataSet()data_set.init_val()data = DataLoader(data_set, batch_size=batch_size, shuffle=True, num_workers=5, collate_fn=gn)data_count = 0loss_list = []for epoch in bar:for image, text in data:try:out, _ = model(text[:, :-1].astype("int64"), image.astype("float32"))loss = loss_func(out, text[:, 1:].reshape([out.shape[0], -1]).astype("int64"))loss_list.append(loss.item())bar.set_description("epoch___{}__loss__{:.5f}___data_count__{}".format(epoch, np.mean(loss_list), data_count))data_count += batch_sizeexcept:paddle.device.cuda.empty_cache()def eval_data():small_em_voc = gen_small_voc()small_voc_em = {k: v for v, k in small_em_voc.items()}large_em_voc = pd.read_pickle("large_em_voc.pkl")model = GPT13(len(small_em_voc), 512, 32, 8)model.load_dict(paddle.load("duo_yang_xing.pkl"))model.eval()# model.load_dict(paddle.load("gpt.pdparams"))print("参数量:",sum([i.shape[0] * i.shape[-1] if len(i.shape) > 1 else i.shape[-1] for i in model.parameters()]) / 1000000000,"B")batch_size = 2faiss_index = faiss.IndexFlatIP(8192)key_list=[]for i in tqdm(large_em_voc.keys()):if len(i) > 32 and "#" in i:out_em=model.embedding(paddle.to_tensor([small_voc_em.get(ii) for ii in i.split("#")]).reshape([1, 1, -1])).reshape([1,-1])out_em /= np.linalg.norm(out_em, axis=-1, keepdims=True)faiss_index.add(out_em)key_list.append(large_em_voc.get(i))data_set = MyDataSet()data_set.init_val()data = DataLoader(data_set, batch_size=batch_size, shuffle=True, num_workers=5, collate_fn=gn)for image, text in data:out, _ = model(text[:, :-1].astype("int64"), image.astype("float32"))out_em = model.embedding(paddle.argmax(out, -1).reshape([batch_size,-1,16])[0,0].reshape([1,1,16])).reshape([1,-1])out_em /= np.linalg.norm(out_em, axis=-1, keepdims=True)di,index_index=faiss_index.search(out_em,10)print(key_list[index_index[0,0]])def train():small_em_voc = gen_small_voc()# small_voc_em = {k: v for v, k in small_em_voc.items()}# large_em_voc = dict()model = GPT13(len(small_em_voc), 512, 32, 8)# model.load_dict(paddle.load("duo_yang_xing.pkl"))# model.load_dict(paddle.load("gpt.pdparams"))print("参数量:",sum([i.shape[0] * i.shape[-1] if len(i.shape) > 1 else i.shape[-1] for i in model.parameters()]) / 1000000000,"B")loss_func = paddle.nn.CrossEntropyLoss()opt = paddle.optimizer.Adam(parameters=model.parameters(), learning_rate=0.0003)bar = tqdm(range(200))batch_size = 5data_set = MyDataSet()data = DataLoader(data_set, batch_size=batch_size, shuffle=True, num_workers=5, collate_fn=gn)data_count = 0for epoch in bar:for image, text in data:try:out, _ = model(text[:, :-1].astype("int64"), image.astype("float32"))loss = loss_func(out, text[:, 1:].reshape([out.shape[0], -1]).astype("int64"))bar.set_description("epoch___{}__loss__{:.5f}___data_count__{}".format(epoch, loss.item(), data_count))opt.clear_grad()loss.backward()opt.step()data_count += batch_sizeif data_count % 1000 == 0:paddle.save(model.state_dict(), "duo_yang_xing.pkl")paddle.device.cuda.empty_cache()except:paddle.device.cuda.empty_cache()paddle.save(model.state_dict(), "duo_yang_xing.pkl")paddle.save(model.state_dict(), "duo_yang_xing.pkl")if __name__ == '__main__':# gen_text_voc_to_token_id()# train()# val()eval_data()

模型

import mathimport paddle
import paddle.nn as nnclass MaxState(paddle.nn.Layer):def __init__(self, hidden_dim, heads, win):super(MaxState, self).__init__()assert hidden_dim % heads == 0, "Hidden size must be divisible by the number of heads."self.head_size = hidden_dim // headsself.head = paddle.nn.Linear(hidden_dim, hidden_dim, bias_attr=False)self.head_num = headsself.win = winself.hidden = hidden_dimself.mask = paddle.triu(paddle.ones([win, win]))def forward(self, input_data, state=None):b, s, k, h, w = input_data.shape[0], input_data.shape[1], self.head_num, self.head_size, self.winwindow = paddle.ones([1, w])out = self.head(input_data)out = out.unsqueeze(-1) @ windowout = out.transpose([0, 2, 1, 3])one_list = []if state is None:state = paddle.ones([out.shape[0], out.shape[1], 1, 1]) * float("-inf")for i in range(0, s, w):j = w + ione = out[:, :, i:j]_, _, r, c = one.shapeif r != self.win:one = paddle.where(self.mask[:r, :], one, paddle.to_tensor(-float('inf')))else:one = paddle.where(self.mask, one, paddle.to_tensor(-float('inf')))one = paddle.concat([one, state @ window], axis=2)state = paddle.max(one, axis=2, keepdim=True)one = state.reshape([b, k, h, w])state = state[..., -1:]if r != self.win:one = one[..., :r]one = one.transpose([0, 3, 1, 2])one_list.append(one)out = paddle.concat(one_list, 1)out = out.reshape([b, s, -1])return out, stateclass FeedForward(nn.Layer):def __init__(self, hidden_size):super(FeedForward, self).__init__()self.ffn1 = nn.Linear(hidden_size, hidden_size * 2)self.ffn2 = nn.Linear(hidden_size * 2, hidden_size)self.gate = nn.Linear(hidden_size, hidden_size * 2)self.relu = nn.Silu()def forward(self, x):x1 = self.ffn1(x)x2 = self.relu(self.gate(x))x = x1 * x2x = self.ffn2(x)return xclass RMSNorm(nn.Layer):def __init__(self, dim, eps: float = 1e-6):super(RMSNorm, self).__init__()self.eps = epsself.fc = paddle.create_parameter(shape=[dim], dtype='float32',default_initializer=nn.initializer.Constant(value=1.0))def norm(self, x):return x * paddle.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps)def forward(self, x):output = self.norm(x)return output * self.fcclass GPTDecoderLayer(nn.Layer):def __init__(self, hidden_size, num_heads):super(GPTDecoderLayer, self).__init__()# self.self_attention = MaskMultiHeadAttention(hidden_size, num_heads)self.self_attention = MaxState(hidden_size, num_heads, 8)self.ffn = FeedForward(hidden_size)self.norm = nn.LayerNorm(hidden_size)self.norm1 = RMSNorm(hidden_size)def forward(self, x, state=None, seq_len=None):x1, state = self.self_attention(x, state)  # Self-Attention with residual connectionx = x1 + xx = self.norm(x)x = self.ffn(x) + x  # Feed-Forward with residual connectionx = self.norm1(x)return x, stateclass PositionalEncoding(nn.Layer):def __init__(self, d_model, max_len=5000):super(PositionalEncoding, self).__init__()# Create a long enough Paddle array to hold position encodings for the maximum sequence lengthposition = paddle.arange(max_len).unsqueeze(1).astype("float32")# Create a constant 'pe' matrix with the same size as the embedding matrixdiv_term = paddle.exp(paddle.arange(0, d_model, 2) * (-math.log(10000.0) / d_model))pe = paddle.zeros([max_len, d_model])pe[:, 0::2] = paddle.sin(position * div_term)pe[:, 1::2] = paddle.cos(position * div_term)self.pe = pe.unsqueeze(0)  # Shape: [1, max_len, d_model]# Register 'pe' as a buffer (non-trainable parameter)def forward(self, x, seq_len=None):# x is of shape [batch_size, seq_len, d_model]if seq_len is None:seq_len = x.shape[1]return x + self.pe[:, :seq_len, :]else:return x + self.pe[:, seq_len - 1:seq_len, :]# %%def sinusoidal_position_embedding(max_len, output_dim):# (max_len, 1)position = paddle.arange(0, max_len, dtype="float32").unsqueeze(-1)# (output_dim//2)ids = paddle.arange(0, output_dim // 2, dtype="float32")  # 即公式里的i, i的范围是 [0,d/2]theta = 10000 ** (-2 * ids / output_dim)# (max_len, output_dim//2)embeddings = position * theta  # 即公式里的:pos / (10000^(2i/d))sin_embeddings = paddle.sin(embeddings)cos_embeddings = paddle.cos(embeddings)return sin_embeddings, cos_embeddingsdef rope(q, sin_em, cos_em, seq_len=None):if seq_len is None:sin_em = sin_em[:q.shape[2]]cos_em = cos_em[:q.shape[2]]else:sin_em = sin_em[seq_len - 1:seq_len]cos_em = cos_em[seq_len - 1:seq_len]q1 = q.reshape([q.shape[0], q.shape[1], q.shape[2], -1, 2])[..., 1]q2 = q.reshape([q.shape[0], q.shape[1], q.shape[2], -1, 2])[..., 0]# 奇数负值*sin_em+偶数正值*cos_em  奇数正值*cos_em+偶数正值*sin_emq3 = paddle.stack([-q1 * sin_em + q2 * cos_em, q1 * cos_em + q2 * sin_em], -1)q = q3.reshape(q.shape)  # reshape后就是正负交替了return qclass ConvEm(nn.Layer):def __init__(self, hidden_size):super(ConvEm, self).__init__()# 定义卷积层self.conv1 = nn.Conv2D(in_channels=3, out_channels=hidden_size//16, kernel_size=3, padding=1)self.bn1 = nn.BatchNorm2D(hidden_size//16)# 定义第二个卷积层self.conv2 = nn.Conv2D(in_channels=hidden_size//16, out_channels=hidden_size//16, kernel_size=3, padding=1)self.bn2 = nn.BatchNorm2D(hidden_size//16)def forward(self, im):# 通过第一个卷积块x = nn.functional.relu(self.bn1(self.conv1(im)))# 通过第二个卷积块x = self.bn2(self.conv2(x))+x# 应用ReLU激活函数x = nn.functional.relu(x)return paddle.nn.functional.max_pool2d(x,4)class GPT(nn.Layer):def __init__(self, vocab_size, hidden_size, num_heads, num_layers):super(GPT, self).__init__()self.embedding = nn.Embedding(vocab_size, hidden_size)self.label_embedding = nn.Embedding(vocab_size, hidden_size)self.decoder_layers = nn.LayerList([GPTDecoderLayer(hidden_size, num_heads) for _ in range(num_layers)])self.fc = nn.Linear(hidden_size, vocab_size, bias_attr=False)self.sin_em, self.cos_em = sinusoidal_position_embedding(50000, hidden_size // num_heads // 2)self.conv = paddle.nn.Conv1D(1, 16, kernel_size=3, padding=1, bias_attr=False)self.out = nn.Linear(16, 16, bias_attr=False)self.layer_nor = paddle.nn.LayerNorm(hidden_size)# self.rms_norm=RMSNorm(hidden_size)self.cv_state = ConvEm(hidden_size)def forward(self, xx, image, state=None, seq_len=None):xx = self.embedding(xx)# x = self.position_embedding(x, seq_len)image=self.cv_state(image)image =image.reshape([image.shape[0],xx.shape[-1],-1])image=image.reshape([image.shape[0],image.shape[1],-1]).unsqueeze(-1)+paddle.zeros([1,1,1,xx.shape[1]])image =image.transpose([0,3,2,1])x = paddle.max(paddle.concat([xx,image],-2), -2)if state is None:state = [None] * len(self.decoder_layers)i = 0x = rope(x.reshape([x.shape[0], x.shape[1], -1, self.sin_em.shape[1] * 2]).transpose([0, 2, 1, 3]),self.sin_em,self.cos_em, seq_len).transpose([0, 2, 1, 3]).reshape(x.shape) + xfor decoder_layer in self.decoder_layers:x1, state[i] = decoder_layer(x, state[i])x = x1 + xi += 1# out = self.fc(self.rms_norm(x))out = self.conv(x.reshape([-1, 1, x.shape[-1]])) + xx.reshape([-1, 16, x.shape[-1]])out = out.reshape([x.shape[0], -1, x.shape[-1]])out = self.fc(self.layer_nor(out))return out, state

解析

这段代码定义了一个基于 PaddlePaddle 的 GPT 模型,包含了多个自定义的神经网络层和前向传播逻辑。下面是逐行解析:

import math
import paddle
import paddle.nn as nn

导入 Python 的数学库、PaddlePaddle 深度学习框架以及 PaddlePaddle 的神经网络相关模块。

class MaxState(paddle.nn.Layer):def __init__(self, hidden_dim, heads, win):super(MaxState, self).__init__()# 确保隐藏层维度能够被头数整除assert hidden_dim % heads == 0, "Hidden size must be divisible by the number of heads."# 计算每个头的尺寸self.head_size = hidden_dim // heads# 定义一个线性层self.head = paddle.nn.Linear(hidden_dim, hidden_dim, bias_attr=False)# 头的数量self.head_num = heads# 窗口大小self.win = win# 隐藏层维度self.hidden = hidden_dim# 创建上三角矩阵作为掩码self.mask = paddle.triu(paddle.ones([win, win]))def forward(self, input_data, state=None):# 获取输入数据的维度信息b, s, k, h, w = input_data.shape[0], input_data.shape[1], self.head_num, self.head_size, self.win# 创建一个窗口向量window = paddle.ones([1, w])# 通过线性层处理输入数据out = self.head(input_data)# 执行矩阵乘法out = out.unsqueeze(-1) @ window# 调整输出的维度out = out.transpose([0, 2, 1, 3])# 初始化一个列表来保存处理后的窗口数据one_list = []# 如果没有状态,则初始化状态if state is None:state = paddle.ones([out.shape[0], out.shape[1], 1, 1]) * float("-inf")# 遍历输入数据以窗口大小进行切片for i in range(0, s, w):j = w + ione = out[:, :, i:j]# 获取当前窗口的尺寸_, _, r, c = one.shape# 如果窗口尺寸不等于预设的win,则应用掩码if r != self.win:one = paddle.where(self.mask[:r, :], one, paddle.to_tensor(-float('inf')))else:one = paddle.where(self.mask, one, paddle.to_tensor(-float('inf')))# 将状态与窗口向量相乘并拼接one = paddle.concat([one, state @ window], axis=2)# 计算窗口内的最大值作为新的状态state = paddle.max(one, axis=2, keepdim=True)# 调整状态的形状one = state.reshape([b, k, h, w])state = state[..., -1:]# 如果窗口尺寸不等于预设的win,则裁剪输出if r != self.win:one = one[..., :r]# 调整输出的维度并添加到列表中one = one.transpose([0, 3, 1, 2])one_list.append(one)# 将所有窗口的数据拼接起来out = paddle.concat(one_list, 1)# 调整输出的形状out = out.reshape([b, s, -1])# 返回处理后的输出和状态return out, state

MaxState 类定义了一个自定义的神经网络层,它似乎用于处理输入数据的窗口并计算每个窗口的最大状态。

class FeedForward(nn.Layer):def __init__(self, hidden_size):super(FeedForward, self).__init__()# 定义两个线性层self.ffn1 = nn.Linear(hidden_size, hidden_size * 2)self.ffn2 = nn.Linear(hidden_size * 2, hidden_size)# 定义门控机制self.gate = nn.Linear(hidden_size, hidden_size * 2)# 定义激活函数self.relu = nn.Silu()def forward(self, x):# 通过第一个线性层x1 = self.ffn1(x)# 通过门控机制和激活函数x2 = self.relu(self.gate(x))# 元素乘x = x1 * x2# 通过第二个线性层x = self.ffn2(x)# 返回输出return x

FeedForward 类定义了一个前馈神经网络层,它包含两个线性层和一个门控机制,以及一个激活函数。这个前馈网络用于 GPT 模型中的每个解码器层。

class RMSNorm(nn.Layer):def __init__(self, dim, eps: float = 1e-6):super(RMSNorm, self).__init__()self.eps = eps# 创建一个可学习的参数,初始化为1.0self.fc = paddle.create_parameter(shape=[dim], dtype='float32',default_initializer=nn.initializer.Constant(value=1.0))def norm(self, x):# 计算 RMSNormreturn x * paddle.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps)def forward(self, x):# 应用 RMSNorm 并乘以可学习的参数output = self.norm(x)return output * self.fc

RMSNorm 类实现了 RMSNorm 归一化,这是一种在自然语言处理模型中常用的归一化技术。

class GPTDecoderLayer(nn.Layer):def __init__(self, hidden_size, num_heads):super(GPTDecoderLayer, self).__init__()# 自我注意力层# self.self_attention = MaskMultiHeadAttention(hidden_size, num_heads)self.self_attention = MaxState(hidden_size, num_heads, 8)# 前馈网络self.ffn = FeedForward(hidden_size)# 层归一化self.norm = nn.LayerNorm(hidden_size)# RMSNorm 归一化self.norm1 = RMSNorm(hidden_size)def forward(self, x, state=None, seq_len=None):# 自我注意力层的前向传播x1, state = self.self_attention(x, state)# 残差连接和层归一化x = x1 + xx = self.norm(x)# 前馈网络的前向传播x = self.ffn(x) + x# 残差连接和 RMSNorm 归一化x = self.norm1(x)# 返回输出和状态return x, state

GPTDecoderLayer 类定义了 GPT 模型中的一个解码器层,它包含自我注意力层、前馈网络和两种归一化层。

class PositionalEncoding(nn.Layer):def __init__(self, d_model, max_len=5000):super(PositionalEncoding, self).__init__()# 创建位置编码position = paddle.arange(max_len).unsqueeze(1).astype("float32")div_term = paddle.exp(paddle.arange(0, d_model, 2) * (-math.log(10000.0) / d_model))pe = paddle.zeros([max_len, d_model])pe[:, 0::2] = paddle.sin(position * div_term)pe[:, 1::2] = paddle.cos(position * div_term)self.pe = pe.unsqueeze(0)  # Shape: [1, max_len, d_model]# 将位置编码注册为缓冲区(非可训练参数)def forward(self, x, seq_len=None):# 如果没有提供序列长度,则使用整个位置编码if seq_len is None:seq_len = x.shape[1]return x + self.pe[:, :seq_len, :]else:return x + self.pe[:, seq_len - 1:seq_len, :]

PositionalEncoding 类实现了位置编码,这是一种在序列模型中常用的技术,用于给模型提供关于输入序列中单词顺序的信息。

def sinusoidal_position_embedding(max_len, output_dim):# 创建正弦和余弦位置嵌入position = paddle.arange(0, max_len, dtype="float32").unsqueeze(-1)ids = paddle.arange(0, output_dim // 2, dtype="float32")theta = 10000 ** (-2 * ids / output_dim)embeddings = position * thetasin_embeddings = paddle.sin(embeddings)cos_embeddings = paddle.cos(embeddings)return sin_embeddings, cos_embeddings

sinusoidal_position_embedding 函数实现了正弦和余弦位置嵌入的计算。

def rope(q, sin_em, cos_em, seq_len=None):# 应用旋转位置嵌入if seq_len is None:sin_em = sin_em[:q.shape[2]]cos_em = cos_em[:q.shape[2]]else:sin_em = sin_em[seq_len - 1:seq_len]cos_em = cos_em[seq_len - 1:seq_len]# 执行旋转操作q1 = q.reshape([q.shape[0], q.shape[1], q.shape[2], -1, 2])[..., 1]q2 = q.reshape([q.shape[0], q.shape[1], q.shape[2], -1, 2])[..., 0]# 奇数负值*sin_em+偶数正值*cos_em  奇数正值*cos_em+偶数正值*sin_emq3 = paddle.stack([-q1 * sin_em + q2 * cos_em, q1 * cos_em + q2 * sin_em], -1)q = q3.reshape(q.shape)  # reshape后就是正负交替了return q

rope 函数实现了旋转位置嵌入(RoPE),这是一种改进的位置编码方法,它通过对嵌入向量进行旋转来编码位置信息。

class ConvEm(nn.Layer):def __init__(self, hidden_size):super(ConvEm, self).__init__()# 定义卷积层self.conv1 = nn.Conv2D(in_channels=3, out_channels=hidden_size//16, kernel_size=3, padding=1)self.bn1 = nn.BatchNorm2D(hidden_size//16)# 定义第二个卷积层self.conv2 = nn.Conv2D(in_channels=hidden_size//16, out_channels=hidden_size//16, kernel_size=3, padding=1)self.bn2 = nn.BatchNorm2D(hidden_size//16)def forward(self, im):# 通过第一个卷积块x = nn.functional.relu(self.bn1(self.conv1(im)))# 通过第二个卷积块x = self.bn2(self.conv2(x))+x# 应用ReLU激活函数x = nn.functional.relu(x)return paddle.nn.functional.max_pool2d(x,4)

ConvEm 类定义了一个卷积神经网络,用于处理图像数据,提取特征,并将其转换为与 GPT 模型兼容的嵌入向量。

class GPT(nn.Layer):def __init__(self, vocab_size, hidden_size, num_heads, num_layers):super(GPT, self).__init__()# 定义词嵌入层self.embedding = nn.Embedding(vocab_size, hidden_size)# 定义标签嵌入层self.label_embedding = nn.Embedding(vocab_size, hidden_size)# 定义解码器层列表self.decoder_layers = nn.LayerList([GPTDecoderLayer(hidden_size, num_heads) for _ in range(num_layers)])# 定义输出层的线性层self.fc = nn.Linear(hidden_size, vocab_size, bias_attr=False)# 创建正弦和余弦位置嵌入self.sin_em, self.cos_em = sinusoidal_position_embedding(50000, hidden_size // num_heads // 2)# 定义卷积层self.conv = paddle.nn.Conv1D(1, 16, kernel_size=3, padding=1, bias_attr=False)# 定义输出层的线性层self.out = nn.Linear(16, 16, bias_attr=False)# 定义层归一化self.layer_nor = paddle.nn.LayerNorm(hidden_size)# 定义RMSNorm归一化# self.rms_norm=RMSNorm(hidden_size)# 定义卷积状态层self.cv_state = ConvEm(hidden_size)def forward(self, xx, image, state=None, seq_len=None):# 通过词嵌入层xx = self.embedding(xx)# 通过卷积状态层处理图像数据image=self.cv_state(image)image =image.reshape([image.shape[0],xx.shape[-1],-1])image=image.reshape([image.shape[0],image.shape[1],-1]).unsqueeze(-1)+paddle.zeros([1,1,1,xx.shape[1]])image =image.transpose([0,3,2,1])x = paddle.max(paddle.concat([xx,image],-2), -2)if state is None:state = [None] * len(self.decoder_layers)i = 0# 应用旋转位置嵌入x = rope(x.reshape([x.shape[0], x.shape[1], -1, self.sin_em.shape[1] * 2]).transpose([0, 2, 1, 3]),self.sin_em,self.cos_em, seq_len).transpose([0, 2, 1, 3]).reshape(x.shape) + x# 通过解码器层列表for decoder_layer in self.decoder_layers:x1, state[i] = decoder_layer(x, state[i])x = x1 + xi += 1# 通过输出层的线性层out = self.fc(self.layer_nor(x))return out, state

在 GPT 类的 forward 方法中,最后一个步骤是通过输出层的线性层将解码器层的输出映射到词汇表的大小。然后,该函数返回最终的输出和状态。
整个 GPT 模型通过这些自定义层和位置编码,以及旋转位置嵌入(RoPE)等技术,实现了对输入序列的编码和解码,从而能够生成或预测序列中的下一个单词。
需要注意的是,这段代码可能需要根据具体的 PaddlePaddle 版本和环境进行调整,以确保代码的正确性和兼容性。此外,由于代码较长,可能存在一些错误或者不完整的部分,因此在实际使用前需要仔细检查和调试。

相关文章:

sam_out 目标检测的应用

缺点参考地址训练验证模型解析 缺点 词表太大量化才可 参考地址 https://aistudio.baidu.com/projectdetail/8103098 训练验证 import os from glob import glob import cv2 import paddle import faiss from out_yolo_model import GPT as GPT13 import pandas as pd imp…...

VLAN原理与配置

AUTHOR &#xff1a;闫小雨 DATE&#xff1a;2024-04-28 目录 VLAN的三种端口类型 VLAN原理 什么是VLAN 为什么使用VLAN VLAN的基本原理 VLAN标签 VLAN标签各字段含义如下&#xff1a; VLAN的划分方式 VLAN的划分包括如下5种方法&#xff1a; VLAN的接口链路类型 创建V…...

使用Spring Boot实现RESTful API

使用Spring Boot实现RESTful API 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨如何利用Spring Boot框架实现RESTful API&#xff0c;这是现…...

中英双语介绍美国常春藤联盟( Ivy League):八所高校

中文版 常春藤联盟简介 常春藤联盟&#xff08;Ivy League&#xff09;是美国东北部八所私立大学组成的高校联盟。虽然最初是因体育联盟而得名&#xff0c;但这些学校以其学术卓越、历史悠久、校友杰出而闻名于世。以下是对常春藤联盟的详细介绍&#xff0c;包括其由来、成员…...

【计算机网络】常见的网络通信协议

目录 1. TCP/IP协议 2. HTTP协议 3. FTP协议 4. SMTP协议 5. POP3协议 6. IMAP协议 7. DNS协议 8. DHCP协议 9. SSH协议 10. SSL/TLS协议 11. SNMP协议 12. NTP协议 13. VoIP协议 14. WebSocket协议 15. BGP协议 16. OSPF协议 17. RIP协议 18. ICMP协议 1…...

java实现http/https请求

在Java中&#xff0c;有多种方式可以实现HTTP或HTTPS请求。以下是使用第三方库Apache HttpClient来实现HTTP/HTTPS请求的工具类。 优势和特点 URIBuilder的优势在于它提供了一种简单而灵活的方式来构造URI&#xff0c;帮助开发人员避免手动拼接URI字符串&#xff0c;并处理参…...

NC204871 求和

链接 思路&#xff1a; 对于一个子树来说&#xff0c;子树的节点就包括在整颗树的dfs序中子树根节点出现的前后之间&#xff0c;所以我们先进行一次dfs&#xff0c;用b数组的0表示区间左端点&#xff0c;1表示区间右端点&#xff0c;同时用a数组来标记dfs序中的值。处理完dfs序…...

git克隆代码warning: could not find UI helper ‘git-credential-manager-ui‘

git克隆代码warning: could not find UI helper ‘git-credential-manager-ui’ 方案 git config --global --unset credential.helpergit-credential-manager configure...

Generator 是怎么样使用的以及各个阶段的变化如何

Generators 是 JavaScript 中一种特殊类型的函数&#xff0c;可以在执行过程中暂停&#xff0c;并且在需要时恢复执行。它们是通过 function* 关键字来定义的。Generator 函数返回的是一个迭代器对象&#xff0c;通过调用该迭代器对象的 next() 方法来控制函数的执行。在调用 n…...

一文了解Java中 Vector、ArrayList、LinkedList 之间的区别

目录 1. 数据结构 Vector 和 ArrayList LinkedList 2. 线程安全 Vector ArrayList 和 LinkedList 3. 性能 插入和删除操作 随机访问 4. 内存使用 ArrayList 和 Vector LinkedList 5. 迭代器行为 ArrayList 和 Vector LinkedList 6. 扩展策略 ArrayList Vecto…...

【论文复现|智能算法改进】基于自适应动态鲸鱼优化算法的路径规划研究

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 SCI二区|鲸鱼优化算法&#xff08;WOA&#xff09;原理及实现【附完整Matlab代码】 2.改进点 非线性收敛因子 WOA 主要通过控制系数向量 A 来决定鲸鱼是搜索猎物还是捕获猎物&#xff0c;即系数向量 A 可…...

【Win测试】窗口捕获的学习笔记

2 辨析笔记 2.1 mss&#xff1a;捕获屏幕可见区域&#xff0c;不适合捕获后台应用 Claude-3.5-Sonnet: MSS库可以用来捕获屏幕上可见的内容&#xff1b;然而&#xff0c;如果游戏窗口被其他窗口完全遮挡或最小化&#xff0c;MSS将无法捕获到被遮挡的游戏窗口内容&#xff0c;而…...

PostgreSQL的学习心得和知识总结(一百四十七)|深入理解PostgreSQL数据库之transaction chain的使用和实现

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…...

宝塔linux网站迁移步骤

网站迁移到新服务器步骤 1.宝塔网站迁移&#xff0c;有个一键迁移工具&#xff0c;参考官网 宝塔一键迁移API版本 3.0版本教程 - Linux面板 - 宝塔面板论坛 (bt.cn)2 2.修改域名解析为新ip 3.如果网站没有域名&#xff0c;而是用ip访问的&#xff0c;则新宝塔数据库的wp_o…...

电路笔记(三极管器件): MOSFETIGBT

MOSFET vs IGBT MOSFET主要用于低电压和功率系统&#xff0c;而IGBT更适合高电压和功率系统。 1. MOSFET&#xff08;金属氧化物半导体场效应晶体管&#xff09; 优势&#xff1a; 高开关速度和响应速度&#xff0c;适合高频应用。&#xff08;IGBT不适合高频应用&#xff0c…...

Docker 镜像导出和导入

docker 镜像导出 # 导出 docker 镜像到本地文件 docker save -o [输出文件名.tar] [镜像名称[:标签]] # 示例 docker save -o minio.tar minio/minio:latest-o 或 --output&#xff1a;指定导出文件的路径和名称[镜像名称[:标签]]&#xff1a;导出镜像名称以及可选的标签 dock…...

QueryClientProvider is not defined

QueryClientProvider is not defined 运行一个svelte的项目&#xff0c;报错如上&#xff0c;前后查找解决不了&#xff0c;然后没办法&#xff0c; 本来是用yarn 安装的依赖&#xff0c;改用npm install&#xff0c;再次运行就成功了...

HTTPS是什么?原理是什么?用公钥加密为什么不能用公钥解密?

HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是HTTP的安全版本&#xff0c;它通过在HTTP协议之上加入SSL/TLS协议来实现数据加密传输&#xff0c;确保数据在客户端和服务器之间的传输过程中不会被窃取或篡改。 HTTPS 的工作原理 客户端发起HTTPS请求&…...

系统中非功能性需求的思考

概要 设计系统时不仅要考虑功能性需求&#xff0c;还要考虑一些非功能性需求&#xff0c;比如&#xff1a; 扩展性可靠性和冗余安全和隐私服务依赖SLA要求 下面对这5项需要考虑的事项做个简单的说明 1. 可扩展性 数据量增长如何扩展&#xff1f; 流量增长如何扩展&#xf…...

力扣第215题“数组中的第K个最大元素”

在本篇文章中&#xff0c;我们将详细解读力扣第215题“数组中的第K个最大元素”。通过学习本篇文章&#xff0c;读者将掌握如何使用快速选择算法和堆排序来解决这一问题&#xff0c;并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释&#xff0c;以便于理解。…...

java.util.function实现原理和Java使用场景【Function、Predicate集合转换过滤,BiConsumer事件处理】

简介 java.util.function 是 Java 8 引入的一个功能包,它包含了多种函数式接口的定义,使得在 Java 中进行函数式编程变得更为方便。下面我将分别介绍 java.util.function 的作用、实现原理、常用 Java 使用场景以及代码示例。 作用 java.util.function 的主要作用是为 Jav…...

《每天5分钟用Flask搭建一个管理系统》 第6章:数据库集成

第6章&#xff1a;数据库集成 6.1 数据库的选择和配置 在Flask中集成数据库&#xff0c;首先需要选择一个数据库系统。常见的选择包括SQLite、MySQL、PostgreSQL等。选择后&#xff0c;需要配置数据库连接字符串。 示例代码&#xff1a;配置数据库 from flask import Flask…...

pandas读取和处理Excel文件的基础应用1

Pandas如何读取Excel文件并处理数据 引言&#xff1a; Pandas是一种常用的数据处理和分析工具&#xff0c;它提供了丰富的函数和方法&#xff0c;方便用户对数据进行清洗、转换和分析。在实际工作中&#xff0c;我们经常需要处理Excel格式的数据文件&#xff0c;本文将介绍如何…...

electron vite react 创建一个项目

要使用 Electron、Vite 和 React 创建一个项目,你可以按照以下步骤操作: 1. 安装 Node.js 和 npm 首先,确保你的计算机上安装了 Node.js 和 npm(Node Package Manager)。你可以从 Node.js 官网 下载并安装。 2. 初始化一个新的项目 在你的工作目录下,创建一个新的文件…...

鸿蒙使用 @Builder扩展出来的布局数据更新没法更新UI

由于业务的复杂&#xff0c;所以我们把相关UI抽离出来。但是数据变化了&#xff0c;没法更新UI Builder MyGridLayout() { } 通过日志打印发现数据的确是更新了&#xff0c;但是UI就没没办法&#xff0c;如何解决呢 Entry Component struct Page35 {// State sArray: bool…...

湖南省教育网络协会莅临麒麟信安调研教育网络数字化建设及教育信创发展情况

6月28日下午&#xff0c;湖南省教育网络协会理事长张智勇、秘书长刘志勇、副理事长黄旭、胡洪波、周中伟等协会相关负责人一行莅临麒麟信安&#xff0c;就湖南省教育网络数字化建设、教育信创工作等主题进行深入调研。麒麟信安副总裁王攀热情接待。 协会成员一行来到麒麟信安展…...

论文阅读_优化RAG系统的检索

英文名称: The Power of Noise: Redefining Retrieval for RAG Systems 中文名称: 噪声的力量&#xff1a;重新定义RAG系统的检索 链接: https://arxiv.org/pdf/2401.14887.pdf 作者: Florin Cuconasu, Giovanni Trappolini, Federico Siciliano, Simone Filice, Cesare Campag…...

STC8/32 软硬件I2C通讯方式扫描I2C设备地址

STC8/32 软硬件I2C通讯方式扫描I2C设备地址 📄主要用于检测挂载在I2C总线上的设备。在驱动I2C设备之前,如果能扫描到该设备,说明通讯设备可以连接的上,在提前未知I2C地址的情况下,可以方便后面的驱动代码的完善。 🔬扫描测试效果:(测试mpu6050以及ssd1306 i2c oled )…...

Linux——数据流和重定向,制作镜像

1. 数据流 标准输入&#xff08; standard input &#xff0c;简称 stdin &#xff09;&#xff1a;默认情况下&#xff0c;标准输入指从键盘获取的输入 标准输出&#xff08; standard output &#xff0c;简称 stdout &#xff09;&#xff1a;默认情况下&#xff0c;命令…...

Windows 11的市场份额越来越大了,推荐你升级!

7月1日&#xff0c;系统之家发布最新数据&#xff0c;显示Windows 11操作系统的市场份额正在稳步上升。自2021年10月Windows 11发布以来&#xff0c;Windows 10一直占据着市场主导地位&#xff0c;当时其市场份额高达81.44%。然而&#xff0c;随着时间的推移&#xff0c;Window…...

微服务架构中的调试难题与分布式事务解决方案

微服务架构作为现代软件开发的一种主要趋势&#xff0c;因其灵活性、高可维护性和易于扩展的特点&#xff0c;得到了广泛的应用。然而&#xff0c;在享受微服务架构带来的诸多优点的同时&#xff0c;开发者也面临着一些新的挑战。调试的复杂性和分布式事务的处理是其中两个较为…...

银行家算法-操作系统中避免死锁的最著名算法

背景 有很多文章都会介绍银行家算法。在百度和CSDN上搜一搜能搜出很多来。很多同学会觉得这个算法很深奥&#xff0c;有些文章写的又很复杂&#xff0c;其实真的很简单。这里简单记录一下基本原理&#xff0c;然后大家再配合其他文章看&#xff0c;就能加深理解。 算法原理 …...

PCL 基于点云RGB颜色的区域生长算法

RGB颜色的区域生长算法 一、概述1.1 算法定义1.2 算法特点1.3 算法实现二、代码示例三、运行结果🙋 结果预览 一、概述 1.1 算法定义 点云RGB区域生长算法: 是一个基于RGB颜色信息的区域生长算法,用于点云分割。该算法利用了点云中相邻点之间的颜色相似性来将点云分割成…...

cube-studio开源一站式机器学习平台,在线ide,jupyter,vscode,matlab,rstudio,ssh远程连接,tensorboard

全栈工程师开发手册 &#xff08;作者&#xff1a;栾鹏&#xff09; 一站式云原生机器学习平台 前言 开源地址&#xff1a;https://github.com/tencentmusic/cube-studio cube studio 腾讯开源的国内最热门的一站式机器学习mlops/大模型训练平台&#xff0c;支持多租户&…...

1976 ssm 营地管理系统开发mysql数据库web结构java编程计算机网页源码Myeclipse项目

一、源码特点 ssm 营地管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开…...

技术派全局异常处理

前言 全局的异常处理是Java后端不可或缺的一部分&#xff0c;可以提高代码的健壮性和可维护性。 在我们的开发中&#xff0c;总是难免会碰到一些未经处理的异常&#xff0c;假如没有做全局异常处理&#xff0c;那么我们返回给用户的信息应该是不友好的&#xff0c;很抽象的&am…...

对于mysql 故障的定位和排查

故障表现 他的执行时间超过规定的限制&#xff08;比如1000ms&#xff09;CPU使用率高大量业务失败&#xff0c;数据连接异常执行sql越来越慢&#xff0c;失败越来越多 解决方案 定位 应急 故障恢复 定位 查询慢sql的日志查看mysql 的performance schena&#xff08;里面…...

什么是电航空插头插座连接器有什么作用

航空插头概述 定义与功能 航空插头&#xff0c;又称航空连接器&#xff0c;是一种专门用于航空领域的电连接器&#xff0c;因其最初在航空领域得到广泛应用而得名。航空插头的主要功能是实现电源或信号的连接&#xff0c;尤其适用于芯数较多、结构复杂的线束连接&#xff0c;…...

数据挖掘常见算法(分类算法)

K&#xff0d;近邻算法&#xff08;KNN&#xff09; K-近邻分类法的基本思想&#xff1a;通过计算每个训练数据到待分类元组Zu的距离&#xff0c;取和待分类元组距离最近的K个训练数据&#xff0c;K个数据中哪个类别的训练数据占多数&#xff0c;则待分类元组Zu就属于哪个类别…...

【深度学习】调整加/减模型用于体育运动评估

摘要 一种基于因果关系的创新模型&#xff0c;名为调整加/减模型&#xff0c;用于精准量化个人在团队运动中的贡献。该模型基于明确的因果逻辑&#xff0c;将个体运动员的价值定义为&#xff1a;在假设情景下&#xff0c;用一名价值为零的球员替换该球员后&#xff0c;预期比赛…...

重生之算法刷题之路之链表初探(三)

算法刷题之路之链表初探&#xff08;三&#xff09; 今天来学习的算法题是leecode2链表相加&#xff0c;是一道简单的入门题&#xff0c;但是原子在做的时候其实是有些抓耳挠腮&#xff0c;看了官解之后才恍然大悟&#xff01; 条件 项目解释 有题目可以知道&#xff0c;我们需…...

哪吒汽车,正在等待“太乙真人”的拯救

文丨刘俊宏 在360创始人、哪吒汽车股东周鸿祎近日连续且着急的“督战”中&#xff0c;哪吒汽车&#xff08;下简称哪吒&#xff09;终究还是顶不住了。 6月26日&#xff0c;哪吒通过母公司合众新能源在港交所提交了IPO文件&#xff0c;急迫地希望成为第五家登陆港股的造车新势力…...

HDC Cloud 2024 | CodeArts加速软件智能化开发,携手HarmonyOS重塑企业应用创新体验

2024年6月21~23日&#xff0c;华为开发者大会HDC 2024在东莞溪流背坡村隆重举行。期间华为云主办了以“CodeArts加速软件智能化开发&#xff0c;携手HarmonyOS重塑企业应用创新体验”为主题的分论坛。论坛汇聚了各行各业的专家学者、技术领袖和开发者&#xff0c;共同探讨Harmo…...

基于隐马尔可夫模型的股票预测【HMM】

基于机器学习方法的股票预测系列文章目录 一、基于强化学习DQN的股票预测【股票交易】 二、基于CNN的股票预测方法【卷积神经网络】 三、基于隐马尔可夫模型的股票预测【HMM】 文章目录 基于机器学习方法的股票预测系列文章目录一、HMM模型简介&#xff08;1&#xff09;前向后…...

PostgreSQL Replication Slots

一、PostgreSQL的网络测试 安装PostgreSQL客户端 sudo yum install postgresql 进行网络测试主要是验证客户端是否能够连接到远程的PostgreSQL服务器。以下是使用psql命令进行网络测试的基本步骤&#xff1a; 连接到数据库: 使用psql命令连接到远程的PostgreSQL数据库服务器…...

centos7搭建zookeeper 集群 1主2从

centos7搭建zookeeper 集群 准备前提规划防火墙开始搭建集群192.168.83.144上传安装包添加环境变量修改zookeeper 的配置 192.168.83.145 和 192.168.83.146 配置 启动 集群 准备 vm 虚拟机centos7系统zookeeper 安装包FinalShell或者其他shell工具 前提 虚拟机安装好3台cen…...

Arrays.asList 和 java.util.ArrayList 区别

理解 Java 中的 Arrays.asList 和 java.util.ArrayList 的区别 在 Java 编程中&#xff0c;Arrays.asList 方法和 java.util.ArrayList 是两种常用的处理列表数据的方式。虽然它们在功能上看起来相似&#xff0c;但在内部实现和使用上有着本质的不同。本文将探讨这两种方式的区…...

代码随想录-Day44

322. 零钱兑换 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数…...

CriticGPT: 用 GPT-4 找出 GPT-4 的错误

CriticGPT 是 OpenAI 发布的一个基于 GPT-4 的模型&#xff0c;它可以帮助我们人类 Review 并纠正 ChatGPT 在生成代码时的错误。使用 CriticGPT 审查代码时&#xff0c;有 60% 的概率生成的代码更好更正确。...

SpringBoot:SpringBoot中调用失败如何重试

一、引言 在实际的应用中&#xff0c;我们经常需要调用第三方API来获取数据或执行某些操作。然而&#xff0c;由于网络不稳定、第三方服务异常等原因&#xff0c;API调用可能会失败。为了提高系统的稳定性和可靠性&#xff0c;我们通常会考虑实现重试机制。 Spring Retry为Spri…...

信息(文字、图像、音频、视频等)在计算机中是如何存储及显示的

信息&#xff08;文字、图像、音频、视频等&#xff09;在计算机中是如何存储及显示的 图片的存储图片的文件格式像素数据的二进制表示存储和处理显示总结 图片的显示4. 像素点控制具体的像素控制过程示例总结 如题&#xff0c;这里以图片为例。 图片的存储 计算机桌面上的一…...

vector模拟实现【C++】

文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间和类类的成员变量 迭代器迭代器获取函数 构造函数默认构造使用n个值构造迭代器区间构造解决迭代器区间构造和用n个值构造的冲突拷贝构造 析构函数swap【交换函数】赋值运算符重载emptysize和capacityopera…...

ai智能语音机器人在电销里发挥怎样的作用

得益于语音识别技术的的进步&#xff0c;人工智能发展越来越成熟。相信作为企业的管理者&#xff0c;都遇到过这样的事&#xff1a;一个电销新人刚刚入行&#xff0c;需求经过一两个月的学习培训才能成为一名合格的销售人员。在这段学习的期间&#xff0c;企业投入的成本是没有…...

题解:CF1981C(Turtle and an Incomplete Sequence)

题解&#xff1a;CF1981C&#xff08;Turtle and an Incomplete Sequence&#xff09; Part 1&#xff1a;题意理解 地址链接&#xff1a;CF、洛谷。题面翻译&#xff1a;给定一个长度为 n n n 的序列 a a a&#xff0c;其中有一些元素未知&#xff0c;用 − 1 -1 −1 表示…...

探索QCS6490目标检测AI应用开发(二):摄像头视频的拉取和解码

作为《探索QCS6490目标检测AI应用开发》文章&#xff0c;紧接上一期&#xff0c;我们介绍如何在应用程序中拉取视频流&#xff0c;并且用硬件解码&#xff0c;得到逐帧的图像画面。我们使用了高通的Intelligent Multimedia SDK&#xff08;IM SDK&#xff09;完成视频的拉流和硬…...

MIX OTP——使用 GenServer 进行客户端-服务器通信

在上一章中&#xff0c;我们使用代理来表示存储容器。在 mix 的介绍中&#xff0c;我们指定要命名每个存储容器&#xff0c;以便我们可以执行以下操作&#xff1a; 在上面的会话中&#xff0c;我们与“购物”存储容器进行了交互。 由于代理是进程&#xff0c;因此每个存储容器…...

质感提升,智能化看齐新势力,魏牌蓝山智驾版实拍

说起魏牌蓝山,不知道大家还记不记得它,这是去年4月上市的一款插电混动、大6座SUV,主打30万级豪华市场。今天呢我们来到一个天台,来看看它的最新版本——蓝山智驾版。一句话点评蓝山智驾版:车内的科技感与高级感有较高水准,明显是朝着新势力“开炮”。优势:1、内饰改动较大…...

领克07EM-P诠释原创精神,助力行业向上发展

随着五月悄然而至,北京汽车车展如约召开,各大车企携手全新车型纷纷亮相。5月17日,中国原创汽车品牌领克为用户带来了新品,领克07 EM-P迎来上市。这意味着领克在高端电动轿车市场正式站稳脚跟,出色的产品魅力,也成为很多消费者的优质选择。此次发布会现场,领克07 EM-P共推…...

超长期特别国债成险资“必选项”,与地方债利差或成配置干扰因素

21世纪经济报道记者叶麦穗 广州报道 超长期特别国债火热出圈,不仅成为个人投资的香饽饽,保险资金对其的配置热情也持续升温。目前,在20年期、30年期超长期特别国债发行中,多家保险机构已入场认购。对于险资配置超长期特别国债的原因,主流观点认为,在“资产荒”的当下,安…...

XV7011BB可为智能割草机的导航系统提供新的解决方案

智能割草机作为现代家庭和商业草坪维护保养的重要工具&#xff0c;其精确的定位和导航系统对于提高机器工作效率和确保安全运行至关重要。在智能割草机的发展历程中&#xff0c;定位和导航技术一直是关键的创新点。 传统的基于RTK(实时动态差分定位技术)技术的割草机虽然在…...

Unity3D 主城角色动画控制与消息触发详解

前言 在游戏开发中&#xff0c;角色动画控制和消息触发是非常重要的一部分&#xff0c;它可以让游戏更加生动和互动。本文将详细介绍如何在Unity3D中实现主城角色动画控制与消息触发。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;大家可以点击进来一起交流一下开…...

C++进程间通信 匿名管道和命名管道

C进程间通信 匿名管道和命名管道 1. 匿名管道匿名管道概述匿名管道代码示例代码解释运行结果 2. 命名管道命名管道概述命名管道代码示例写入数据的程序&#xff08;writer.cpp&#xff09;读取数据的程序&#xff08;reader.cpp&#xff09; 代码解释运行步骤运行结果 匿名管道…...