知识点:
1.class:用来定义一个类,推荐两个视频class类基础,class类继承
自己简单写的代码,具体用法可以看上面的两个视频:
class BankAccount:
def __init__(self,accountNumber,accountName,balance):
self.accountNumber=accountNumber
self.accountName=accountName
self.balance=balance
def deposit(self,amount):
self.balance+=amount
def withdraw(self,amount):
self.balance-=amount
def __str__(self):
# return "({},{})".format(self.accountName,self.balance)
#自定义如果输出b1,b2,按照怎么样的格式输出
return str(self.balance)+' '+self.accountName
def __lt__(self, other):#小于,定义了这个之后,主程序中可以直接通过b1,b2比较他们的balance
return self.balance<other.balance
def __gt__(self, other):#大于
return self.balance>other.balance
b1=BankAccount('1234','Tom',1000)
b2=BankAccount('5678','Jerry',800)
print(b1,b2)
b1.deposit(100)
b2.withdraw(100)
print(b1,b2)
print(b1<b2)
class Father:
def __init__(self):
pass
def get_money(self):
print("我主要负责赚钱!")
def driving(self):
print("我会驾驶!")
def math(self):
print("我会学数学!")
class Son(Father):
def english(self):
print("我会学英语!")
Father.math(self)
super().math()
son=Son()
son.english()
son.driving()
print(Son.__mro__)#查看调用顺序
2.对于代码中的为什么要进行super(自己定义的模型名,self).__init__()
我的理解是要继承父亲里面的属性,如果没有这个只能继承父亲里面的方法,但是不能继承其属性,可以参考下面的文章为什么要进行父类初始化
3.torch.nn.linear
torch.nn.Linear(in_features,out_features,bias=True) Y=Ax+b 如果Y:n*2 X:n*3 所以W是:3*2(W是乘在X的后面) 在一个矩阵中,行表示样本,列表示features in_features:输入的样本,就是x的维度 out_features:输出样本的维度,就是Y bias:就是要不要加上b的意思,不要的话设置为false,否则设置为true
再看一下大佬对它的解读:
1)nn.Linear是一个类,使用时进行类的实例化
2)实例化的时候,nn.Linear需要输入两个参数,in_features为上一层神经元的个数,out_features为这一层的神经元个数
3)不需要定义w和b。所有nn.Module的子类,形如nn.XXX的层,都会在实例化的同时随机生成w和b的初始值。所以实例化之后,我们就可以调用属性weight和bias来查看生成的w和b。其中w是必然会生成的,b是我们可以控制是否要生成的。在nn.Linear类中,有参数bias,默认 bias = True。如果我们希望不拟合常量b,在实例化时将参数bias设置为False即可。
4)由于w和b是随机生成的,所以同样的代码多次运行后的结果是不一致的。如果我们希望控制随机性,则可以使用torch中的random类。如:torch.random.manual_seed(420) #人为设置随机数种子
5)由于不需要定义常量b,因此在特征张量中,不需要留出与常数项相乘的那一列,只需要输入特征张量。
6)输入层只有一层,并且输入层的结构(神经元的个数)由输入的特征张量X决定,因此在PyTorch中构筑神经网络时,不需要定义输入层。
7)实例化之后,将特征张量输入到实例化后的类中。
4.torch.nn.MSELOSS
criterion touch.nn.MSELOSS(size_average=True,reduce=True) size_average:是否要求均值 reduce:最终是否要求和,降低维度
还是附上大佬的解读
CLASS torch.nn.MSELoss(size_average=None, reduce=None, reduction=mean)
torch.nn.functional.mse_loss(input, target, size_average=None, reduce=None, reduction=mean) → Tensor
参数
size_average: 默认为True, 计算一个batch中所有loss的均值;reduce为 False时,忽略这个参数;
reduce: 默认为True, 计算一个batch中所有loss的均值或者和;
reduce = False,size_average 参数失效,返回的 loss是向量,维度为 (batch_size, ) ;
reduce = True,size_average 参数失效,返回的 loss是标量;
size_average = True,返回 loss.mean();
size_average = False,返回 loss.sum();
reduction :‘none’ | ‘mean’ | ‘sum’,默认均值;指定size_average 和reduce参数就不使用reduction ,与之相反。
5.torch.optim.SGD
torch.optim.SGD(param,lr=<object object>,momentum=0,dampening=0,weight_decay=0,nesterov=False)
为了使用torch.optim,你需要构建一个optimizer对象。这个对象能够保持当前参数状态并基于计算得到的梯度进行参数更新。
params (iterable) – 待优化参数的iterable(w和b的迭代) 或者是定义了参数组的dict
lr (float) – 学习率
momentum (float, 可选) – 动量因子(默认:0)
weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认:0)
dampening (float, 可选) – 动量的抑制因子(默认:0)
nesterov (bool, 可选) – 使用Nesterov动量(默认:False)
最后附上代码
import torch
import matplotlib.pyplot as plt
a=[]
b=[]
x_data=torch.Tensor([[1.0],[2.0],[3.0]])
y_data=torch.Tensor([[2.0],[4.0],[6.0]])
class LinearModel(torch.nn.Module): #将模型定义为一个类
def __init__(self): #构造函数,初始化
super(LinearModel,self).__init__()#第一个参数是你定义的名称
self.linear=torch.nn.Linear(1,1)#构造对象,包括权重和偏置
def forward(self,x): #前置函数(没有后置的原因,用module构造出来的函数,会自动backword())
y_pred=self.linear(x)
return y_pred
model=LinearModel()
criterion=torch.nn.MSELoss(size_average=False)
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)#优化器
#model.parameters()保存的是Weights和Bais参数的值。
for epoch in range(100):
y_pred=model(x_data)
loss=criterion(y_pred,y_data)
print(epoch,loss.item())
a.append(epoch)
b.append(loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step() #自动更新
print('w=',model.linear.weight.item())
print('b=',model.linear.bias.item())
x_test=torch.Tensor([[4.0]])
y_test=model(x_test)
print('y_pred=',y_test.data)
plt.plot(a,b)
plt.show()