【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 inheriting
        self.num_samples = num_samples
        self.num_nodes = num_nodes
        self.num_node_features = num_node_features

    def __len__(self):
        return self.num_samples

    def __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 label
        return Data(x=x, edge_index=edge_index, y=y)

# Example usage
num_samples = 100
num_nodes = 10
num_node_features = 8

dataset = 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 是用来在数据集中定位和访问特定样本的索引参数,它在自定义数据集类中的作用是非常重要的,能够帮助你有效地管理和处理数据集中的样本数据。

当出现AttributeError: 'Data' object has no attribute 'num_classes'错误时,可能是由于代码中的某些问题导致的。根据引用和引用提供的代码信息,我可以看出在创建数据集时可能发生了一些更改。具体来说,CiteSeerDataset的num_classes属性可能已经被删除,而在dataset对象上使用num_classes属性会出现错误。 要解决这个问题,你可以通过访问dataset对象的属性data.y来获取类别的数量。根据引用提供的代码,你可以使用以下代码获取类别的数量: num_out_feats = torch.max(dataset.y).item() 这将返回数据集中类别的最大值。请确保在使用该属性之前,已经加载了数据集并将其转移到适当的设备上,如引用所示。 请注意,根据你的代码和数据集的特定结构,可能需要对获取类别数量的方法进行适当的调整。请仔细查看代码和数据集的文档,以确保使用正确的属性和方法来获取类别数量。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [PyG加载数据集:‘GlobalStorage‘ object has no attribute ‘num_classes](https://blog.csdn.net/Cyril_KI/article/details/125825906)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [AttributeError: ‘NoneType’ object has no attribute ‘create_execution_context’](https://blog.csdn.net/m0_59249795/article/details/124210102)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值