pytorch 实现多层网络

pytorch实现多层网络

  • 导入包
import torch
import torch.nn as nn
import torch.nn.init as init
import torch.nn.functional as F
import math
  • 导入数据‘
#读取数据集
# Pima-Indians-Diabetes数据集
import pandas as pd
import numpy as np
xy=pd.read_csv('/home/infisa/wjht/project/pytorch_practice/diabetes.csv',delimiter=',',dtype= np.float32)
#print(xy.head())
# print(type(xy))
xy_numpy = np.array(xy)   #pandas转为numpy 为了后面numpy转tensor
# print(type(xy_numpy))
x=xy_numpy[:,0:-1] #x为768*8
y=xy_numpy[:,-1].reshape(-1,1)  #为了让其shape为768*1

#将numpy 转为tensor
x_data=torch.Tensor(torch.from_numpy(x))
y_data=torch.Tensor(torch.from_numpy(y))

#查看维度
print(x_data.shape)  # torch.Size([768, 8])
print(y_data.shape)  # torch.Size([768, 1])
  • 构建神经网络
class Model(nn.Module):
    def __init__(self):
        super(Model,self).__init__()
        #定义多层神经网络
        self.fc1=torch.nn.Linear(8,6)
        self.fc2=torch.nn.Linear(6,4)
        self.fc3=torch.nn.Linear(4,1)

    def forward(self, x):
        x=F.relu(self.fc1(x))     #8->6 第一层
        x=F.dropout(x,p=0.5)  #dropout 1
        x=F.relu(self.fc2(x))   # 6->4 第二层
        x=F.dropout(x,p=0.5)    #dropout 2
        y_pred=torch.sigmoid(self.fc3(x))  #4->1  ->sigmoid 第三层sigmoid层
        return y_pred
  • 自定义权重初始化函数
def weight_init(m):
    classname=m.__class__.__name__
    if classname.find('Linear')!=-1:
        print('hi')
        m.weight.data=torch.randn(m.weight.data.size()[0],m.weight.data.size()[1])
        m.bias.data=torch.randn(m.bias.size())[0]
  • 定义损失函数及优化器
model=Model()
model.apply(weight_init)
criterion=torch.nn.BCELoss()  #定义损失函数 binary crosstripy
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)   #学习率设为0.01
Loss=[]
print(x.shape)
  • 训练
for epoch in range(2000):
    y_pred = model(x_data)
    #计算误差
    loss = criterion(y_pred,y_data)
    #
    #prin(loss.item())
    Loss.append(loss.item())
    #每迭代1000次打印Lost并记录
    if epoch%100 == 0:
        print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, 2000, loss.item()))
    #梯度清零
    optimizer.zero_grad()
    #反向传播
    loss.backward()
    #更新梯度
    optimizer.step()


#由于预测的是概率 所以需要将y_pred的值转化为和y_data一致类型的。
# y_data 为1或0(浮点数) 对于二分类,sigmoid函数值大于0.5时为1, 小于0.5时为0。

for i in range(len(y_pred)):
    if(y_pred[i]>0.5):
        y_pred[i] = 1.0
    else:
        y_pred[i] = 0.0
#print(y_pred)


print((y_pred == y_data).sum().item()/len(y_data)) # torch.Tensor.sum()函数
  • 结论
0.6510416666666666
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值