票务网站策划书手加工外包加工网

news/2025/10/5 21:27:01/文章来源:
票务网站策划书,手加工外包加工网,软件开发外包大概多少钱,wordpress edu 2.0点击下方卡片#xff0c;关注“小白玩转Python”公众号 简介 在计算机视觉领域#xff0c;准确地测量图像相似性是一项关键任务#xff0c;具有广泛的实际应用。从图像搜索引擎到人脸识别系统和基于内容的推荐系统#xff0c;有效比较和查找相似图像的能力非常重要。Siames… 点击下方卡片关注“小白玩转Python”公众号 简介 在计算机视觉领域准确地测量图像相似性是一项关键任务具有广泛的实际应用。从图像搜索引擎到人脸识别系统和基于内容的推荐系统有效比较和查找相似图像的能力非常重要。Siamese网络与对比损失结合为以数据驱动方式学习图像相似性提供了强大的框架。在这篇博文中我们将深入了解Siamese网络的细节探讨对比损失的概念并探讨这两个组件如何共同工作以创建一个有效的图像相似性模型。 Siamese神经网络是一类旨在比较和测量输入样本对之间相似性的神经网络架构。术语“Siamese”来源于网络体系结构包含两个相同结构且共享相同权重集的孪生神经网络的概念。每个网络处理来自配对的输入样本之一并通过比较它们的输出来确定两个输入之间的相似性或不相似性。 什么是Siamese神经网络 Siamese网络的主要动机是学习输入样本的有意义的表示以捕捉它们的相似性比较所需的基本特征。这些网络在直接使用标记示例进行训练有限或困难的任务中表现出色因为它们可以学会区分相似和不相似的实例而无需显式类标签。Siamese网络的架构通常包括三个主要组件共享网络、相似度度量和对比损失函数 共享网络共享网络是Siamese架构的核心组件。它负责从输入样本中提取有意义的特征表示。共享网络包含神经单元的层例如卷积层或全连接层用于处理输入数据并生成固定长度的embedding向量。通过在孪生网络之间共享相同的权重模型学会为相似的输入提取相似的特征从而实现有效的比较。相似性度一旦输入由共享网络处理就会使用相似性度量来比较生成的embedding并测量两个输入之间的相似性或不相似性。相似度度量的选择取决于特定任务和输入数据的性质。常见的相似性度量包括欧氏距离、余弦相似度或相关系数。相似性度量量化了embedding之间的距离或相关性并提供了输入样本之间相似性的度量。对比损失函数为了训练Siamese网络采用了对比损失函数。对比损失函数鼓励网络为相似的输入生成距离更近的embedding而为不相似的输入生成距离更远的embedding。当相似对之间的距离超过一定阈值或不相似对之间的距离低于另一个阈值时对比损失函数对模型进行惩罚。对比损失函数的确切制定取决于所选的相似性度量和相似对与不相似对之间的期望边际。 在训练过程中Siamese网络学会优化其参数以最小化对比损失并生成能够有效捕捉输入数据的相似性结构的判别性embedding。 对比损失函数 对比损失是Siamese网络中常用于学习输入样本对之间相似性或不相似性的损失函数。它旨在以这样一种方式优化网络的参数即相似的输入具有在特征空间中更接近的embedding而不相似的输入则被推到更远的位置。通过最小化对比损失网络学会生成能够有效捕捉输入数据的相似性结构的embedding。 为了详细了解对比损失函数让我们将其分解为其关键组件和步骤 输入对对比损失函数作用于输入样本对其中每对包含一个相似或正例和一个不相似或负例。这些对通常在训练过程中生成其中正例对代表相似实例而负例对代表不相似实例。embeddingSiamese网络通过共享网络处理每个输入样本为配对中的两个样本生成embedding向量。这些embedding是固定长度的表示捕捉输入样本的基本特征。距离度量使用距离度量如欧氏距离或余弦相似度来衡量生成的embedding之间的不相似性或相似性。距离度量的选择取决于输入数据的性质和任务的具体要求。对比损失计算对比损失函数计算每对embedding的损失鼓励相似对具有更小的距离而不相似对具有更大的距离。对比损失的一般公式如下L (1 — y) * D² y * max(0, m — D) 其中  L对于一对的对比损失。 Dembedding之间的距离或不相似性。 y标签指示配对是否相似相似为0不相似为1。m定义不相似性阈值的边际参数。 损失项 (1 — y) * D² 对相似对进行惩罚如果它们的距离超过边际m则鼓励网络减小它们的距离。项 y * max(0, m — D)² 对不相似对进行惩罚如果它们的距离低于边际则推动网络增加它们的距离。 5. 损失的汇总为了获得整个输入对批次的整体对比损失通常会对所有对之间的个体损失进行平均或求和。汇总方法的选择取决于特定的训练目标和优化策略。 通过通过梯度下降优化方法例如反向传播和随机梯度下降最小化对比损失Siamese网络学会生成能够有效捕捉输入数据的相似性结构的判别性embedding。对比损失函数在训练Siamese网络中发挥着关键作用使其能够学习可用于各种任务如图像相似性、人脸验证和文本相似性的有意义表示。对比损失函数的具体制定和参数可以根据数据的特性和任务的要求进行调整。 在 PyTorch 中的孪生神经网络 1. 数据集创建 我们使用的数据集来自来自 http://vision.stanford.edu/aditya86/ImageNetDogs/  def copy_files(source_folder,files_list,des):for file in files_list:source_fileos.path.join(source_folder,file)des_fileos.path.join(des,file)shutil.copy2(source_file,des_file)print(fCopied {file} to {des})return def move_files(source_folder,des):files_listos.listdir(source_folder)for file in files_list:source_fileos.path.join(source_folder,file)des_fileos.path.join(des,file)shutil.move(source_file,des_file)print(fCopied {file} to {des})return def rename_file(file_path,new_name):directoryos.path.dirname(file_path)new_file_pathos.path.join(directory,new_name)os.rename(file_path,new_file_path)print(fFile renamed to {new_file_path})returnfolder_pathrC:\Users\sri.karan\Downloads\images1\Images\* op_path_similarrC:\Users\sri.karan\Downloads\images1\Images\similar_all_images tmprC:\Users\sri.karan\Downloads\images1\Images\tmpop_path_dissimilarrC:\Users\sri.karan\Downloads\images1\Images\dissimilar_all_images folders_listglob.glob(folder_path) folders_listlist(set(folders_list).difference(set([C:\\Users\\sri.karan\\Downloads\\images1\\Images\\similar_all_images,C:\\Users\\sri.karan\\Downloads\\images1\\Images\\tmp,C:\\Users\\sri.karan\\Downloads\\images1\\Images\\dissimilar_all_images])))l,g0,0random.shuffle(folders_list) for i in glob.glob(folder_path):if i in [C:\\Users\\sri.karan\\Downloads\\images1\\Images\\similar_all_images,C:\\Users\\sri.karan\\Downloads\\images1\\Images\\tmp,C:\\Users\\sri.karan\\Downloads\\images1\\Images\\dissimilar_all_images]:continuefile_namei.split(\\)[-1].split(-)[1]picked_filespick_random_files(i,6)copy_files(i,picked_files,tmp)for m in range(3):rename_file(os.path.join(tmp,picked_files[m*2]),similar_str(g)_first.jpg)rename_file(os.path.join(tmp,picked_files[m*21]),similar_str(g)_second.jpg)g1move_files(tmp,op_path_similar)choice_one,choice_tworandom.choice(range(len(folders_list))),random.choice(range(len(folders_list)))picked_dissimilar_onepick_random_files(folders_list[choice_one],3)picked_dissimilar_twopick_random_files(folders_list[choice_two],3)copy_files(folders_list[choice_one],picked_dissimilar_one,tmp)copy_files(folders_list[choice_two],picked_dissimilar_two,tmp)picked_files_dissimilarpicked_dissimilar_onepicked_dissimilar_twofor m in range(3):rename_file(os.path.join(tmp,picked_files_dissimilar[m]),dissimilar_str(l)_first.jpg)rename_file(os.path.join(tmp,picked_files_dissimilar[m3]),dissimilar_str(l)_second.jpg)l1move_files(tmp,op_path_dissimilar) 我们挑选了3对相似图像狗品种和3对不相似图像狗品种来微调模型为了使负样本简单对于给定的锚定图像狗品种任何除地面实况狗品种以外的其他狗品种都被视为负标签。 注意 “相似图像” 意味着来自相同狗品种的图像被视为正对而“不相似图像” 意味着来自不同狗品种的图像被视为负对。 代码解释 46行从每个狗图像文件夹中随机挑选了6张图像。47行选择的图像被移动到一个名为 “tmp” 的文件夹中并且由于它们来自同一狗品种文件夹因此被重命名为 “similar_images”。55行完成所有这些后它们被移动到 “similar_all_images” 文件夹中。56、57行类似地为了获得不相似的图像对从两个不同的狗品种文件夹中选择了3张图像。然后重复上述流程以获得不相似的图像对并将它们移动到 “dissimilar_all_images” 文件夹中。 完成所有这些后我们可以继续创建数据集对象。 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from PIL import Image import numpy as np import randomfrom torch.utils.data import DataLoader, Dataset import torch import torch.nn as nn from torch import optim import torch.nn.functional as Fclass ImagePairDataset(torch.utils.data.Dataset):def __init__(self, root_dir):self.root_dir root_dirself.transform T.Compose([# We first resize the input image to 256x256 and then we take center crop.transforms.Resize((256,256)),transforms.ToTensor()] )self.image_pairs self.load_image_pairs()def __len__(self):return len(self.image_pairs)def __getitem__(self, idx):image1_path, image2_path, label self.image_pairs[idx]image1 Image.open(image1_path).convert(RGB)image2 Image.open(image2_path).convert(RGB)# Convert the tensor to a PIL image# image1 functional.to_pil_image(image1)# image2 functional.to_pil_image(image2)image1 self.transform(image1)image2 self.transform(image2)# image1 torch.clamp(image1, 0, 1)# image2 torch.clamp(image2, 0, 1)return image1, image2, labeldef load_image_pairs(self):image_pairs []# Assume the directory structure is as follows:# root_dir# ├── similar# │ ├── similar_image1.jpg# │ ├── similar_image2.jpg# │ └── ...# └── dissimilar# ├── dissimilar_image1.jpg# ├── dissimilar_image2.jpg# └── ...similar_dir os.path.join(self.root_dir, similar_all_images)dissimilar_dir os.path.join(self.root_dir, dissimilar_all_images)# Load similar image pairs with label 1similar_images os.listdir(similar_dir)for i in range(len(similar_images) // 2):image1_path os.path.join(similar_dir, fsimilar_{i}_first.jpg)image2_path os.path.join(similar_dir, fsimilar_{i}_second.jpg)image_pairs.append((image1_path, image2_path, 0))# Load dissimilar image pairs with label 0dissimilar_images os.listdir(dissimilar_dir)for i in range(len(dissimilar_images) // 2):image1_path os.path.join(dissimilar_dir, fdissimilar_{i}_first.jpg)image2_path os.path.join(dissimilar_dir, fdissimilar_{i}_second.jpg)image_pairs.append((image1_path, image2_path, 1))return image_pairsdataset ImagePairDataset(r/home/niq/hcsr2001/data/image_similarity) train_size int(0.8 * len(dataset)) test_size len(dataset) - train_size train_dataset, test_dataset torch.utils.data.random_split(dataset, [train_size, test_size])batch_size 32 train_loader DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue) test_loader DataLoader(test_dataset, batch_sizebatch_size, shuffleFalse) 在上述代码的第8到10行对图像进行预处理包括将图像调整大小为256。我们使用批量大小为32这取决于您的计算能力和 GPU。 #create the Siamese Neural Network class SiameseNetwork(nn.Module):def __init__(self):super(SiameseNetwork, self).__init__()# Setting up the Sequential of CNN Layers# self.cnn1 nn.Sequential(# nn.Conv2d(3, 256, kernel_size11,stride4),# nn.ReLU(inplaceTrue),# nn.MaxPool2d(3, stride2),# nn.Conv2d(256, 256, kernel_size5, stride1),# nn.ReLU(inplaceTrue),# nn.MaxPool2d(2, stride2),# nn.Conv2d(256, 384, kernel_size3,stride1),# nn.ReLU(inplaceTrue)# )self.cnn1nn.Conv2d(3, 256, kernel_size11,stride4)self.relu nn.ReLU()self.maxpool1nn.MaxPool2d(3, stride2)self.cnn2nn.Conv2d(256, 256, kernel_size5,stride1)self.maxpool2nn.MaxPool2d(2, stride2)self.cnn3nn.Conv2d(256, 384, kernel_size3,stride1)self.fc1 nn.Linear(46464, 1024)self.fc2nn.Linear(1024, 256)self.fc3nn.Linear(256, 1)# Setting up the Fully Connected Layers# self.fc1 nn.Sequential(# nn.Linear(384, 1024),# nn.ReLU(inplaceTrue),# nn.Linear(1024, 32*46464),# nn.ReLU(inplaceTrue),# nn.Linear(32*46464,1)# )def forward_once(self, x):# This function will be called for both images# Its output is used to determine the similiarity# output self.cnn1(x)# print(output.view(output.size()[0], -1).shape)# output output.view(output.size()[0], -1)# output self.fc1(output)# print(x.shape)output self.cnn1(x)# print(output.shape)outputself.relu(output)# print(output.shape)outputself.maxpool1(output)# print(output.shape)output self.cnn2(output)# print(output.shape)outputself.relu(output)# print(output.shape)outputself.maxpool2(output)# print(output.shape)output self.cnn3(output)outputself.relu(output)# print(output.shape)outputoutput.view(output.size()[0], -1)# print(output.shape)outputself.fc1(output)# print(output.shape)outputself.fc2(output)# print(output.shape)outputself.fc3(output)return outputdef forward(self, input1, input2):# In this function we pass in both images and obtain both vectors# which are returnedoutput1 self.forward_once(input1)output2 self.forward_once(input2)return output1, output2 我们的网络称为 SiameseNetwork我们可以看到它几乎与标准 CNN 相同。唯一可以注意到的区别是我们有两个前向函数forward_once 和 forward。为什么呢 我们提到通过相同网络传递两个图像。forward_once 函数在 forward 函数中调用它将一个图像作为输入传递到网络。输出存储在 output1 中而来自第二个图像的输出存储在 output2 中正如我们在 forward 函数中看到的那样。通过这种方式我们设法输入了两个图像并从我们的模型获得了两个输出。 我们已经看到了损失函数应该是什么样子现在让我们来编码它。我们创建了一个名为 ContrastiveLoss 的类与模型类一样我们将有一个 forward 函数。 class ContrastiveLoss(torch.nn.Module):def __init__(self, margin2.0):super(ContrastiveLoss, self).__init__()self.margin margindef forward(self, output1, output2, label):# Calculate the euclidean distance and calculate the contrastive losseuclidean_distance F.pairwise_distance(output1, output2, keepdim True)loss_contrastive torch.mean((1-label) * torch.pow(euclidean_distance, 2) (label) * torch.pow(torch.clamp(self.margin - euclidean_distance, min0.0), 2))return loss_contrastivenet SiameseNetwork().cuda() criterion ContrastiveLoss() optimizer optim.Adam(net.parameters(), lr 0.0005 ) 按照顶部的流程图我们可以开始创建训练循环。我们迭代100次并提取两个图像以及标签。我们将梯度归零将两个图像传递到网络中网络输出两个向量。然后将两个向量和标签馈送到我们定义的 criterion损失函数中。我们进行反向传播和优化。出于一些可视化目的并查看我们的模型在训练集上的性能因此我们将每10批次打印一次损失。 counter [] loss_history [] iteration_number 0# Iterate throught the epochs for epoch in range(100):# Iterate over batchesfor i, (img0, img1, label) in enumerate(train_loader, 0):# Send the images and labels to CUDAimg0, img1, label img0.cuda(), img1.cuda(), label.cuda()# Zero the gradientsoptimizer.zero_grad()# Pass in the two images into the network and obtain two outputsoutput1, output2 net(img0, img1)# Pass the outputs of the networks and label into the loss functionloss_contrastive criterion(output1, output2, label)# Calculate the backpropagationloss_contrastive.backward()# Optimizeoptimizer.step()# Every 10 batches print out the lossif i % 10 0 :print(fEpoch number {epoch}\n Current loss {loss_contrastive.item()}\n)iteration_number 10counter.append(iteration_number)loss_history.append(loss_contrastive.item())show_plot(counter, loss_history) 我们现在可以分析结果。我们能看到的第一件事是损失从1.6左右开始并以接近1的数字结束。看到模型的实际运行情况将是有趣的。现在是我们在模型之前没见过的图像上测试我们的模型的部分。与之前一样我们使用我们的自定义数据集类创建了一个 Siamese Network 数据集但现在我们将其指向测试文件夹。 作为接下来的步骤我们从第一批中提取第一张图像并迭代5次以提取接下来5批中的5张图像因为我们设置每批包含一张图像。然后使用 torch.cat() 水平组合两个图像我们可以清楚地可视化哪个图像与哪个图像进行了比较。 我们将两个图像传入模型并获得两个向量然后将这两个向量传入 F.pairwise_distance() 函数这将计算两个向量之间的欧氏距离。使用这个距离我们可以作为衡量两张脸有多不相似的指标。 test_loader_one  DataLoader(test_dataset, batch_size1, shuffleFalse) dataiter iter(test_loader_one) x0, _, _ next(dataiter)for i in range(5):# Iterate over 5 images and test them with the first image (x0)_, x1, label2 next(dataiter)# Concatenate the two images togetherconcatenated torch.cat((x0, x1), 0)output1, output2 net(x0.cuda(), x1.cuda())euclidean_distance F.pairwise_distance(output1, output2)imshow(torchvision.utils.make_grid(concatenated), fDissimilarity: {euclidean_distance.item():.2f}) view raweval.py hosted with ❤ by GitHub 总结 Siamese 网络与对比损失结合为学习图像相似性提供了一个强大而有效的框架。通过对相似和不相似图像进行训练这些网络可以学会提取能够捕捉基本视觉特征的判别性embedding。对比损失函数通过优化embedding空间进一步增强 了模型准确测量图像相似性的能力。随着深度学习和计算机视觉的进步Siamese 网络在各个领域都有着巨大的潜力包括图像搜索、人脸验证和推荐系统。通过利用这些技术我们可以为基于内容的图像检索、视觉理解以及视觉领域的智能决策开启令人兴奋的可能性。 ·  END  · HAPPY LIFE 本文仅供学习交流使用如有侵权请联系作者删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lab5

流程图 到了这个lab5才算是真正看清除了整个lab的样子, 之前还一直纳闷lab2好像没什么用… 这个系统的核心思想是 分而治之。通过将整个键空间划分为多个分片(Shard),并将这些分片分配给不同的、可独立运行的服务器…

lab4

架构 架构图:简单说, 我们要建立的KV数据库是位于raft层之上的, 或者说我们的KV数据库使用了raft库。客户端(就是代码中的clerk)调用应用层(server)的RPC,应用层收到RPC之后,会调用Start函数,Start函数会立即返回…

公司网站要使用我个人的信息备案如何用表格做网站

7-10 解一元二次方程 分数 20 全屏浏览 切换布局 作者 李祥 单位 湖北经济学院 请编写程序,解一元一次方程 ax2bxc0 。 已知一元二次方程的求根公式为: 要求: 若 a0,则为一元一次方程。 若 b0,则方程有唯一解&…

公司关于网站建设的通知春风摩托车官方网

API作用使用场景curl localhost:9200/_cluster/health?pretty查看ES健康状态curl localhost:9200/_cluster/settings?pretty查看ES集群的设置其中persistent为永久设置,重启仍然有效;trainsient为临时设置,重启失效curl localhost:9200/_ca…

某中心2026年推出1111个技术实习岗位

某中心宣布2026年将提供1111个实习岗位,涵盖工程、产品管理、研究等技术领域。实习生将参与影响数百万互联网用户的实际项目,并享受包括无服务器应用平台在内的免费技术资源。某中心承诺2026年提供1111个实习机会 某…

NumPy广播:12个技巧替代循环,让数组计算快40倍

写Python数据处理代码时反复用for循环?这其实是在给程序性能交"税"。NumPy的广播(broadcasting)机制能让你摆脱这种困境——代码量更少,执行更快,关键是思维方式从"逐个迭代"转向"整体形状…

网站建设费用如何做账务处理wordpress 修改页面内容

198. 打家劫舍(题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台) 思路:dp题除背包外的另外一类题目,重点不在于看前面的情况,而在于考虑本节点的情况。一种情况&#xf…

川土微变频器应用分享

川土微电子在变频器领域的应用主要体现在隔离接口、隔离运放和隔离驱动产品上的解决方案上,其产品通过高可靠性和定制化设计,有效提升了变频器的信号传输安全性和系统稳定性‌了。以下是具体应用场景及产品方案: 一…

wordpress单页导航模版建设网站优化

目录 前言1. 公共逻辑2. 单个删除3. 批量删除 前言 由于近期慢慢转全栈,后续会以前后端的形式讲解 对应的Avue相关知识推荐阅读:【vue】avue-crud表单属性配置(表格以及列)对应后端知识推荐阅读:java框架 零基础从入…

论文阅读笔记——Large Language Models Are Zero-Shot Fuzzers - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:低秩矩阵、奇异值矩阵和正交矩阵

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

POLIR-Society-Philosophy- Hegels 形而上学System Philosophy Dialectics 系统化哲学辩证法: 自由意志+封闭的绝对精神

POLIR-Society-Philosophy- Hegels 形而上学System Philosophy & Dialectics Hegel的 "系统化哲学&辩证法": 自由意志+封闭的绝对精神

wordpress插件 标签页青岛济南网站建设优化

其实学过java的人基本都知道,工厂模式,我们是基本每天都在用,只不过工厂模式也分为几种情况:简单工厂,抽象工厂和智能工厂。 简单工厂其实,大家时时刻刻都在用,个人理解,当我们在一个…

开平网站制作北京工商注册流程

目录 一.getchar 函数简介 1.getchar 原理2.getchar 函数声明3.getchar 使用场景 二.getchar 函数使用三.getchar 函数妙用四.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.getchar函数简介 1.getchar 原理 getchar 函数用于获取用户输入&a…

做网站北京公众号服务平台入口

浙江省高校计算机等级考试二级(高级办公)Word操作提示说明:经过多位教师的反复验证,以下操作步骤能做出与效果图一样的文档。具体操作步骤如下:1(1)~(2)操作:选择“格式”→“样式和格式”命令(或在格式工具栏上单击“格式窗格”按…

C#面向对象实践方案--贪吃蛇

C#面向对象实践方案--贪吃蛇2025-10-05 20:59 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important;…

家具网站开发项目计划书巫山做网站哪家强

1.打开以下页面: http://api.fanyi.baidu.com/api/trans/product/index 2. 在网页找到“立即使用”并点击,之后,如果要求你登录百度,那就用你已有的百度账号登录,如果没有百度账号,请先申请一个百度账号&am…

解决VLC 无法解码格式“h264” (H264 - MPEG-4 AVC (part 10))

解决VLC 无法解码格式“h264” (H264 - MPEG-4 AVC (part 10))sudo pacman -S vlc-plugins-all

网站建设怎么收费手机网站表单验证

回到目录 数据分页是这个经常说的东西,无论在WEBForm还是WinForm中它都会被单独拿出来,或者是公用组件,或者是公用类库,反正对于数据分页这个东西,总是我们关注的一个话题,但事实上,数据分页归…

那个网站做图片好看中文域名 网站

矢量平移和测地线1、矢量的平移 我们在三维欧氏空间中(即在流形上讨论问题)时说过,矢量的加法应满足平行四边形法则。但是在矢量求和时,我们要先把两个矢量的端点平移到同一个位置。这是因为流形上两个不同的点有两个矢量空间,而矢量的加法只…