PyTorch教程中文版

article/2025/9/20 11:31:41

原文:Welcome to PyTorch Tutorials — PyTorch Tutorials 1.12.0+cu102 documentation​​​​​​

 中文翻译,加个人总结,便于理解与回顾。

前置知识:python、神经网络

目录

基础概念:

张量Tensors:

 tensor的性质:

tensor的操作:

基本使用:

数据集

自定义数据集:

数据载入器

变换

搭建神经网络

模型参数:

自动微分

禁止梯度跟踪

计算图

 tensor梯度和雅各布乘积

 优化模型参数

超参数

 保存于载入模型

保存、加载模型权重

保存加载模型形状

将模型导出为ONNX


基础概念:

张量Tensors

一维数组,二维矩阵,三维以上称作张量。类似于NumPy的ndarrays,只是tensor可以在GPU或其他硬件加速器上运行。事实上,tensor和NumPy数组通常可以共享相同的底层内存,不需要复制数据。tensor还为自动微分进行了优化。

#张量初始化:#直接初始化:
data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)#从Numpy数组中初始化
np_array = np.array(data)
x_np = torch.from_numpy(np_array)#从其他tensor中初始化
x_ones = torch.ones_like(x_data) # retains the properties of x_data
print(f"Ones Tensor: \n {x_ones} \n")x_rand = torch.rand_like(x_data, dtype=torch.float) # overrides the datatype of x_data
print(f"Random Tensor: \n {x_rand} \n")#使用随机数和常数初始化
shape = (2,3,)
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)print(f"Random Tensor: \n {rand_tensor} \n")
print(f"Ones Tensor: \n {ones_tensor} \n")
print(f"Zeros Tensor: \n {zeros_tensor}")

 tensor的性质:

形状:tensor.shape

数据类型:tensor.dtype

存储设备:tensor.device

tensor的操作:

torch — PyTorch 1.12 documentationhttps://pytorch.org/docs/stable/torch.html全面介绍了100多种tensor操作,包括算术、线性代数、矩阵操作(转置、索引、切片)、采样等。

默认情况下,tensor是在CPU上创建的。我们需要使用.to方法明确地将tensor移动到GPU上(在检查GPU的可用性之后)。请记住,在不同的设备上复制存储size比较大的tensor,在时间和内存上都是很昂贵的!

# 如果有的话,我们把我们的tensor移到GPU上
if torch.cuda.is_available():tensor = tensor.to('cuda')
# 类似numpy的一系列操作:
tensor = torch.ones(4, 4)
print('第一行: ', tensor[0])
print('第一列:', tensor[:, 0])
print('最后一列:', tensor[..., -1])
tensor[:,1] = 0
print(tensor)#连接tensor
t1 = torch.cat([tensor, tensor, tensor], dim=1)
print(t1)# 这将计算两个tensor之间的矩阵乘法,y1, y2, y3将有相同的值
y1 = tensor @ tensor.T
y2 = tensor.matmul(tensor.T)y3 = torch.rand_like(tensor)
torch.matmul(tensor, tensor.T, out=y3)# 这将计算出元素相乘的结果。z1,z2, z3有相同的值
z1 = tensor * tensor
z2 = tensor.mul(tensor)z3 = torch.rand_like(tensor)
torch.mul(tensor, tensor, out=z3)#item()将其变换为Python数值
agg = tensor.sum()
agg_item = agg.item()
print(agg_item, type(agg_item))# 原地操作
print(tensor, "\n")
tensor.add_(5)
print(tensor)# 和Numpy转换
t = torch.ones(5)
print(f"t: {t}")
n = t.numpy()
print(f"n: {n}")
t.add_(1) # tensor的变化反映在NumPy数组中
print(f"t: {t}")
print(f"n: {n}")# Numpy数组转换为tensor
n = np.ones(5)
t = torch.from_numpy(n)
np.add(n, 1, out=n) # Numpy数组中的变化反映在tensor中
print(f"t: {t}")
print(f"n: {n}")

基本使用:

数据集

torch.utils.data.Dataset

import torch
from torch.utils.data import Dataset
from torchvision import datasets
from torchvision.transforms import ToTensor
import matplotlib.pyplot as plt# 加载数据集
training_data = datasets.FashionMNIST( root="data", train=True, download=True, transform=ToTensor() )test_data = datasets.FashionMNIST( root="data", train=False, download=True, transform=ToTensor() )# 数据集的迭代和可视化
labels_map = {0: "T-Shirt",1: "Trouser",2: "Pullover",3: "Dress",4: "Coat",5: "Sandal",6: "Shirt",7: "Sneaker",8: "Bag",9: "Ankle Boot",
}
figure = plt.figure(figsize=(8, 8))
cols, rows = 3, 3
for i in range(1, cols * rows + 1):sample_idx = torch.randint(len(training_data), size=(1,)).item()img, label = training_data[sample_idx]figure.add_subplot(rows, cols, i)plt.title(labels_map[label])plt.axis("off")plt.imshow(img.squeeze(), cmap="gray")
plt.show()

自定义数据集:

需要实现下面三个方法

__init__

在实例化数据集对象时,__init__函数运行一次。我们初始化目录,目录中包括图像文件、标注文件和变换(在下一节有更详细的介绍)。

__len__

函数 __len__ 返回我们数据集中的样本数。

__getitem__

函数 __getitem__ 在给定的索引idx处加载并返回数据集中的一个样本。基于索引,它确定图像在硬盘上的位置,使用read_image将其变换为tensor,从self.img_labels中的csv数据中获取相应的标签,对其调用变换函数(如果适用),并在一个元组中返回tensor图像和相应标签。

import os
import pandas as pd
from torchvision.io import read_imageclass CustomImageDataset(Dataset):def __init__(self, annotations_file, img_dir, transform=None, target_transform=None):self.img_labels = pd.read_csv(annotations_file)self.img_dir = img_dirself.transform = transformself.target_transform = target_transformdef __len__(self):return len(self.img_labels)def __getitem__(self, idx):img_path = os.path.join(self.img_dir, self.img_labels.iloc[idx, 0])image = read_image(img_path)label = self.img_labels.iloc[idx, 1]if self.transform:image = self.transform(image)if self.target_transform:label = self.target_transform(label)return image, label

数据载入器

torch.utils.data.DataLoader

DataLoader:数据集每次都会检索我们的数据集的特征和标签。在训练模型时,我们通常希望以 "小批 "的形式传递样本,在每个epoch中重新洗牌以减少模型的过拟合,并使用Python的multiprocessing来加快数据的检索速度。

from torch.utils.data import DataLoader# 加载数据
train_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)
test_dataloader = DataLoader(test_data, batch_size=64, shuffle=True)# 迭代
# Display image and label.
train_features, train_labels = next(iter(train_dataloader))
print(f"Feature batch shape: {train_features.size()}")
print(f"Labels batch shape: {train_labels.size()}")
img = train_features[0].squeeze()
label = train_labels[0]
plt.imshow(img, cmap="gray")
plt.show()
print(f"Label: {label}")

变换

torchvision.transform

ToTensor:ToTensor将PIL图像或NumPy的ndarray变换为FloatTensor,并将图像的像素亮度值按[0., 1.]的范围进行缩放。

Lambda:Lambda变换应用任何用户定义的Lambda函数。在这里,我们定义了一个函数,把整数变成一个one-hot的tensor。它首先创建一个大小为10(我们数据集中的标签数量),值为0的tensor,并调用scatter_,在标签y给出的索引上分配一个value=1。

import torch
from torchvision import datasets
from torchvision.transforms import ToTensor, Lambdads = datasets.FashionMNIST(root="data",train=True,download=True,transform=ToTensor(),target_transform=Lambda(lambda y: torch.zeros(10, dtype=torch.float).scatter_(0, torch.tensor(y), value=1))
)

搭建神经网络

torch.nn

PyTorch中的每个模块都是nn.Module的子类

nn.Flatten:展平

nn.Linear:线性层,使用其存储的权重和偏置对输入进行线性变换

nn.ReLU:非线性激活函数

nn.Sequential:有序模块的容器

seq_modules = nn.Sequential(flatten,layer1,nn.ReLU(),nn.Linear(20, 10)
)
input_image = torch.rand(3,28,28)
logits = seq_modules(input_image)

 nn.Softmax:对数被缩放到数值区间[0, 1],代表模型对每个类别的预测概率。 dim参数表示数值必须和为1的维度。

softmax = nn.Softmax(dim=1)
pred_probab = softmax(logits)

完整代码: 

import os
import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms# 获取训练的设备
device = 'cuda' if torch.cuda.is_available() else 'cpu'
print('Using {} device'.format(device))#  定义类
class NeuralNetwork(nn.Module):def __init__(self):super(NeuralNetwork, self).__init__()self.flatten = nn.Flatten()self.linear_relu_stack = nn.Sequential(nn.Linear(28*28, 512),nn.ReLU(),nn.Linear(512, 512),nn.ReLU(),nn.Linear(512, 10),)def forward(self, x):x = self.flatten(x)logits = self.linear_relu_stack(x)return logits
# 创建一个NeuralNetwork的实例,并将其移动到设备上,并打印其结构
model = NeuralNetwork().to(device)
print(model)

使用模型时,把输入数据传给它,会自动执行forward函数,以及一些后台操作。请不要直接调用model.forward()!

X = torch.rand(1, 28, 28, device=device)
logits = model(X)
pred_probab = nn.Softmax(dim=1)(logits)
y_pred = pred_probab.argmax(1)
print(f"Predicted class: {y_pred}")

模型参数:

parameters() 或 named_parameters() 方法访问所有参数

print("Model structure: ", model, "\n\n")for name, param in model.named_parameters():print(f"Layer: {name} | Size: {param.size()} | Values : {param[:2]} \n")

自动微分

torch.autograd

PyTorch有一个内置的微分引擎,它支持对任何计算图的梯度进行自动计算。

import torchx = torch.ones(5)  # input tensor
y = torch.zeros(3)  # expected output
w = torch.randn(5, 3, requires_grad=True)
b = torch.randn(3, requires_grad=True)
z = torch.matmul(x, w)+b
loss = torch.nn.functional.binary_cross_entropy_with_logits(z, y)print('Gradient function for z =', z.grad_fn)
print('Gradient function for loss =', loss.grad_fn)#计算梯度
loss.backward()
print(w.grad)
print(b.grad)
  • 我们只能获得计算图的叶子节点的grad属性,这些节点的requires_grad属性设置为True。对于我们图中的所有其他节点,梯度将不可用。
  • 出于性能方面的考虑,我们只能在一个给定的图上使用一次backward来进行梯度计算。如果我们需要在同一个图上进行多次backward调用,我们需要在backward调用中传递 retain_graph=True。

禁止梯度跟踪

默认情况下,所有带有require_grad=True的tensor都在跟踪它们的计算历史并支持梯度计算。然而,在某些情况下,我们不需要这样做,例如,当我们已经训练好了模型,只是想把它应用于一些输入数据,也就是说,我们只想通过网络进行前向计算。我们可以通过用torch.no_grad()块包围我们的计算代码来停止跟踪计算。

z = torch.matmul(x, w)+b
print(z.requires_grad)with torch.no_grad():z = torch.matmul(x, w)+b
print(z.requires_grad)# 另一种做法
z = torch.matmul(x, w)+b
z_det = z.detach()
print(z_det.requires_grad)

禁用梯度跟踪:

  • 将神经网络中的一些参数标记为冻结参数。这是对预训练的网络进行微调的一个非常常见的情况。
  • 当你只做前向传递时,为了加快计算速度,对不跟踪梯度的tensor的计算会更有效率。

计算图

从概念上讲,autograd在一个由Function对象组成的有向无环图(DAG)中保存了数据(tensor)和所有执行的操作(以及产生的新tensor)的记录。在这个DAG中,叶子是输入tensor,根部是输出tensor。通过追踪这个图从根到叶,你可以使用链式规则自动计算梯度。

在一个前向传递中,autograd同时做两件事。

  • 运行请求的操作,计算出一个结果tensor。
  • 在DAG中维护该操作的梯度函数。

当在DAG根上调用.backward()时,后向传递开始了。

  • 计算每个.grad_fn的梯度。
  • 将它们累积到各自tensor的 .grad 属性中
  • 使用链式规则,一直传播到叶子tensor。

注意:在PyTorch中,DAG是动态的。需要注意的是,图是从头开始重新创建的;在每次调用.backward()后,autograd开始填充一个新的图。这正是允许你在模型中使用控制流语句的原因;如果需要,你可以在每次迭代时改变形状、大小和操作。

 tensor梯度和雅各布乘积

在许多情况下,我们有一个标量损失函数,我们需要计算相对于某些参数的梯度。然而,有些情况下,输出函数是一个任意的张量。在这种情况下,PyTorch允许你计算雅各布乘积,而不是实际的梯度。

对于一个矢量函数 \vec{y}=f(\vec{x}),其中,\vec{x}=<x_1,\dots,x_n>\vec{y}=<y_1,\dots, y_m>,一个\vec{y}相对于\vec{x}的梯度是由Jacobian矩阵给出的。

PyTorch允许你计算雅各布乘积v^T * J,而不是计算雅各布矩阵本身。对于一个给定的输入矢量v=(v_1, \dots, v_m)。 这可以通过调用v作为参数的backward来实现。v的大小应该与原始张量的大小相同,我们要进行乘积计算。

inp = torch.eye(5, requires_grad=True)
out = (inp+1).pow(2)
out.backward(torch.ones_like(inp), retain_graph=True)
print("First call\n", inp.grad)
out.backward(torch.ones_like(inp), retain_graph=True)
print("\nSecond call\n", inp.grad)
inp.grad.zero_()
out.backward(torch.ones_like(inp), retain_graph=True)
print("\nCall after zeroing gradients\n", inp.grad)

请注意,当我们第二次以相同的参数调用后向时,梯度的值是不同的。这是因为在进行向后传播时,PyTorch会累积梯度,也就是说,计算出的梯度值会加到计算图的所有叶子节点的梯度属性中。如果你想计算正确的梯度,你需要在计算梯度之前将梯度属性清零。在真实的训练中,优化器可以帮助我们做到这一点。

注意:之前我们在调用backward()函数的时候是不带参数的。这基本上等同于调用backward(torch.tensor(1.0)),这是在标量值函数的情况下计算梯度的有效方法,比如神经网络训练中的损失。

 优化模型参数

训练模型是一个迭代的过程;在每个迭代中(称为epoch),模型对输出进行猜测,计算其猜测的误差(损失),收集误差相对于其参数的导数,并使用梯度下降优化这些参数。

import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets
from torchvision.transforms import ToTensor, Lambdatraining_data = datasets.FashionMNIST(root="data",train=True,download=True,transform=ToTensor()
)test_data = datasets.FashionMNIST(root="data",train=False,download=True,transform=ToTensor()
)train_dataloader = DataLoader(training_data, batch_size=64)
test_dataloader = DataLoader(test_data, batch_size=64)class NeuralNetwork(nn.Module):def __init__(self):super(NeuralNetwork, self).__init__()self.flatten = nn.Flatten()self.linear_relu_stack = nn.Sequential(nn.Linear(28*28, 512),nn.ReLU(),nn.Linear(512, 512),nn.ReLU(),nn.Linear(512, 10),)def forward(self, x):x = self.flatten(x)logits = self.linear_relu_stack(x)return logitsmodel = NeuralNetwork()

超参数

我们为训练定义了以下超参数:

  • epoch数 - 在数据集上迭代的次数
  • 批量大小--在更新参数之前,通过网络传播的数据样本的数量。
  • 学习率--在每个批次epoch更新模型参数的程度。较小的值产生缓慢的学习速度,而较大的值可能会导致训练期间的不可预测的行为。
learning_rate = 1e-3
batch_size = 64
epochs = 5

优化循环的每一次迭代被称为一个epoch。
训练loop--在训练数据集上迭代,试图收敛到最佳参数。
验证/测试循环--迭代测试数据集,以检查模型性能是否在提高。

损失函数
    nn.MSELoss(均方误差)
    nn.NLLLoss(负对数似然)
    nn.LogSoftmax
    nn.CrossEntropyLoss

优化器

优化是在每个训练步骤中调整模型参数以减少模型误差的过程。
所有的优化逻辑都被封装在优化器对象中。SGD优化器;Adam和RMSProp,它们对不同类型的模型和数据有更好的效果。

调用optimizer.zero_grad()来重置模型参数的梯度。梯度默认为累加;为了防止重复计算,我们在每次迭代中明确地将其归零。
通过调用loss.backwards()对预测损失进行反向传播。PyTorch将损失的梯度与每个参数联系在一起。
一旦我们有了梯度,我们就可以调用optimizer.step()来根据向后传递中收集的梯度调整参数。

# Initialize the loss function
loss_fn = nn.CrossEntropyLoss()optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)

执行

def train_loop(dataloader, model, loss_fn, optimizer):size = len(dataloader.dataset)for batch, (X, y) in enumerate(dataloader):# Compute prediction and losspred = model(X)loss = loss_fn(pred, y)# Backpropagationoptimizer.zero_grad()loss.backward()optimizer.step()if batch % 100 == 0:loss, current = loss.item(), batch * len(X)print(f"loss: {loss:>7f}  [{current:>5d}/{size:>5d}]")def test_loop(dataloader, model, loss_fn):size = len(dataloader.dataset)num_batches = len(dataloader)test_loss, correct = 0, 0with torch.no_grad():for X, y in dataloader:pred = model(X)test_loss += loss_fn(pred, y).item()correct += (pred.argmax(1) == y).type(torch.float).sum().item()test_loss /= num_batchescorrect /= sizeprint(f"Test Error: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)epochs = 10
for t in range(epochs):print(f"Epoch {t+1}\n-------------------------------")train_loop(train_dataloader, model, loss_fn, optimizer)test_loop(test_dataloader, model, loss_fn)
print("Done!")

 保存于载入模型

保存、加载模型权重

import torch
import torch.onnx as onnx
import torchvision.models as models# 保存和载入模型的权重
model = models.vgg16(pretrained=True)
torch.save(model.state_dict(), 'model_weights.pth')# 加载模型的权重,你需要先创建一个相同模型的实例,然后用load_state_dict()方法加载参数。
model = models.vgg16() # we do not specify pretrained=True, i.e. do not load default weights
model.load_state_dict(torch.load('model_weights.pth'))
model.eval()

保存加载模型形状

在加载模型权重时,我们需要先将模型类实例化,因为该类定义了网络的结构。我们可能想把这个类的结构和模型一起保存,在这种情况下,我们可以把模型(而不是model.state_dict())传给保存函数。

torch.save(model, 'model.pth')model = torch.load('model.pth')

将模型导出为ONNX

PyTorch也有内置的ONNX导出支持。然而,由于PyTorch执行图的动态性质,导出过程必须遍历执行图以产生持久的ONNX模型。出于这个原因,应该向导出程序传递一个适当大小的测试变量(在我们的例子中,将创建一个正确形状且值为零的tensor)。

input_image = torch.zeros((1,3,224,224))
onnx.export(model, input_image, 'model.onnx')

后续记录强化学习与深度强化学习的pytorch使用


http://chatgpt.dhexx.cn/article/EOM2ixnH.shtml

相关文章

pytorch怎么下载?pytorch在哪里下载?

PyTorch是一个基于Torch的Python开源机器学习库&#xff0c;许多同学表示不知道怎么下载&#xff0c;或者是下载的非常慢&#xff0c;今天来教大家怎么下载PyTorch。 pytorch在哪里下载&#xff1f; 官方下载地址&#xff1a;https://pytorch.org/ PyTorch选择稳定版本&#…

PyTorch中文版官方教程来啦(附下载)

PyTorch 中文版官方教程来了。 PyTorch 是近期最为火爆的深度学习框架之一&#xff0c;然而其中文版官方教程久久不来。近日&#xff0c;一款完整的 PyTorch 中文版官方教程出炉&#xff0c;读者朋友从中可以更好的学习了解 PyTorch 的相关细节了。教程作者来自 pytorchchina.c…

pytorch官方文档(中文版)

https://pytorch123.com/ 教程介绍 PyTorch是一个基于Torch的Python开源机器学习库&#xff0c;用于自然语言处理等应用程序。它主要由Facebookd的人工智能小组开发&#xff0c;不仅能够 实现强大的GPU加速&#xff0c;同时还支持动态神经网络&#xff0c;这一点是现在很多主流…

pytorch 下载安装全流程详细教程

强烈推荐&#xff0c;亲测有效&#xff0c; 1.查看cuda版本 在命令行输入如下代码&#xff1a; nvidia-smi可以看出&#xff0c;我cuda的版本是11.0 2.在官网https://pytorch.org/选择对应的版本 https://pytorch.org/3.复制Run this Command&#xff0c;直接下载安装&…

Pytorch(一) Pytorch 的安装

安装步骤 1.检查是否有合适的GPU, 若有安装Cuda与CuDNN 2.下载pytorch安装文件&#xff0c;进行pytorch的安装 检查电脑是否有合适的GPU 在桌面上右击如果能找到NVIDA控制面板&#xff0c;则说明该电脑有GPU。控制面板如下&#xff0c;并通过查看系统信息获取支持的Cuda版本…

【最新】CUDA Toolkit版本及可用PyTorch对应关系(参考官网)

作者其他相关文章&#xff1a;Pytorch环境详细安装教程【Win10CUDA升级11.6cudNNAnaconda3虚拟环境pycharm】 官网&#xff1a;https://pytorch.org/get-started/previous-versions/ CUDA Toolkit版本及可用PyTorch对应关系总结&#xff08;参考官网&#xff09; CUDAToolkit…

安装PyTorch详细过程

安装PyTorch过程 安装anaconda环境管理PyTorch安装检验安装 安装anaconda 登录anaconda的官网下载&#xff0c;anaconda是一个集成的工具软件不需要我们再次下载。anaconda官网 点击下载 跳转到这个页面如果你的Python版本正好是3.8版&#xff0c;那便可以直接根据系统去选择自…

安装pytorch的过程及所见问题

1、安装anaconda 点击前往anaconda官网&#xff1a;www.anaconda.com 提示&#xff1a;建议下载最新版本的anaconda&#xff0c;不然容易出现如下报错&#xff1a;CondaError: Cannot link a source that does not exist. C:\Anaconda3\Scripts\conda.exe&#xff0c;之后可能…

pytorch与cuda版本匹配--最新(pytorch官网)

gpu驱动,cuda,cudnn安装传送门(温馨提示:请自行配置自己显卡型号及操作系统,该安装方式仅供参考): Centos7 安装GPU驱动&#xff08;rpm包方式安装&#xff09; ubuntu16.04 安装GPU驱动(最新&#xff0c;亲测有效) Centos7 安装GPU驱动&#xff0c;降级CUDA,CUDNN 最新版:pyt…

腾讯地图标注_怎样在导航地图上标注公司名和位置

企业怎样在腾讯地图标明公司名字和位置。很多人都必须在腾讯地图标明企业的位置&#xff0c;主要是为了方便客户在搜索公司位置的时候便于导航所在地。 为了更好地提升腾讯地图的成功率和利用率&#xff0c;我这里给大家做一个简单的申请案例&#xff0c;如果你不知道需要准备什…

百度地图JavaScript API 学习之创建标注

在地图上绘制之创建标注 官方demo示例和讲解——直戳这里 简介 所有叠加或覆盖到地图的内容&#xff0c;我们统称为地图覆盖物。覆盖物拥有自己的地理坐标&#xff0c;当拖动或缩放地图时&#xff0c;它们会相应的移动。覆盖物主要分为&#xff1a;标注&#xff08;点标注、…

百度地图API 自定义标注图标

通过Icon类可实现自定义标注的图标&#xff0c;下面示例通过参数MarkerOptions的icon属性进行设置&#xff0c; 也可以使用marker.setIcon()方法。 <script type"text/javascript">// 百度地图API功能var map new BMap.Map("allmap"); // 创建…

腾讯地图标注_在腾讯地图上标注店铺,只需要简单几步就搞定

第一步&#xff0c;打开腾讯地图&#xff0c;进入页面如下图 第二步&#xff0c;右上角有个“上报”栏&#xff0c;点击进入&#xff0c;页面如下 第三步&#xff0c;右下角有个“新增”栏&#xff0c;点击出现下图 第四步&#xff0c;点击新增地点&#xff0c;进入页面如下图 …

百度地图API 实现地图多点标注

1.MySQL设计 2.java RequiresPermissions("system:lmonitor:list")PostMapping("/list")ResponseBodypublic TableDataInfo list(LstMonitor lstMonitor){startPage();List<LstMonitor> list lstMonitorService.selectLstMonitorList(lstMonitor);…

给地图添加标注

大家好&#xff1a; 最近在纠结如何动态获取经纬度&#xff0c;一直未有头绪&#xff0c;心情纠结啊&#xff01; 先把之前练习过的给地图添加标注来为大家展示一下&#xff0c;顺便记录一下&#xff01; 静态页面代码&#xff1a; <span style"font-size:14px;&quo…

高德地图 点标注

代码示例 <script src"http://webapi.amap.com/js/marker.js"></script><script type"text/javascript" src"http://webapi.amap.com/maps?v1.3&key你的key"></script><script type"text/javascript"…

cesium mars3d天地图标注置顶

如图所示&#xff0c;文字跟道路在影像文件顶部 1. cesium三维&#xff1a; 必须得重新添加一下标注文件&#xff0c;并设置属性 天地图标注&#xff1a; var tileLayer new mars3d.layer.TdtLayer({name: "天地图影像注记",layer: "img_z",key: mars3d…

地图标注中心

地图标注中心常用的有百度地图、腾讯地图、高德地图和微信地图&#xff0c;滴滴地图和美团地图在各自领域发挥作用。 标注介绍&#xff1a; 填写好商户基本信息后&#xff0c;待5-7个工作日审核通过后即可完成标注&#xff0c;商户信息在底图上以 气泡形式展示&#xff0c;提交…

百度地图加载海量标注性能优化策略

在上一篇博客中关于Vue表单验证的话题里,我提到了这段时间在做的城市配载功能,这个功能主要着眼于,如何为客户提供一条路线最优、时效最短、装载率最高的路线。事实上,这是目前物流运输行业智能化、专业化的一个趋势,即面向特定行业的局部最优解问题,简单来说,怎么样能在…

openlayers地图实现地点标注

出现的问题是:我每次添加标注后删除,确实删除了,但是当我再次添加不同的标注时,第一次删除的标注再次一块和第二次的标注同时显示在地图上。 后来发现是iconFeature不能设置全局变量,我设置它为全局变量就会有这个问题,而且点集合(数组)如果设置的是全局变量,删除时也…