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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】C++ 超市会员卡管理系统(面向对象)(源码+数据)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

【从零开始学架构 架构基础】五 架构设计的复杂度来源:低成本、安全、规模

架构设计的复杂度来源其实就是架构设计要解决的问题,主要有如下几个:高性能、高可用、可扩展、低成本、安全、规模。复杂度的关键,就是新旧技术之间不是完全的替代关系,有交叉,有各自的特点,所以才需要具体…

解决idea中git无法管理项目中所有需要管理的文件

点击文件->设置 选择版本控制—>目录映射 点击加号 设置整个项目被Git管理

springboot助农电商系统-计算机毕业设计源码08655

摘要 近年来,电子商务的快速发展引起了行业和学术界的高度关注。基于移动端的助农电商系统旨在为用户提供一个简单、高效、便捷的农产品购物体验,它不仅要求用户清晰地查看所需信息,而且还要求界面设计精美,使得功能与页面完美融…

【GPU虚拟化到池化技术深度分析 2024】

文末有福利! 随着大模型的兴起,对GPU算力的需求越来越多,而当前现实情况使企业往往受限于有限的GPU卡资源,即便进行了虚拟化,往往也难以充分使用GPU卡资源或持续使用资源。为解决GPU算力资源不均衡等问题,…

国标GB/T 28181详解:国标GBT28181-2022第三方呼叫控制的视音频文件下载流程

目录 一、定义 1、国标GB/T 28181 2、第三方呼叫控制的视音频文件下载流程 二、作用 1、提供有效的数据回顾机制 2、增强监控系统的功能性 3、保障数据传输与存储的可靠性 4、实现精细化的操作与控制 5、促进监控系统的集成与发展 6、提供清晰的信令流程和操作规范 三…

驱动开发:配置Visual Studio驱动开发环境

100编程书屋_孔夫子旧书网 配置驱动开发环境配置驱动开发模板配置驱动双机调试 在正式开始驱动开发之前,需要自行搭建驱动开发的必要环境,首先我们需要安装Visual Studio 2013这款功能强大的程序开发工具,在课件内请双击ISO文件并运行内部的…

基于web的产品管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于web的产品管理系统,java项目。 ecli…

5G RAN

两个entity:NodeB、UE entity之间传输数据的东东 entity内部的流水线岗位:L3/L2/L1 岗位之间是消息交互/信令交互

阿里云centos7.9 挂载数据盘到 www目录

一、让系统显示中文 参考:centos7 怎么让命令行显示中文(英文->中文)_如何在命令行中显示中文-CSDN博客 1、输入命令:locale -a |grep "zh_CN" 可以看到已经存在了中文包 2、输入命令:sudo vi…

在Clion使用CubeMX Stm32的步骤

Step1 准备软件,安装环境: 1. cubemx v6.5.0(可以兼容以前版本的project) https://www.st.com.cn/zh/development-tools/stm32cubemx.html STM32CubeMX 默认安装目录, 6.5版本可以兼容老版本 C:\Program Files\STMicroelectroni…

Golang | Leetcode Golang题解之第199题二叉树的右视图

题目: 题解: /** 102. 二叉树的递归遍历*/ func levelOrder(root *TreeNode) [][]int {arr : [][]int{}depth : 0var order func(root *TreeNode, depth int)order func(root *TreeNode, depth int) {if root nil {return}if len(arr) depth {arr a…

3D Web轻量引擎HOOPS Web Platform赋能AEC行业数字化,高效渲染与多格式支持!

在建筑、工程和施工(AEC)行业,数字化转型和高效协作正变得越来越重要。为应对日益复杂的项目需求和不断提升的质量标准,AEC企业需要一种强大的工具来实现高效的3D可视化和数据管理。HOOPS Web Platform作为一款综合性3D开发平台&a…

金融科技如何多角度助力小微企业融资

一、引言 在全球化与数字化交织的时代背景下,金融科技(FinTech)作为新兴力量,正逐步改变传统的金融业态,尤其在助力小微企业融资方面,金融科技展现出了多元化的价值和优势。本文将从不同角度探讨金融科技如…

python操作elasticsearch

1、安装 首先,确保你已经安装了elasticsearch库。如果没有安装,可以使用pip进行安装: pip install elasticsearch 如下: 2、测试是否联通 输入 python 进入交互模式。然后依次输入一下命令。 from elasticsearch import Elas…

uniapp启动页面鉴权页面闪烁问题

在使用uni-app开发app 打包完成后如果没有token,那么就在onLaunch生命周期里面判断用户是否登录并跳转至登录页。 但是在app中页面会先进入首页然后再跳转至登录页,十分影响体验。 处理方法: 使用plus.navigator.closeSplashscreen() 官网…

Nginx网站服务详解(设置并发数、实现不同虚拟主机等)

一、nginx的最大并发数设置已经状态收集模块 [root192 nginx]# cat nginx.conf # For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/user ngin…

【仪器仪表】为什么要对线材做摇摆测试?

在工作中,我们可能会看到下图所示的机器。它就是线材弯折试验机,又叫线材弯折摇摆试验机、插头引线弯折试验机等。 线缆生产厂家和质检部门对电源线、DC线进行弯曲试验都需要这样的仪器,以便验证线缆是否符合设计标准。 线材弯折试验的作用 线材弯折试验机是线材的一种质检…

谷粒商城-个人笔记(集群部署篇一)

前言 ​学习视频:​Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强​学习文档: 谷粒商城-个人笔记(基础篇一)谷粒商城-个人笔记(基础篇二)谷粒商城-个人笔记(基础篇三)谷粒商城-个人笔记(高级篇一)谷粒商城-个…

顺序表应用——通讯录

在本篇之前的顺序表专题我们已经学习的顺序表的实现,了解了如何实现顺序表的插入和删除等功能,那么在本篇当中就要学习基于顺序表来实现通讯录,在通讯录当中能实现联系人的增、删、查改等功能,接下来就让我们一起来实现通讯录吧&a…