Pytorch进阶教学——训练一个图像分类模型(GPU)
目录
1、前言
2、数据集介绍
3、获取数据
4、创建网络
5、训练模型
6、测试模型
6.1、测试整个模型准确率
6.2、测试单张图片
1、前言
- 编写一个可以分类蚂蚁和蜜蜂图片的模型,使用数据集对卷积神经网络进行训练。训练后的模型可以对蚂蚁或蜜蜂的图片进行检测。
- 使用anaconda新建一个虚拟环境,安装好pytorch。后续缺什么包就安装什么包即可。
- 使用pycharm新建一个项目,配置好环境。
2、数据集介绍
- 使用的数据集为蚂蚁和蜜蜂的图片,分为训练集和测试集。
- 【注】数据集下载地址。
3、获取数据
- 代码中获取数据集使用的是txt文件,所以首先需要提取全部图片的地址和标签放入txt文件中。
- 下述代码为python提取全部图片地址和标签导出为txt文件的脚本。(自行修改)
-
import os # 导入os模块,用于操作文件路径等操作系统相关功能。def get_file_name(file_path, output_file, type): # 绝对路径path_list = os.listdir(file_path) # 列出指定路径下的所有文件和文件夹,并将结果存储在path_list中with open(output_file, 'a') as file:for filename in path_list:all_file_path = os.path.join(file_path, filename) # 拼接路径file.write(all_file_path + ' ' + type + '\n')if __name__ == '__main__':ants_file_path = r"D:\BaiduNetdiskWorkspace\PyTorch\image_recognition\hymenoptera_data\train\ants"bees_file_path = r"D:\BaiduNetdiskWorkspace\PyTorch\image_recognition\hymenoptera_data\train\bees"output_file = r"D:\BaiduNetdiskWorkspace\PyTorch\image_recognition\hymenoptera_data\train.txt"get_file_name(ants_file_path, output_file, 'ants')get_file_name(bees_file_path, output_file, 'bees') -

-
- 将全部地址修改为相对地址。
- 使用替换操作实现。例如:
- 使用替换操作实现。例如:
- 最后txt文件的内容如下:
- 新建一个dataset.py文件。
-
# 读取数据 import torch import torchvision.transforms as transforms from PIL import Image# 读取数据类 class MyDataset(torch.utils.data.Dataset): # 继承构建自定义数据集的基类def __init__(self, datatxt, datatransform):datas = open(datatxt, 'r').readlines() # 按行读取,每行包含图像路径和标签self.images = []self.labels = []self.transform = datatransformfor data in datas:item = data.strip().split(' ') # 去除首尾空格并按空格分割# 分别将图像路径和标签添加到self.images和self.labels列表中self.images.append(item[0]) # 路径self.labels.append(item[1]) # 标签returndef __len__(self):return len(self.images)# 获取数据集中的一个样本。接收一个索引item,根据索引获取对应的图像路径和标签def __getitem__(self, item):imagepath, label = self.images[item], self.labels[item]image = Image.open(imagepath) # 打开图片return self.transform(image), label # 返回转换后的图像和对应的标签# 用于测试 if __name__ == '__main__':# 利用txt文件读取图片信息,txt文件包括图片路径和标签traintxt = './hymenoptera_data/train.txt'valtxt = './hymenoptera_data/val.txt'# 图片转换形式traindata_transfomer = transforms.Compose([transforms.ToTensor(), # 转为Tensor格式transforms.Resize(60), # 调整图像大小,调整为高度或宽度为60像素,另一边按比例调整transforms.RandomCrop(48), # 裁剪图片,随机裁剪成高度和宽度均为48像素的部分transforms.RandomHorizontalFlip(), # 随机水平翻转transforms.RandomRotation(10), # 随机旋转transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) # 对图像进行归一化处理。对每个通道执行了均值为0.5、标准差为0.5的归一化操作])valdata_transfomer = transforms.Compose([transforms.ToTensor(), # 转为Tensor格transforms.Resize(48), # 调整图像大小,调整为高度或宽度为48像素,另一边按比例调整transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])# 加载数据traindataset = MyDataset(traintxt, traindata_transfomer)valdataset = MyDataset(valtxt, valdata_transfomer)print("测试集:" + str(traindataset.__len__()))print("训练集:" + str(valdataset.__len__()))
-
- 单独运行结果:(只用于测试)
4、创建网络
- 新建一个net.py文件。
- 其中创建了一个简单的三层卷积神经网络。
-
# 三层卷积神经网络 import torch# 卷积神经网络类 class SimpleConv3(torch.nn.Module): # 继承创建神经网络的基类def __init__(self, classes):super(SimpleConv3, self).__init__()# 卷积层self.conv1 = torch.nn.Conv2d(3, 16, 3, 2, 1) # 输入通道3,输出通道16,3*3的卷积核,步长2,边缘填充1self.conv2 = torch.nn.Conv2d(16, 32, 3, 2, 1) # 输入通道16,输出通道32,3*3的卷积核,步长2,边缘填充1self.conv3 = torch.nn.Conv2d(32, 64, 3, 2, 1) # 输入通道32,输出通道64,3*3的卷积核,步长2,边缘填充1# 全连接层self.fc1 = torch.nn.Linear(2304, 100)self.fc2 = torch.nn.Linear(100, classes)def forward(self, x):# 第一次卷积x = torch.nn.functional.relu(self.conv1(x)) # relu为激活函数# 第二次卷积x = torch.nn.functional.relu(self.conv2(x))# 第三次卷积x = torch.nn.functional.relu(self.conv3(x))# 展开成一维向量x = x.view(x.size(0), -1)x = torch.nn.functional.relu(self.fc1(x))x = self.fc2(x)return x# 用于测试 if __name__ == '__main__':inputs = torch.rand((1, 3, 48, 48)) # 生成一个随机的3通道、48x48大小的张量作为输入net = SimpleConv3(2) # 二分类output = net(inputs)print(output)
- 单独运行结果:(只用于测试)
5、训练模型
- 新建一个train.py文件。
- 其中可自行设置的参数都有标出。
-
# 训练模型 import matplotlibmatplotlib.use('TkAgg') import matplotlib.pyplot as plt from dataset import MyDataset from net import SimpleConv3 import torch import torchvision.transforms as transforms from torch.optim import SGD # 优化相关 from torch.optim.lr_scheduler import StepLR # 优化相关 from sklearn import preprocessing # 处理label# 图片转换形式 traindata_transfomer = transforms.Compose([transforms.ToTensor(), # 转为Tensor格式transforms.Resize(60, antialias=True), # 调整图像大小,调整为高度或宽度为60像素,另一边按比例调整,antialias=True启用了抗锯齿功能transforms.RandomCrop(48), # 裁剪图片,随机裁剪成高度和宽度均为48像素的部分transforms.RandomHorizontalFlip(), # 随机水平翻转transforms.RandomRotation(10), # 随机旋转transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) # 对图像进行归一化处理。对每个通道执行了均值为0.5、标准差为0.5的归一化操作 ])if __name__ == '__main__':traintxt = './hymenoptera_data/train.txt'valtxt = './hymenoptera_data/val.txt'# 加载数据traindataset = MyDataset(traintxt, traindata_transfomer)# 创建卷积神经网络net = SimpleConv3(2) # 二分类# 使用GPUdevice = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")net.to(device)# 测试GPU是否能使用# print("The device is gpu later?:", next(net.parameters()).is_cuda)# print("The device is gpu,", next(net.parameters()).device)# 将数据提供给模型使用traindataloader = torch.utils.data.DataLoader(traindataset, batch_size=128, shuffle=True,num_workers=1) # batch_size可以自行调节# 优化器optim = SGD(net.parameters(), lr=0.1, momentum=0.9) # 使用随机梯度下降(SGD)作为优化器,学习率0.1,动量0.9,加速梯度下降过程,lr可自行调节criterion = torch.nn.CrossEntropyLoss() # 使用交叉熵损失作为损失函数lr_step = StepLR(optim, step_size=200, gamma=0.1) # 学习率调度器,动态调整学习率,每200个epoch调整一次,每次调整缩小为原来的0.1倍,step_size可自行调节epochs = 5 # 训练次数accs = []losss = []# 训练循环for epoch in range(0, epochs):batch = 0running_acc = 0.0 # 精度running_loss = 0.0 # 损失for data in traindataloader:batch += 1imputs, labels = data# 将标签从元组转换为tensor类型labels = preprocessing.LabelEncoder().fit_transform(labels)labels = torch.as_tensor(labels)# 利用GPU训练模型imputs = imputs.to(device)labels = labels.to(device)# 将数据输入至网络output = net(imputs)# 计算损失loss = criterion(output, labels)# 平均准确率acc = float(torch.sum(labels == torch.argmax(output, 1))) / len(imputs)# 累加损失和准确率,后面会除以batchrunning_acc += accrunning_loss += loss.data.item()optim.zero_grad() # 清空梯度loss.backward() # 反向传播optim.step() # 更新参数lr_step.step() # 更新优化器的学习率# 一次训练的精度和损失running_acc = running_acc / batchrunning_loss = running_loss / batchaccs.append(running_acc)losss.append(running_loss)print('epoch=' + str(epoch) + ' loss=' + str(running_loss) + ' acc=' + str(running_acc))# 保存模型torch.save(net, 'model.pth') # 保存模型的权重和结构x = torch.randn(1, 3, 48, 48).to(device) # # 生成一个随机的3通道、48x48大小的张量作为输入,新建的张量也要送到GPU中net = torch.load('model.pth') # 从保存的.pth文件中加载模型net.train(False) # 设置模型为推理模式,意味着不会进行梯度计算或反向传播torch.onnx.export(net, x, 'model.onnx') # 使用ONNX格式导出模型# 接受模型net、示例输入x和导出的文件名model.onnx作为参数# 可视化结果fig = plt.figure()plot1, = plt.plot(range(len(accs)), accs) # 创建一个图形对象plot1,绘制accs列表中的数据plot2, = plt.plot(range(len(losss)), losss) # 创建另一个图形对象plot2,绘制losss列表中的数据plt.ylabel('epoch') # 设置y轴的标签为epochplt.legend(handles=[plot1, plot2], labels=['acc', 'loss']) # 创建图例,指定图表中不同曲线的标签plt.show() # 展示所绘制的图表
- 【注】本项目使用的是GPU训练模型。如果GPU可以获得,但是无法使用,可能是pytorch的版本不对,需要重新安装。
- 运行结果:
- 保存后的模型如下:
6、测试模型
6.1、测试整个模型准确率
- 利用测试集,测试整个模型的准确率。
- 新建一个test.py文件。
-
# 测试整个模型的准确率 import torch import torchvision.transforms as transforms from dataset import MyDataset # 您的数据集类 from sklearn import preprocessing # 处理label# 定义测试集的数据转换形式 valdata_transfomer = transforms.Compose([transforms.ToTensor(), # 转为Tensor格式transforms.Resize(60, antialias=True), # 调整图像大小,调整为高度或宽度为60像素,另一边按比例调整,antialias=True启用了抗锯齿功能transforms.CenterCrop(48), # 中心裁剪图片,裁剪成高度和宽度均为48像素的部分transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) # 对图像进行归一化处理。对每个通道执行了均值为0.5、标准差为0.5的归一化操作 ])if __name__ == '__main__':valtxt = './hymenoptera_data/val.txt' # 测试集数据路径# 加载测试集数据valdataset = MyDataset(valtxt, valdata_transfomer)# 加载已训练好的模型,利用GPU进行测试device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")net = torch.load('model.pth').to(device)net.eval() # 将模型设置为评估模式,意味着不会进行梯度计算或反向传播# 使用 DataLoader 加载测试集数据valdataloader = torch.utils.data.DataLoader(valdataset, batch_size=1, shuffle=False)correct = 0 # 被正确预测的样本数total = 0 # 测试样本数# 测试模型with torch.no_grad():for data in valdataloader:images, labels = data# 将标签从元组转换为tensor类型labels = preprocessing.LabelEncoder().fit_transform(labels)labels = torch.as_tensor(labels)# 利用GPU训练模型images, labels = images.to(device), labels.to(device)outputs = net(images) # 输入图像并获取模型预测结果_, predicted = torch.max(outputs.data, 1) # 获取预测值中最大概率的索引total += labels.size(0) # 累计测试样本数量correct += (predicted == labels).sum().item() # 计算正确预测的样本数量# 计算并输出模型在测试集上的准确率accuracy = 100 * correct / totalprint('Test Accuracy: {:.2f}%'.format(accuracy))
-
- 运行结果:

- 因为训练模型时只迭代了200次,所以准确率并不高。可以尝试提高训练次数,提高准确率。
6.2、测试单张图片
- 使用训练后的模型,对单张图片进行预测。
- 新建一个testone.py文件。
-
import torch from PIL import Image import torchvision.transforms as transforms# 定义图片预处理转换 image_transforms = transforms.Compose([transforms.Resize(60, antialias=True), # 调整图像大小transforms.CenterCrop(48), # 中心裁剪transforms.ToTensor(), # 转为Tensor格式transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) # 归一化处理 ])# 定义类别映射字典 class_mapping = {0: "ant",1: "bee" }# 加载已训练好的模型,利用GPU测试 device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") net = torch.load('model.pth').to(device) net.eval() # 将模型设置为评估模式,意味着不会进行梯度计算或反向传播# 加载要测试的图片 image_path = './hymenoptera_data/val/bees/26589803_5ba7000313.jpg' # 图片路径 input_image = Image.open(image_path) # 加载图片 input_tensor = image_transforms(input_image).unsqueeze(0) # 对图片进行预处理转换,并增加 batch 维度# 将输入数据移动到GPU上 input_tensor = input_tensor.to(device)# 使用模型进行预测 with torch.no_grad():output = net(input_tensor)_, predicted = torch.max(output, 1) # 在张量中沿指定维度找到最大值及其对应的索引# 输出预测结果 predicted_class = predicted.item() # 得到预测的标签 predicted_label = class_mapping[predicted_class] # 将标签转换为文字 print(f"The predicted class for the image is: {predicted_label}")
-
- 运行结果:
相关文章:
Pytorch进阶教学——训练一个图像分类模型(GPU)
目录 1、前言 2、数据集介绍 3、获取数据 4、创建网络 5、训练模型 6、测试模型 6.1、测试整个模型准确率 6.2、测试单张图片 1、前言 编写一个可以分类蚂蚁和蜜蜂图片的模型,使用数据集对卷积神经网络进行训练。训练后的模型可以对蚂蚁或蜜蜂的图片进行…...
Docker Swarm总结+CI/CD Devops、gitlab、sonarqube以及harbor的安装集成配置(3/5)
博主介绍:Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 🍅文末获取源码下载地址🍅 👇🏻 精彩专栏推荐订阅👇🏻…...
Linux:windows 和 Linux 之间文本格式转换
背景 在 Windows 上编辑的文件,放到 Linux 平台,有时会出现奇怪的问题,其中有一个是 ^M 引起的,例如这种错误: /bin/bash^M: bad interpreter 这个问题相信大家也碰到过,原因是 Windows 和 Linux 关于换行的…...
VBA技术资料MF88:测试Excel文件名是否有效
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到…...
u8g2图形库——丝滑菜单制作
目录 一、实物效果展示 二、丝滑菜单实现原理 三、代码开源 1.ui_bmp.h 2.ui.h 3.ui.c 一、实物效果展示 u8g2图形库——丝滑菜单制作 二、丝滑菜单实现原理 int ui_run(short *a,short *a_tag,uint8_t step,uint8_t slow_cnt) //UI滑动效果 {uint8_t temp;…...
Go 异常处理流程
在 Go 语言中,panic、recover 和 defer 是用于处理异常情况的关键字。它们通常一起使用来实现对程序错误的处理和恢复。 1. defer 语句 defer 用于在函数返回之前执行一段代码。被 defer 修饰的语句或函数会在包含 defer 的函数执行完毕后执行。defer 常用于资源清…...
ubuntu20.04安装tensorRT流程梳理
目标:先跑demo,再学习源码 step1, 提前准备好CUDA环境 安装CUDA,cuDNN 注意,CUDA,cuDNN需要去官网下载.run和tar文件安装,否则在下面step4 make命令会报找不到cuda等的错误,具体安装教程网上…...
数字孪生技术:提升UI交互性与个性化设计
随着数字化时代的到来,数字孪生技术正在逐渐改变我们的生活和工作方式。数字孪生是一种复制现实世界系统或实体的技术,通过创建数字模型来模拟现实世界中的各种行为和事件。这种技术不仅为人们提供了一个全新的视角来看待和解决问题,同时也为…...
外包干了5个月,技术退步明显.......
先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…...
嵌入式常见的几种接口
嵌入式开发中,常见的外设通信接口/协议有SPI,I2C,UART三种,本文先分三个部分对SPI,I2C,UART进行介绍,最后对这三种协议进行比较。 1 SPI 1.1 SPI的简介 SPI(Serial Peripheral …...
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(七)
分页查询、删除和修改菜品 1. 菜品分页查询1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计 1.2 代码开发1.2.1 设计DTO类1.2.2 设计VO类1.2.3 Controller层1.2.4 Service层接口1.2.5 Service层实现类1.2.6 Mapper层 1.3 功能测试1.3.2 前后端联调测试 2. 删除菜品2.1 需求分析…...
Grafana采用Nginx反向代理,部分功能报错‘Origin not allowed’ behind proxy
只有部分功能会有这个提示,比如修改密码啥的,网上找了下,官方找到了答案:https://community.grafana.com/t/after-update-to-8-3-5-origin-not-allowed-behind-proxy/60598 有个回复是这样的: tl:dr: try adding prox…...
请大数据把奥威BI分析工具推给每一个财务!
这个财务指标怎么算?那些数据什么时候能拿到?看完报表,发现某部门上个月的支出涨幅过大,想了解原因怎么办?……财务人,你是不是每个月都把时间消耗在这些事情上了?那你可得快接住这个BI大数据分…...
知乎禁止转载的回答怎么复制做笔记?
问题 对于“禁止转载”的回答,右键复制是不行的,ctrl-c也不行,粘贴之后都是当前回答的标题。稍微看了代码,应该是对copy事件进行了处理。不过这样真的有用吗,真是防君子不防小人,只是给收集资料增加了许多…...
pta找鞍点—C语言
7-13 找鞍点 分数 300 全屏浏览题目 切换布局 作者 C课程组 单位 浙江大学 一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。 本题要求编写程序,求一个给定的n阶方阵的鞍点。 输入格式: 输入第一行给出一个正整数n(1…...
编程零基础算法 | 四、循环和选择结构——1572. 矩阵对角线元素的和
一、题目链接 1572. 矩阵对角线元素的和 二、题目简介 给你两个整数,n 和 start 。 数组 nums 定义为:nums[i] start 2*i(下标从 0 开始)且 n nums.length 。 请返回 nums 中所有元素按位异或(XOR)后…...
ubantu配置网卡ip
1.ifconfig查看网卡 2. vi /etc/network/interfaces auto ens33 # 网卡名 iface ens33 inet static # 注意网卡名 address 192.168.43.10 # 配置ip地址 netmask 255.255.255.0 # 掩码 gateway 192.168.43.1 # 网关 3.重启网卡 ifconfig ens33 down ifco…...
增加F110 付款方式的乱记录
随便记录一下,基本上有这些信息可以了 为了保持PRD与测试机一致的银行代码,需要先在DEV,QAS 改成4 外部给号 主要都是在FBZP 开户行维护-FI12_HBANK/FI12 S4hana 里面有的没有办法在FI12 维护只能去NWBC NWBC:维护银行账户并关联…...
软件系统安全漏洞检测应该怎么做?靠谱的软件安全检测公司推荐
软件系统安全漏洞检测是指通过对软件系统进行全面的、系统化的评估,发现和解决其中可能存在的安全漏洞和隐患。这些安全漏洞可能会被不法分子利用,引发数据泄露、系统瘫痪、信息被篡改等安全问题,给企业造成严重的经济和声誉损失。那么软件系…...
单片机学习12——电容
电容的作用: 1)降压作用: 容抗: Xc 1/2fc 串联分压原理。2100Ω的容量,50Hz的频率,可以得到1.5uF。断电之后,需要串联一个1MΩ的电阻放电。 那是不是可以使用2100欧姆的电阻来代替电容呢&am…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...












