基于Amazon S3 Express One Zone和Amazon SageMaker的图像分类模型实战—深析新旧产品突显Express One Zone在性能上的优势

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在亚马逊云科技开发者社区, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道。

目录

🚀一.亚马逊云科技2023 re:Invent全球大会

🔎1.1 Amazon S3 Express One Zone-面向性能关键型应用程序的超高速云对象存储 

🔎1.2 Amazon SageMaker

🚀二.基于Amazon S3 Express One Zone和Amazon SageMaker的图像分类实战—以猫狗识别模型为例

🔎2.1 项目背景

🔎2.2 模型必备

🦋2.3 Amazon S3 Express One Zone 创建和配置

🦋2.4 Amazon S3 Express One Zone 存储模型数据

🦋2.4 Amazon SageMaker部署创建

🦋2.5 图像分类代码撰写训练模型部署

🦋2.6 图像分类代码撰写测试模型部署

🦋2.7 采用标准版S3和S3 Express One Zone分别测试对比实验

🚀三.总结与心得

🔎3.1 心得-测评有感

🔎3.2  总结

🚀附录


🚀一.亚马逊云科技2023 re:Invent全球大会

        随着数据的快速增长,高效、可靠的云存储解决方案变得越来越重要。在这个背景下,亚马逊云科技推出的Amazon S3 Express One Zone提供了全新的存储体验,它不仅具备了极高的速度,而且具有强大的安全性,为用户的数据存储和管理带来了革命性的改变。

        各位读者大家好,我是一见已难忘,在本次大会中,亚马逊云科技发布 Amazon S3 Express One Zone-面向性能关键型应用程序的超高速云对象存储 。

        今天在Amazon S3 Express One Zone官网看到推荐使用Amazon S3 Express One Zone搭配Amazon SageMaker 模型训练的使用思路,那今天我们就来深度体验探索一下基于Amazon S3 Express One Zone和Amazon SageMaker的图像分类实战—以猫狗识别模型为例,并且探索项目采用Amazon S3标准版与Amazon S3 Express One Zone的差距~

🔎1.1 Amazon S3 Express One Zone-面向性能关键型应用程序的超高速云对象存储 

        Amazon S3 Express One Zone 是一款专注于高性能的单可用区存储服务,为经常访问的数据和对延迟敏感的应用程序提供可靠的毫秒级数据访问性能。

相较于S3 Standard,S3 Express One Zone 提供了10倍的数据访问速度提升和50%的请求成本降低,同时具备灵活的扩展性,支持处理每分钟数百万个请求的需求。可以选择将存储与计算资源放置在同一可用区,以进一步优化性能,降低计算成本,提高工作负载的运行速度。

可以将 S3 Express One Zone 与Amazon SageMaker 模型训练 、Amazon AthenaAmazon EMR 和 Glue Data Catalog 等服务结合使用,从而加速机器学习和分析工作负载。

Amazon S3 Express One Zone工作原理图:

Amazon S3 Express One Zone官网:

高性能存储 – S3 Express One Zone

🔎1.1.1 与传统标准版Amazon S3相比

        Amazon S3 Express One Zone与Amazon S3相比,特点主要表现在性能和延迟方面。S3 Express One Zone具有持续的极低延迟,最多可以达到标准版S3的十倍性能,每秒能够处理数十万次请求,并始终保持几毫秒的延迟。

        它主要面向延迟敏感型工作负载,比如金融交易分析、实时广告推荐、欺诈检测、机器学习训练等场景。对于这些场景经常需要在短时间内发起数百万次的数据访问,并且延迟要求还很高,S3 Express One Zone可以协助显著缩短数据密集型应用程序的运行时间。

        另外,S3 Express One Zone可以处理任何规模的对象,但对于较小的对象来说尤其作用明显。这是因为对于较小的对象,第一个字节的处理时间与最后一个字节的处理时间非常接近。在所有存储系统中,较大的对象需要更长的时间进行流式处理,因为在传输过程中需要下载更多的数据,并且因此存储延迟对对象读取总时间的影响较小。

        与大型对象相比,较小的对象可以从较低的存储延迟中获得巨大的优势。由于S3 Express One Zone具有持续的极低延迟,因此与Amazon S3相比,读取小型对象的速度最多可以提升10倍。

🔎1.2 Amazon SageMaker

        Amazon SageMaker是亚马逊云科技提供的一项机器学习(ML)服务。它旨在帮助开发人员和数据科学家轻松构建、训练和部署机器学习模型。SageMaker提供了一个端到端的机器学习平台,涵盖了从数据准备和模型训练到模型部署和推理的整个机器学习工作流程。

Amazon SageMaker 官网:Amazon SageMaker 机器学习_机器学习模型构建训练部署-亚马逊云科技云服务

🚀二.基于Amazon S3 Express One Zone和Amazon SageMaker的图像分类实战—以猫狗识别模型为例

🔎2.1 项目背景

        随着数据规模的迅速增长,图像分类在许多领域都发挥着重要作用。在这个项目中,我们将利用亚马逊云科技的两项关键服务,Amazon S3 Express One Zone和Amazon SageMaker,来构建一个猫狗图像分类模型。这个项目旨在展示如何利用高性能的云对象存储服务和机器学习平台,快速而有效地构建和训练一个图像分类模型。

🔎2.2 模型必备

开始项目时请准备:

  1. 准备亚马逊云科技账号,开通本文所需功能权限。
  2. 超大数据集(包含训练集25000张,测试集图片12500张)。
  3. 本文所需的模型代码、依赖环境等。

🦋2.3 Amazon S3 Express One Zone 创建和配置

        亚马逊云科技推出的Amazon S3 Express One Zone提供了前所未有的存储体验,它凭借极高的速度、强大的安全性、高可用性和可扩展性,为用户的数据存储和管理带来了革新,它的创建和配置也算相当的方便快捷,如果有使用Amazon S3标准版的经验几乎不会遇到什么困难。

在进行Amazon S3 Express One Zone的创建和配置之前,需要先登录亚马逊云科技的账号,到控制台搜索S3,点击进入。如下图:

1.创建一个存储桶。如下图:

说明:使用 S3,无需支付最低费用。只需为使用的内容付费。

2.填写需要的配置信息,如下图,需要注意的是要选择右边的目录存储桶,这个就是我们需要的Amazon S3 Express One Zone。

我的存储桶名称叫:dog-and-cat。加上后缀全称为:dog-and-cat--use1-az4--x-s3。

推荐用于低延迟应用场景。这些存储桶仅使用 S3 Express One Zone 存储类,可在单个可用区内更快地处理数据。

3.创建完成会有以下提示,我们还可以在Amazon S3的存储桶中点击目录存储桶,即可看到我们刚刚创建的。

4.配置存储桶策略

如果在后续的操作中遇到权限等问题,我这里也是亲自操作给到了解决方案:

在“存储桶策略”部分,可以添加一个新的策略或编辑现有策略。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::your-bucket-name/*"
    }
  ]
}

your-bucket-name 替换为存储桶名称。

或者使用亚马逊云科技 CLI 设置存储桶策略:

aws s3api put-bucket-policy --bucket your-bucket-name --policy '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":"*","Action":"s3:GetObject","Resource":"arn:aws:s3:::your-bucket-name/*"}]}'

本节心得:

        Amazon S3 Express One Zone的创建和配置相当便捷,特别是对于那些已经有Amazon S3标准版经验的用户。文档提供了一个详细而清晰的步骤指南,使用户能够快速而顺利地创建和配置Amazon S3 Express One Zone存储桶。

这种平滑的过渡使用户能够更轻松地迁移到更高性能的存储解决方案。

🦋2.4 Amazon S3 Express One Zone 存储模型数据

        完成上面配置之后,我们就可以存储我们本次训练模型的数据了。上传的方式也有很多种,我们可以上传压缩包,也可以直接上传文件夹,也可以使用亚马逊云科技的一些根据上传等等。

如下图是我上传的一批图片数据集,本批上传2205张。本项目完整超大数据集(包含训练集25000张,测试集图片12500张)

目录结构如下:

本节心得:

  1. 亚马逊云科技有多种上传数据的方式,包括上传压缩包、直接上传文件夹、亚马逊云科技的上传工具包以及利用提供的其他的第三方工具等等,十分便捷。
  2. 存储在Amazon S3 Express One Zone中的数据集的组织方式。这对于用户在后续操作中能够更容易地定位和管理他们的数据集是很有帮助的。

🦋2.4 Amazon SageMaker部署创建

Amazon SageMaker创建模型的创建也是十分的方便快捷。

1.我们首先到控制台搜索 Amazon SageMaker点击进入,创建笔记本实例:

2.我的实例名称叫dog-and-cat,与我的主题贴合。需要注意的一点就是在角色那块,需要设置我们的特定存储桶“dog-and-cat--use1-az4--x-s3 ”。创建实例后(等待5-10min左右)就可以点击打开Jupyter了。

3.在Jupyter中点击我们的conda_python3创建一个文件就可以开始写我们的模型代码了。

心得总结:

  1. Amazon SageMaker的创建模型过程开始于控制台,通过搜索和点击的方式即可轻松进入。这种直观的导航使得用户能够快速找到并启动他们所需的操作,提高了整个使用体验。
  2. 笔记本实例创建完成,等待5-10分钟后就可以点击打开Jupyter了。这个步骤的迅速完成使用户能够尽快进入模型代码的编写阶段,提高了整体工作效率。
  3. 文在Jupyter中可以通过点击conda_python3创建文件开始编写模型代码。这种集成的环境简化了模型开发的流程,用户无需额外配置环境,直接在熟悉的Jupyter界面中进行代码编写。

🦋2.5 图像分类代码撰写训练模型部署

1.我们的图像分类代码撰写部署环节就更多的考验我们人工智能领域的相关技术。首先我们需要检查一下jupyter里有没有缺什么模块包,我们提前对其进行一个安装。

pip install tensorflow

2.设置目标存储桶:本模型训练会频繁的读取 Amazon S3 Express One Zone 里的数据,我们需要先设定S3 存储桶。

import sagemaker
sess = sagemaker.Session()
bucket = "dog-and-cat--use1-az4--x-s3"
sess = sagemaker.Session(
    default_bucket = bucket
)
# 打印默认的 S3 存储桶名称
print(f"Default S3 bucket: {bucket}")

4.要从Amazon S3存储桶中读取文件,可以使用boto3库,这是SDK for Python。

import boto3
from botocore.exceptions import NoCredentialsError
# 替换为你的亚马逊云科技访问密钥ID和秘密访问密钥
aws_access_key_id = 'your_access_key_id'
aws_secret_access_key = 'your_secret_access_key'
bucket_name = 'dog-and-cat--use1-az4--x-s3'
file_key = data/training'
s3 = boto3.client('s3', aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key)
try:
    s3.download_file(bucket_name, file_key, 'local_file.jpg')
    print(f'Successfully downloaded file from S3 to local_file.jpg')
except NoCredentialsError:
    print('Credentials not available')

5.训练模型代码较长,这里说一下核心代码块:

将本地文件(在这里特指训练集数据和日志文件)上传到Amazon S3 存储桶中,以便在云环境中进行存储和后续处理。

# 创建S3客户端
s3 = boto3.client('s3', aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key)

def upload_to_s3(local_path, bucket, s3_path):
    for root, dirs, files in os.walk(local_path):
        for file in files:
            local_file_path = os.path.join(root, file)
            s3_file_path = os.path.join(s3_path, local_file_path[len(local_path):])
            try:
                # 上传文件到S3
                s3.upload_file(local_file_path, bucket, s3_file_path)
                print(f'Successfully uploaded {local_file_path} to {s3_file_path}')
            except NoCredentialsError:
                print('Credentials not available')

# 上传训练集数据到S3
upload_to_s3(train_dir, bucket_name, 'data/train/')

# 上传日志到S3
upload_to_s3(logs_train_dir, bucket_name, 'log/')

6.如果想要达到最好的效果MAX_STEP = 2000  应该为20000,但是由于训练时间太长原因,现在设置为 2000。

在经历的一段时间后的训练模型结果:

本节心得:

  1. 通过SageMaker Session对象和Boto3库,设置了用于存储训练数据和模型的S3存储桶。这是在云环境中进行训练所必需的步骤。
  2. 为了在云环境中进行训练,需要将本地文件上传至S3存储桶。通过自定义的upload_to_s3函数实现了这一步骤,涉及训练集数据和日志文件的上传。

🦋2.6 图像分类代码撰写测试模型部署

        测试模型和上文的训练模型都使用S3 Express One Zone里的图像数据,测试集图片12500张。连接S3 Express One Zone和存取的代码相同,这里列举部分核心代码以及模型测试结果。

test_img = input_data.get_files(test_dir)[0]   # 获取测试集的图片路径列表
    image_array = get_one_image(test_img)          # 从测试集中随机选取一张图片
    # 将这个图设置为默认图,会话设置成默认对话,这样在with语句外面也能使用这个会话执行。
    with tf.Graph().as_default():   
        BATCH_SIZE = 1               # 这里我们要输入的是一张图(预测这张随机图)
        N_CLASSES = 2                # 还是二分类(猫或狗)

        image = tf.cast(image_array, tf.float32)                    # 将列表转换成tf能够识别的格式
        image = tf.image.per_image_standardization(image)           # 图片标准化处理
        image = tf.reshape(image, [1, 208, 208, 3])                 # 改变图片的形状
        logit = model.cnn_inference(image, BATCH_SIZE, N_CLASSES)   # 得到神经网络输出层的预测结果
        logit = tf.nn.softmax(logit)                                # 进行归一化处理(使得预测概率之和为1)

        x = tf.placeholder(tf.float32, shape=[208, 208, 3])         # x变量用于占位,输入的数据要满足这里定的shape

        # 修改成自己训练好的模型路径
        logs_train_dir = 'log/'

        saver = tf.train.Saver()

        with tf.Session() as sess:
            print("从指定路径中加载模型...")
            ckpt = tf.train.get_checkpoint_state(logs_train_dir)   # 读取路径下的checkpoint
            # 载入模型,不需要提供模型的名字,会通过 checkpoint 文件定位到最新保存的模型
            if ckpt and ckpt.model_checkpoint_path:                # checkpoint存在且其存放的变量不为空
                global_step = ckpt.model_checkpoint_path.split('/')[-1].split('-')[-1]   # 通过切割获取ckpt变量中的步长
                saver.restore(sess, ckpt.model_checkpoint_path)    # 当前会话中,恢复该路径下模型的所有参数(即调用训练好的模型)
                print('模型加载成功, 训练的步数为: %s' % global_step)
            else:
                print('模型加载失败,checkpoint文件没找到!')

            # 通过saver.restore()恢复了训练模型的参数(即:神经网络中的权重值),这样logit才能得到想要的预测结果
            # 执行sess.run()才能运行,并返回结果数据
            prediction = sess.run(logit, feed_dict={x: image_array})   # 输入随机抽取的那张图片数据,得到预测值
            max_index = np.argmax(prediction)                          # 获取输出结果中最大概率的索引(下标)
            if max_index == 0:
                pre = prediction[:, 0][0] * 100
                print('图片是猫的概率为: {:.2f}%'.format(pre))       # 下标为0,则为猫,并打印是猫的概率
            else:
                pre = prediction[:, 1][0] * 100
                print('图片是狗的概率为: {:.2f}%'.format(pre))       # 下标为1,则为狗,并打印是狗的概率

    plt.imshow(image_array)                                        # 接受图片并处理
    plt.show()                                                     # 显示图片

训练结果:

这是在训练为步数的情况下的测试结果,基本满足了我们的模型要求,当然模型也有很大的改进空间。

本节心得:

        使用了S3 Express One Zone中的图像数据进行模型测试,测试集包含12500张图片。与训练模型阶段相似,通过Boto3库连接S3 Express One Zone并获取测试集的图片路径列表。

🦋2.7 采用标准版S3和S3 Express One Zone分别测试对比实验

        为了S3 Express One Zone对比传统的S3标准版的性能提升差距,我特意使用了3个亚马逊账号来分别跑模型,测算他的训练时间差距,操作过程如上文。

        以下是我用3个账号跑了2天多的时间记录(因中间账号权限原因有的操作耽误了些时间,可能有一些时间记录误差,但依然有参考意义)AmazonS3标准版和Amazon S3 Express One Zone为本次实验的唯一变量,其他的环境和代码均相同。

训练集大小

采用S3 训练时间

采用Amazon S3 Express One Zone 训练时间

2000 张

1.7小时

1.5 小时

5000 张

5.3 小时

4.2 小时

10000 张

8.9 小时

6.5 小时

20000 张

14.3 小时

12.7 小时

将数据进行可视化,我们可以直观的看到采用S3 Express One Zone 的训练时间要低于标准版S3的训练时间。

数据分析:

训练时间减少百分比=[(采用S3 训练时间−采用Amazon S3 Express One Zone 训练时间) /采用S3 训练时间]×100

  • 对于 2000 张训练集,训练时间减少了约 11.8%。
  • 对于 5000 张训练集,训练时间减少了约 20.8%。
  • 对于 10000 张训练集,训练时间减少了约 4.5%。
  • 对于 20000 张训练集,训练时间减少了约 11.2%。

        可以看到除10000张下降幅度较小,其他均在10~20左右,10000张可以受到了其他因素干扰,但在宏观可以看到采用Amazon S3 Express One Zone 训练时间下降是明显的。

我在查阅了一些资料后,对这个结果有了一定的理解。照成这个结果的原因有下(一定程度上也受其他的影响,但整体来看还是可以表现出Amazon S3 Express One Zone的特点)。

  1. Amazon S3 Express One Zone提供了极低的延迟和比S3 Standard存储类低50%的请求成本,这意味着Spot和按需计算资源可以更高效地使用,并且可以更早关闭。
  2. 由于其延迟极低,因此对于需要快速访问和处理大量数据的大语言模型和其他基础模型训练任务来说,S3 Express One Zone可以提供极佳的性能。
  3. 由于S3 Express One Zone的低延迟和高性能特性,这可以使得训练过程更加快速和高效。
  4. 官网是使用Amazon Trainium2进行基础模型的训练,该芯片专为分布式训练而设计,可以将训练时间缩短高达40%。(我这里虽然不是Amazon Trainium2进行基础模型的训练,但是依然缩短了10~20左右)。

🚀三.总结与心得

🔎3.1 心得-测评有感

        这次深入的体验探索了一下发布会说的新功能,确实很惊艳,不愧为老牌IT科技公司,发布的产品都是有革命性质的,给我带来了不少的震撼,通过本次的模型实验我总结了下面几个优点,这几个最让我震撼!

  1. Amazon S3 Express One Zone 专注于高性能的单可用区存储服务,提供了极高的速度和低延迟。这种性能的提升对于需要快速访问和处理大量数据的应用程序来说非常重要
  2. 与传统的 S3 Standard 存储类相比,S3 Express One Zone 不仅提供了性能优势,还降低了请求成本。这意味着用户可以在不牺牲性能的情况下,更经济高效地管理他们的数据,亚马逊这次真的是做了一款好产品!
  3.  Amazon S3 Express One Zone 其便捷性和用户友好的操作。这种灵活性使得用户能够快速、顺利地创建和配置存储桶,平滑过渡到更高性能的存储解决方案,这对我们用户来说非常友好,有相关经验的朋友是可以直接上手的!
  4. 我通过图像分类项目的实战,成功想大家展示了 Amazon S3 Express One Zone 在机器学习领域的应用。这种实际应用案例使得产品更具说服力,能够直观地展示其在解决实际问题时的优越性能。看我上面的实验过程就知道了,我把 Amazon S3作为实验唯一变量之后,得出使用Amazon S3 Express One Zone普遍可以降低10%~20%的训练时间,虽然用没有使用Amazon Trainium2进行基础模型的训练,达到官方降低40%,但是我实验数据也体现了新产品性能的提升不是一点半点的!
  5. 我通过与标准版 S3 的性能对比实验,详细记录了不同训练集大小下的训练时间,并验证了采用 S3 Express One Zone 训练时间的明显降低。这样的实验证明了产品在实际使用中的优越性能。

        可以看第2.7节 采用标准版S3和S3 Express One Zone分别测试对比实验过程,完整的论述证明了这一事实观点,本次S3 Express One Zone给我带来了极大的震撼!

🔎3.2  总结

        到最后的总结阶段了,本文采用了Amazon S3 Express One Zone官网看到推荐使用Amazon S3 Express One Zone搭配Amazon SageMaker 模型训练的测评思路,用基于Amazon S3 Express One Zone和Amazon SageMaker的图像分类实战—以猫狗识别模型为例,并且探索项目采用Amazon S3标准版与Amazon S3 Express One Zone的差距。完整的描述了具体的使用过程,最后也将S3作为实验变量对官方给出的一系列优点进行了核实验证,从我的实验角度来看,本次亚马逊云科技发布的新产品:Amazon S3 Express One Zone。是相当震撼的,是一个革命的、创新的、里程碑的产品,下面我总结了一下本文的内容,感谢大家阅读学习!

  • 亚马逊云科技推出的创新产品 Amazon S3 Express One Zone。该产品专注于高性能的单可用区存储服务,以提供极高的速度和低延迟,适用于对数据访问性能要求高的应用程序。相较于传统的 S3 Standard 存储类,S3 Express One Zone 提供了显著的性能提升和请求成本降低。通过在图中展示工作原理,文中详细介绍了其优势和适用场景。
  • 在通过基于Amazon S3 Express One Zone和Amazon SageMaker的图像分类实战案例,用3个账号分别测试AmazonS3标准版和Amazon S3 Express One Zone性能提升结果可以看出,Amazon S3 Express One Zone对比AmazonS3标准版性能和延迟方面提升很大。
  • 结合 Amazon S3 Express One Zone 和 Amazon SageMaker 进行模型训练。以猫狗识别模型为例,详细介绍了项目的背景、所需材料、Amazon S3 Express One Zone 的创建和配置、模型数据的存储以及 SageMaker 的创建和配置等步骤。整个过程中,突出了 Amazon S3 Express One Zone 的便捷性和高性能。
  • 使用 SageMaker 进行模型的创建、训练和部署。通过清晰的步骤和代码演示,展示了如何在 SageMaker 中进行模型的各个阶段,包括数据的上传、模型的训练和测试。整个过程中,SageMaker 提供了便捷的平台,简化了机器学习工作流程

Amazon S3 Express One Zone 在性能和延迟方面的优势为用户提供了更高效的云存储解决方案。

        通过实际项目的经验,我成功实现了该产品在图像分类领域的应用,并通过对比实验验证了其性能优势。随着技术的不断发展,这样的创新产品将为用户在大数据处理、机器学习等领域带来更好的体验,我们一起期待亚马逊云科技的下一次新产品问世!

🚀附录

本文涉及产品官网入口:

亚马逊云科技控制台:amazon控制台入口

Amazon S3 Express One Zone官网:

高性能存储 – S3 Express One Zone

Amazon SageMaker:Amazon SageMaker

  • 71
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 82
    评论
错误信息 "'NoneType' object has no attribute 'RasterXSize'" 表明在某个对象上调用了名为 "RasterXSize" 的属性,但该对象的类型为 NoneType,因此没有这个属性。 根据引用,AttributeError是一种常见的错误,通常会在Python中遇到。它表示在对象上调用了一个不存在的属性或方法。而在引用中,也提到了类似的错误,即'NoneType' object has no attribute 'xxx'。 在引用中,可以看到None值的常见来源是不返回任何内容的函数。当一个函数没有返回任何内容时,它会默认返回None。因此,在代码中,如果某个变量的值为None,那么它是没有属性的。 回到问题中,'NoneType' object has no attribute 'RasterXSize' 错误表明在某个对象上调用了属性 'RasterXSize',但该对象的类型为None,因此没有这个属性。如果你想访问属性 'RasterXSize',你需要确保对象不为None,并且具有这个属性。 你可以在访问属性之前使用条件判断来检查对象是否为None,例如: ``` if example is not None: print(example.RasterXSize) else: print("对象为None,无法访问属性") ``` 这样,你就可以避免在对象为None时访问属性,从而避免出现'NoneType' object has no attribute 'RasterXSize'错误。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Python 中 AttributeError: ‘NoneType‘ object has no attribute ‘X‘ 错误](https://blog.csdn.net/fengqianlang/article/details/129674118)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [[报错]深析AttributeError: ‘NoneType‘ object has no attribute ‘xxx‘(持更)](https://blog.csdn.net/panbaoran913/article/details/124650015)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 82
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一键难忘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值