【PYG】定义数据集报错AttributeError: can‘t set attribute

当你遇到 AttributeError: can't set attribute 错误时,通常是因为你试图在一个类的实例上设置一个属性,但该类不允许直接设置属性。在Python中,某些类,特别是那些继承自某些基类(比如 torch.utils.data.Dataset)的类,限制了直接属性赋值的操作,这是为了安全或一致性考虑。

要解决这个问题,你应该在你的 MyDataset 类的 __init__ 方法中正确地初始化属性。以下是如何修复这个问题的方法:

关键更改内容:

  • (这部分有点瞎扯)构造方法 (__init__): 我将 self.num_node_features = num_node_features 从初始化中移除,因为它导致了 AttributeError 错误。相反,我将它移到了 __init__ 方法中,以正确初始化 MyDataset 实例创建时的属性。
  • 方法 (__len____getitem__): 我还添加了 __len____getitem__ 方法,这是 Dataset 子类所必需的方法。__len__ 返回数据集中的样本数 (num_samples),__getitem__ 根据给定的索引 (idx) 获取一个样本,生成 xy 的合成数据。

这种结构确保了你的 MyDataset 类被正确初始化,并符合PyTorch数据集的预期行为。根据你实际数据集的需求调整合成数据生成 (xy) 的部分。

错误部分没有__len____getitem__,写成len和get,继承来自from torch_geometric.data import Dataset

from torch_geometric.data import Data
from torch.utils.data import Dataset
import torch
# Define your dataset class
class MyDataset(Dataset):def __init__(self, num_samples, num_nodes, num_node_features):super(MyDataset, self).__init__()  # Initialize base class if inheritingself.num_samples = num_samplesself.num_nodes = num_nodesself.num_node_features = num_node_featuresdef __len__(self):return self.num_samplesdef __getitem__(self, idx):edge_index = torch.tensor([[i for i in range(self.num_nodes)],[(i + 1) % self.num_nodes for i in range(self.num_nodes)]], dtype=torch.long)x = torch.randn((self.num_nodes, self.num_node_features))y = torch.randn((self.num_nodes, 1))  # Each node has a labelreturn Data(x=x, edge_index=edge_index, y=y)# Example usage
num_samples = 100
num_nodes = 10
num_node_features = 8dataset = MyDataset(num_samples, num_nodes, num_node_features)
print(dataset[0])

super的作用

如果在使用 super() 调用时出现错误,通常是因为类的初始化方法(__init__)中没有正确地调用父类的初始化方法。这可能会导致 Python 报告类的属性无法设置的错误。让我们来看看如何正确使用 super() 并初始化属性。

在你的 MyDataset 类中,确保按照以下方式使用 super() 和正确初始化属性

解释说明:

  • super() 函数:在 Python 中,super() 函数用于调用父类的方法。在 MyDataset 类的 __init__ 方法中,super(MyDataset, self).__init__() 调用了 Dataset 类的初始化方法,确保正确初始化了 Dataset 类中的属性和方法。
  • 属性初始化:在 MyDataset__init__ 方法中,通过 self.num_samplesself.num_nodesself.num_node_features 初始化了数据集的属性。这些属性用于定义数据集的特征和样本数量。
  • 数据加载__getitem__ 方法用于按照给定的 idx 加载数据集中的样本,并返回一个包含图数据的 Data 对象。

通过这样的方式,你可以确保 MyDataset 类正确地继承了 Dataset 类,并正确初始化了属性,避免了 AttributeError 错误的发生。

idx的作用

在PyTorch中,特别是在使用 torch.utils.data.Datasettorch.utils.data.DataLoader 构建数据加载和处理管道时,idx(或者通常命名为 index)代表着数据集中样本的索引。具体来说:

  1. __getitem__ 方法中的 idx

    • 在自定义的数据集类中,通常会实现 __getitem__ 方法。这个方法接收一个参数 idx,它表示你要获取的样本在数据集中的索引。
    • 例如,在一个图像分类任务中,idx 就是每张图像在数据集中的位置。通过这个索引,你可以从数据集中加载并返回对应位置的样本数据。
  2. 作用

    • idx 的作用是定位和访问数据集中特定样本的数据。在训练过程中,DataLoader 会使用 __getitem__ 方法迭代数据集,根据给定的 idx 获取每个样本,然后将它们组织成批量供模型训练。
    • 在使用 DataLoader 加载数据时,idx 通常会被 DataLoader 内部迭代器管理,你无需手动传递它,只需实现好 __getitem__ 方法即可。
  3. 示例

    • 假设你有一个自定义的数据集类 MyDataset,实现了 __getitem__ 方法来根据 idx 加载图像数据。当你使用 DataLoader 加载这个数据集时,DataLoader 会自动处理索引的管理和批量数据的组织,你只需要关注数据集类的实现和模型的训练过程。

总结来说,idx 是用来在数据集中定位和访问特定样本的索引参数,它在自定义数据集类中的作用是非常重要的,能够帮助你有效地管理和处理数据集中的样本数据。

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

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

相关文章

忍法:声音克隆之术

前言: 最近因为一直在给肚子里面的宝宝做故事胎教,每天(其实是看自己心情抽空讲下故事)都要给宝宝讲故事,心想反正宝宝也看不见我,只听我的声音,干脆偷个懒,克隆自己的声音&#xf…

Linux CentOS 宝塔 Suhosin禁用php5.6版本eval函数详细图文教程

方法一:PHP_diseval_extension禁用 Linux CentOS 禁用php的eval函数详细图文教程_centos php 禁用 eval-CSDN博客 这个方法make报错,懒得费时间处理,直接用第二种 方法二:suhosin禁用 不支持PHP8,官方只支持PHP7以下…

【电源专题】为什么带电量计芯片的电池MOS保护要放在高侧

在实际的电量计电池开发中,发现一个很奇怪的现象。传统电池保护IC往往都是将充电保护和放电保护的两个MOS管放在低侧的。如下所示是文章:【电源专题】读一读单节锂电池保护IC规格书 可以看到M1和M2两个MOS管是放在PB-(也就是电池的负端),我们叫做低端。 而BQ28Z610电…

Python爬虫背后技术详解

在互联网时代,信息量巨大,如何高效地获取和处理这些信息变得尤为重要。Python 爬虫作为一种自动化获取网页信息的技术,已成为许多程序员和数据分析师必备技能之一。本文将深入探讨 Python 爬虫背后的技术原理,并结合实际代码示例来…

股票回购(Stock repurchases)和派发股息(Dividend distributions)有什么相同点和不同点?

中文版 股票回购和派发股息是公司将利润返还给股东的两种主要方式,二者各有优缺点。下面是它们的相同之处和不同之处,并通过具体公司数据进行说明。 相同之处 股东回报:股票回购和派发股息都是公司向股东返还利润的一种方式。股东从中受益…

目标检测常用涨点方法:注意力机制小结(空间注意力、通道注意力、CBAM等)

1.通道注意力 通道注意力(Channel Attention)是在通道维度上对输入数据进行学习,再对不同的通道分配相应的权重表示重要性,从而达到“分配注意力”的效果。SENet(Squeeze and Excitation networks) 是一个典型的使用通…

论基于架构的软件设计方法及应用(ABSD)

论基于架构的软件设计方法及应用(ABSD) 一、引言 随着信息技术的快速发展,软件系统的复杂性和规模性不断增加,传统的软件开发方法已难以满足现代软件项目的需求。基于架构的软件设计方法(Architecture-Based Softwar…

Swift宏的实现

上篇介绍了Swift宏的定义与生声明,本篇主要看看是Swift宏的具体实现。结合Swift中Codable协议,封装一个工具让类或者结构体自动实现Codable协议,并且添加一些协议中没有的功能。 关于Codable协议 Codable很好,但是有一些缺陷&…

编写Linux下共享库SDK

在Linux中,共享库(也称为动态链接库)是一种可以被多个程序共享的可执行代码和数据的集合。在编写共享库的SDK时,我们通常需要提供以下内容: 1. 头文件:包含了共享库提供的函数和数据结构的声明。这些头文件…

1688_item_search_shop接口技术详解

1688_item_search_shop接口技术详解 在B2B电商领域,当商家或消费者需要查找特定店铺的商品时,一个高效的店铺搜索接口显得尤为重要。1688平台作为中国领先的B2B电商平台,提供了item_search_shop接口,使得商家和消费者能够根据店铺…

一个c++的综合实例:log同步写入文件

1. 引言 功能 通过一个API函数把log写入到文件中,分4个log level 目录 ├── log ├── log.cpp ├── log.h ├── main.cpp └── Makefile 2.代码 文件:main.cpp #include "log.h"int main(int argc, char *argv[]) {Log::GetIns…

yaklang window安装 vscode运行得到“hello world”

资源来源:旅程伊始:Yak 语言环境安装与搭建环境 | Yak Program Language 安装yak语言非常简单,管理员权限打开命令行运行以下命令: powershell (new-object System.Net.WebClient).DownloadFile(https://yaklang.oss-cn-beijing…

1085 PAT单位排行(测试点5)

solution 测试点5:总分是在每个学生加权后再取整,所以用来存学生分数的变量要用浮点型学校排序: 若成绩不同,则按成绩降序若成绩相同,人数不同,则按成绩升序若成绩和人数都相同,则按单位名升序…

TS-字面量类型

字面量在代码中表示固定值。在TypeScript中,字面量包括字符串、数值、布尔值、长整型值、对象、数组、函数、正则表达式、null等,例如,以下都是字面量。 99.9 //数值字面量 true //布尔值字面量 "message" //字符…

理解GPT2:无监督学习的多任务语言模型

目录 一、背景与动机 二、卖点与创新 三、几个问题 四、具体是如何做的 1、更多、优质的数据,更大的模型 2、大数据量,大模型使得zero-shot成为可能 3、使用prompt做下游任务 五、一些资料 一、背景与动机 基于 Transformer 解码器的 GPT-1 证明…

NAS教程丨铁威马如何登录 SSH终端?

适用型号: 所有TNAS 型号 如您有特殊操作需要通过 SSH 终端登录 TNAS,请参照以下指引: (注意: 关于以下操作步骤中的"cd /"的指令,其作用是使当前 SSH/Telnet 连接的位置切换到根目录,以免造成对卷的占用.请不要遗漏它.) Windows…

数据分析的线上云端数据库搭建及Excel和Tableau连接

数据分析的线上云端数据库搭建及Excel和Tableau连接 SQL基础知识 线上SQL训练: SQlZOO: https://www.sqlzoo.net/wiki/SQL_Tutorial 牛客网SQL真题:https://www.nowcoder.com/ta/sql select,from,where, order by, limit, group by, having, substr(),…

【TensorFlow深度学习】图像旋转预测:一个无监督表征学习的实践案例

图像旋转预测:一个无监督表征学习的实践案例 理论背景方法概述实战代码结构导入必要的库定义数据增强构建模型训练流程主函数 结论 在机器学习领域,无监督表征学习正逐渐成为解锁大数据潜力的关键。其中,一种创新的方法——图像旋转预测&…

【SpringBoot】SpringBoot使用mail实现登录邮箱验证

📝个人主页:哈__ 期待您的关注 目录 一、前期准备 1 开启邮箱服务 2 SpringBoot导入依赖 3 创建application.yml配置文件 4 创建数据库文件 5 配置redis服务 二、验证邮件发送功能 三、注册功能实现邮箱验证 1 创建User实体类 2 创建UserPa…

HTTP 常见状态码

2xx: 代表请求已成功被服务器接收、理解、并接受。 3xx: 重定向,需要客户端采取进一步的操作才能完成请求 4xx: 客户端的请求错误 400 客户端错误403:服务器拒绝客户端的请求401:需要身份认证404:服务器找不到资源 5xx: 服务器在…