一行一样本sample,一列一特征feature
diebetes dataset
数据集在Anaconda/Lib/sit-packages/sklearn/datasets/ data/diabetes_data和diebetes_target
多维logistic回归模型(下标特征维度,上标样本)
mini-batch(N samples)
将运算向量化,变成矩阵 ,这样就可以利用GPU的并行运算能力~而不用for循环来算z1,z2,z3
torch.nn.Linear(8,1)输入维度8,输出维度1
原来的神经网络一层,现在改成多层,将线性网络首尾相连
输入8维(x下标),输出1维
若要获得8维输入,2维输出,最后任输出一维
矩阵是N维空间映射到M维空间的线性变换,把矩阵看成空间变换的函数
, 其中
神经网络的本质是寻找一种非线性的空间变换函数,来逼近任何函数~
练习:
1数据集读取
2模型的改变
用了三个线性结构,从8D-6D,6D-4D,4D-1D
torch.nn.Sigmoid与上讲的sigmoid不同,上讲是nn.functional中的sigmoid,本算法中torch.nn.Sigmoid() 将其看作是网络的一层,而不是简单的函数使用
sigmoid中没有参数,并不需要调参~
forward函数中,我们把o1,y_hat都写成x,便于调试
3构造损失和优化器
与上讲相同,输出为概率,用BCE损失
4训练循环
课后作业:尝试不同的激活函数
代码:
import numpy as np
import torch
import matplotlib.pyplot as plt
xy=np.loadtxt('diabetes.csv',delimiter=',',dtype=np.float32)
x_data=torch.from_numpy(xy[:,:-1])
y_data=torch.from_numpy(xy[:,[-1]])
class Model(torch.nn.Module):
def __init__(self):
super(Model,self).__init__()
self.linear1=torch.nn.Linear(8,6)
self.linear2=torch.nn.Linear(6,4)
self.linear3=torch.nn.Linear(4,1)
self.activate=torch.nn.Sigmoid()
def forward(self,x):
x=self.activate(self.linear1(x))
x=self.activate(self.linear2(x))
x=self.activate(self.linear3(x))
return x
model=Model()
criterion=torch.nn.BCELoss(reduction='mean')
optimizer=torch.optim.SGD(model.parameters(),lr=0.1)
loss_list=[]
epoch_list=[]
for epoch in range(1000):
#forward
y_pred=model(x_data)
loss=criterion(y_pred,y_data)
#backward
optimizer.zero_grad()
loss.backward()
#update
optimizer.step()
epoch_list.append(epoch)
loss_list.append(loss)
if (epoch%100==0):
print("epoch=",epoch)
print("loss=",loss.data.item())
plt.plot(epoch_list,loss_list,linewidth=1.5)
plt.xlabel("epoch")
plt.ylabel("loss")
plt.grid()
plt.show()
运行结果:
D:\Anacoda\envs\pytorch-py36\python.exe "C:/Users/hp/Desktop/python_work/PyTorch-2.0/LESSON6-multiple dimension input.py"
epoch= 0
loss= 0.6584222912788391
epoch= 100
loss= 0.6448382139205933
epoch= 200
loss= 0.6447491645812988
epoch= 300
loss= 0.6446539759635925
epoch= 400
loss= 0.6445503234863281
epoch= 500
loss= 0.6444361805915833
epoch= 600
loss= 0.6443095803260803
epoch= 700
loss= 0.644167959690094
epoch= 800
loss= 0.6440079808235168
epoch= 900
loss= 0.6438261866569519
Process finished with exit code 0