用PyTorch实现多层网络

用PyTorch实现多层网络

步骤如下:

  1. 引入模块,读取数据
  2. 构建计算图(构建网络模型)
  3. 损失函数与优化器
  4. 开始训练模型
  5. 对训练的模型预测结果进行评估
import torch.nn.functional as F
import torch.nn.init as init
import torch
from torch.autograd import Variable
import matplotlib.pyplot as  plt
import numpy as np
import math
%matplotlib inline
#%matplotlib inline 可以在Ipython编译器里直接使用
#功能是可以内嵌绘图,并且可以省略掉plt.show()这一步。

xy=np.loadtxt('./data/diabetes.csv.gz',delimiter=',',dtype=np.float32)
x_data=torch.from_numpy(xy[:,0:-1])#取除了最后一列的数据
y_data=torch.from_numpy(xy[:,[-1]])#取最后一列的数据,[-1]加中括号是为了keepdim

print(x_data.size(),y_data.size())
#print(x_data.shape,y_data.shape)

#建立网络模型
class Model(torch.nn.Module):
    
    def __init__(self):
        super(Model,self).__init__()
        self.l1=torch.nn.Linear(8,6)
        self.l2=torch.nn.Linear(6,4)
        self.l3=torch.nn.Linear(4,1)
        
    def forward(self,x):
        out1=F.relu(self.l1(x))
        out2=F.dropout(out1,p=0.5)
        out3=F.relu(self.l2(out2))
        out4=F.dropout(out3,p=0.5)
        y_pred=F.sigmoid(self.l3(out3))
        return y_pred
    
def weights_init(m):
    classname=m.__class__.__name__
    if classname.find('Linear')!=-1:
        m.weight.data=torch.randn(m.weight.data.size()[0],m.weight.data.size()[1])
        m.bias.data=torch.randn(m.bias.data.size()[0])
        
#our model
model=Model()
model.apply(weights_init)
criterion=torch.nn.BCELoss()
optimizer=torch.optim.SGD(model.parameters(),lr=0.1)

#training loop
Loss=[]
for epoch in range(2000):
    y_pred=model(x_data)
    loss=criterion(y_pred,y_data)
    if epoch%100 == 0:
        print("epoch = ",epoch," loss = ",loss.data)
        Loss.append(loss.data)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        
hour_var = Variable(torch.randn(1,8))
print("predict",model(hour_var).data[0]>0.5)
plt.plot(Loss)

在这里插入图片描述
在这里插入图片描述
这里说明一下,这个dataset不是自带的,需要大家自己去下载,我找的时候费了不少功夫,这里提供一个网址给大家下载https://github.com/LianHaiMiao/pytorch-lesson-zh/blob/master/dataSet/diabetes.csv.gz
还有就是关于初始化权重这里我没有弄明白,希望有朋友可以指点一下

def weights_init(m):
    classname=m.__class__.__name__
    if classname.find('Linear')!=-1:
        m.weight.data=torch.randn(m.weight.data.size()[0],m.weight.data.size()[1])
        m.bias.data=torch.randn(m.bias.data.size()[0])

最后附上参考的两张代码图,还是有一点小错的,建议按我改过的代码来,注释可以看这两张图。
在这里插入图片描述

在这里插入图片描述
emmmm
没有搞懂第一张参考图是要干嘛在这里插入图片描述

可能是放错了,这个我自己研究过后应该是画散点图,并按照1、3和2、4象限划分

import numpy as np
import matplotlib.pyplot as plt

m=200
X=np.random.randn(2,m)
Y=(X[0,:]>0)*(X[1,:]>0)*1.0+(X[0,:]<0)*(X[1,:]<0)

plt.scatter(X[0,:],X[1,:],c=Y,s=40,cmap=plt.cm.Spectral)
plt.show()

Y=Y.reshape(m,1).T

在这里插入图片描述

画出来大概是这样的,为了弄清楚上面的代码,我换了一个数据量小一点的。

a=np.random.randn(2,5)
b=(a[0,:]>0)*(a[1,:]>0)*1.0+(a[0,:]<0)*(a[1,:]<0)
plt.scatter(a[0,:],a[1,:],c=b,s=40,cmap=plt.cm.Spectral)
plt.show()
print(a)
print((a[0,:]>0)*(a[1,:]>0))
print((a[0,:]>0)*(a[1,:]>0)*1.0)
print((a[0,:]>0)*(a[1,:]>0)*1.0+(a[0,:]<0)*(a[1,:]<0))
print(a[0,:],a[1,:])
#感觉是象限划分?一三蓝色,二四红色

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_35547281/article/details/89285980
今日推荐