《PyTorch深度学习实践》-P7处理多维特征的输入

一行一样本sample,一列一特征feature

diebetes dataset

数据集在Anaconda/Lib/sit-packages/sklearn/datasets/ data/diabetes_data和diebetes_target

《PyTorch深度学习实践》-P7处理多维特征的输入_第1张图片

多维logistic回归模型下标特征维度,上标样本

《PyTorch深度学习实践》-P7处理多维特征的输入_第2张图片

mini-batch(N samples)

将运算向量化,变成矩阵 ,这样就可以利用GPU的并行运算能力~而不用for循环来算z1,z2,z3 

torch.nn.Linear(8,1)输入维度8,输出维度1

《PyTorch深度学习实践》-P7处理多维特征的输入_第3张图片

 原来的神经网络一层,现在改成多层,将线性网络首尾相连

输入8维(x下标),输出1维

《PyTorch深度学习实践》-P7处理多维特征的输入_第4张图片

 若要获得8维输入,2维输出,最后任输出一维

矩阵是N维空间映射到M维空间的线性变换,把矩阵看成空间变换的函数

y=Ax, 其中x\in R^{N}, y\in R^{M}, A\in R^{M*N} 

《PyTorch深度学习实践》-P7处理多维特征的输入_第5张图片

神经网络的本质是寻找一种非线性的空间变换函数,来逼近任何函数~

《PyTorch深度学习实践》-P7处理多维特征的输入_第6张图片

练习: 

1数据集读取

 《PyTorch深度学习实践》-P7处理多维特征的输入_第7张图片

2模型的改变

用了三个线性结构,从8D-6D,6D-4D,4D-1D

torch.nn.Sigmoid与上讲的sigmoid不同,上讲是nn.functional中的sigmoid,本算法中torch.nn.Sigmoid() 将其看作是网络的一层,而不是简单的函数使用

sigmoid中没有参数,并不需要调参~

forward函数中,我们把o1,y_hat都写成x,便于调试

《PyTorch深度学习实践》-P7处理多维特征的输入_第8张图片

3构造损失和优化器

与上讲相同,输出为概率,用BCE损失

《PyTorch深度学习实践》-P7处理多维特征的输入_第9张图片

4训练循环

 《PyTorch深度学习实践》-P7处理多维特征的输入_第10张图片

课后作业:尝试不同的激活函数

《PyTorch深度学习实践》-P7处理多维特征的输入_第11张图片

   代码:

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

 

《PyTorch深度学习实践》-P7处理多维特征的输入_第12张图片

你可能感兴趣的:(pytorch,深度学习,人工智能)