本章将介绍pytorch中面向对象部分的许多基本写法和基本概念
为跟练小土堆每集代码,然后进李宏毅机器学习课程。
在系列中会敲完所有视频中代码,并且在注释详细写出感悟和易错点。
欢迎大家一起交流!
最前面的神经网络和卷积,可以移步我的
各个层的简介
import torch
import torchvision
from torch import nn
from torch.nn import Linear
from torch.utils.data import DataLoader
'normalization是正则化,防止过拟合;regular是归一化,加速收敛,化成标准高斯分布'
'Recurrent Layers是在文字识别等里面常用的'
'Transformer Layers不怎么用'
'Linear Layers线性层in_features,out_features,bias。线性层的意思就是对输入数据进行y=kx+b的变化'
"Dropout,为了防止过拟合"
'sparse 是语言识别'
'Disdance误差是如何衡量的,Loss是大小为多少'
#Linear Layers
'in_features是输入的个数,由kx+b得到out_features,bias=True是加偏置,weight是k。这是最基本的神经网络'
#VGG经典模型
调用数据集
都是套路性的,每次都这么写
dataset = torchvision.datasets.CIFAR10("../data",train=True,transform=torchvision.transforms.ToTensor(),
download=True)
dataloader = DataLoader(dataset,batch_size=)
神经网络
class Tudui(nn.Module):
def __init__(self):
super(Tudui,self).__init__()
self.linear1 = Linear(196608,10)
def forward(self,input):
output = self.linear1(input)
return output
分析一下神经网络模板 ,尤其是super如何继承父类的
那么如何区分类、实例、调用方法的概念呢?
在 Python 中,类、实例和方法是面向对象编程的核心概念,它们各自有独特的作用和关系。以下是它们的具体含义和相互关系:
1. 类(Class)
-
定义:类是对象的模板或蓝图。它定义了一类对象的属性和方法。
-
作用:它描述了所有对象的共性,包括它们的数据和行为。
-
语法:通过 class 关键字定义类。例如:
-
class Animal:
species = "Mammal" # 类属性
def __init__(self, name): # 实例属性初始化
self.name = name
def speak(self):
print(f"{self.name} makes a sound.")
在这个例子中,Animal 是一个类,定义了一个类属性 species 和一个方法 speak。
2. 实例(Instance)
-
定义:实例是根据类创建的具体对象。实例是类的“具体化”。
-
作用:每个实例可以有自己的数据。通过实例可以访问类的属性和方法。
-
语法:通过“调用”类来创建实例。例如:
my_animal = Animal("Dog") # my_animal 是类 Animal 的实例
这里 my_animal 是 Animal 类的实例。
3. 方法(Method)
- 定义:方法是类内部定义的函数,用于描述类的实例可以执行的操作。
- 种类:
- 实例方法:定义时带有
self 参数,用于操作实例的属性或执行实例的动作。 - 类方法:定义时带有
cls 参数(通常使用 @classmethod 装饰器),用于操作类属性。 - 静态方法:定义时没有
self 或 cls 参数(通常使用 @staticmethod 装饰器),不依赖于类或实例的属性。
什么是调用一个实例方法?
-
调用实例方法是指在实例对象上使用方法。实例方法通过 self 参数访问实例的属性。
-
例如,调用 my_animal 实例的 speak 方法:
my_animal.speak() # 输出:Dog makes a sound.
这里,speak 是一个实例方法,通过 my_animal 调用该方法时,self 就指向 my_animal 实例,使得方法可以访问和使用 my_animal 的属性 name。
访问类的属性的方法
在 Python 中,有几种方式可以访问类的属性:
总结
- 类是模板,定义属性和方法。
- 实例是类的具体对象,可以通过实例访问类的属性和调用类的方法。
- 调用实例方法就是通过实例来执行定义在类中的函数。
调用类的方法
for data in dataloader:
imgs , targets = data
# print(imgs.shape) 这里是为了看一下输入的格式是什么,[,3,32,32],我们想变成[1,1,1,数],自己算出来
#output = torch.reshape(imgs,(1,1,1,-1))
output = torch.flatten(imgs) #小函数的用法,全展为一维,就一个参数。摊平,flat.这个比reshape方便。但是reshape可以转化为
print(output.shape)
output = tudui(output)
print(output.shape)
属性和方法又有什么不同?
1. 属性(Attribute)
-
定义:属性是用来存储对象的状态或数据的变量,可以理解为对象的“特征”。
-
作用:属性用于描述对象的特征或状态。例如,人的年龄、名字、颜色等都可以作为属性。
-
访问方式:通常直接通过对象来访问属性。
-
属性常常是在__init__方法中定义的!
-
示例:
-
class Person:
def __init__(self, name, age):
self.name = name # name 是属性
self.age = age # age 是属性
person = Person("Alice", 30)
print(person.name) # 输出:Alice
print(person.age) # 输出:30
-
在这个例子中,name 和 age 是 Person 类的属性,表示一个人的名字和年龄。
2. 方法(Method)
-
定义:方法是定义在类中的函数,用来描述对象的行为或功能。
-
作用:方法用于定义对象可以执行的动作或操作,通常会访问或修改对象的属性。
-
访问方式:通过对象调用方法(需要加上 ()),这样可以对属性进行操作。
-
示例:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self): # introduce 是一个方法
print(f"My name is {self.name} and I am {self.age} years old.")
person = Person("Alice", 30)
person.introduce() # 输出:My name is Alice and I am 30 years old.
在这个例子中,introduce 是 Person 类的一个方法,表示人的自我介绍行为。调用 person.introduce() 时,introduce 方法会访问 person 的 name 和 age 属性。
区别总结
- 属性是对象的数据或状态,表示“是什么”,如
name 和 age。 - 方法是对象的行为或功能,表示“能做什么”,如
introduce() 是一个自我介绍的方法。 - 属性直接通过对象访问,而方法需要调用执行。
- 点是属性,括号是方法
让我们看一下output = tudui(output)这句
在这里,output = tudui(output) 而不是 output = tudui(input),通常是因为程序中的数据正在不断地被更新和处理。这个用法中的括号里的内容表示要传递给函数 tudui 的参数。
让我们逐步分析这个写法的含义:
-
初始数据:在之前的代码中,output 可能已经被赋值为某个值或经过其他处理。也就是说,output 可能不再是初始的原始输入(例如,input),而是经过某些步骤后更新的数据。
-
tudui(output):此处的 tudui 是一个函数,它接收 output 作为输入。执行 tudui(output) 会对 output 的当前值进行一些处理(例如,转换、计算等),然后返回一个新值。
-
output = tudui(output):这个赋值语句的作用是用 tudui(output) 的结果来更新 output,即 output 的新值是 tudui(output) 返回的结果。这通常用于循环或迭代中,以便每次调用 tudui 时都在之前的 output 基础上进行进一步处理。
简单示例
例如,如果我们有如下代码:
output = 2
def tudui(x):
return x * 2
output = tudui(output) # 此时 output = 2 * 2 = 4
output = tudui(output) # 此时 output = 4 * 2 = 8
output = tudui(output) # 此时 output = 8 * 2 = 16
在这种情况下,output 每次都会被更新到 tudui(output) 的结果。这种用法在需要累积、迭代更新或递归计算时很常见。
明天会更新神经网络层的最后一章,然后进入实战训练集