Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3648440
  • 博文数量: 365
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2522
  • 用 户 组: 普通用户
  • 注册时间: 2019-10-28 13:40
文章分类

全部博文(365)

文章存档

2023年(8)

2022年(130)

2021年(155)

2020年(50)

2019年(22)

我的朋友

分类: Python/Ruby

2021-08-03 17:12:17

import matplotlib.pyplot as plt

import torch

import numpy as np

epoch_list=[]

loss_list=[]

class Model(torch.nn.Module):

    def __init__(self):

        super(Model,self).__init__()

        #第一个线性模型:输入的样本特征为8个,输出的特征为6

        '''

        wb的维度,自然就定了:

        y_pred=wx+b

        y_(n*6)=x_(n*8)*w+b

        w=8*6

        b=1*6最后广播机制,复制成n*6

        '''

        self.linear1=torch.nn.Linear(8, 6)

        #第二个线性模型:输入样本特征为上层的输出特征数6,输出特征数为4

        self.linear2=torch.nn.Linear(6, 4)

         #第三个线性模型:输入样本特征为上层的输出特征数6,输出特征数为4

        self.linear3=torch.nn.Linear(4, 1)

        #torch.nn.Sigmoid是个Module,也是继承torch.nn.Module,但是由于没有参数,故只定义一个即可,作为一个层,区分层标志为非线性激活函数,卷积层也是线性的

        self.sigmoid=torch.nn.Sigmoid()

        self.activate=torch.nn.ReLU()

    def forward(self,x_data):

        '''

        只用一个x_data变量,虽然是有很多层,但是为了防止写错和节省内存

        激活函数作为一个层,区分层标志为非线性激活函数,卷积层也是线性的

        '''

        '''

        #x_data_2 第一层输出,也是第二层输入

        x_data=self.sigmoid(self.linear1(x_data))

        #x_data_3 第二层输出,也是第三层输入

        x_data=self.sigmoid(self.linear2(x_data))

        #y_pred

        x_data=self.sigmoid(self.linear3(x_data))

        '''

        #x_data_2 第一层输出,也是第二层输入

        x_data=self.activate(self.linear1(x_data))

        #x_data_3 第二层输出,也是第三层输入

        x_data=self.activate(self.linear2(x_data))

        #y_pred

        x_data=self.sigmoid(self.linear3(x_data))

        return x_data

model=Model()

#因为一般的显卡只支持32位浮点数,所以不用double64

data = np.loadtxt('D:\BaiduNetdiskDownload\PyTorch深度学习实践\diabetes.csv.gz',delimiter=',',dtype=np.float32)

x_data=torch.from_numpy(data[:,:-1])

y_data=torch.from_numpy(data[:,[-1]])

criterion=torch.nn.BCELoss(size_average=True)

optimizer=torch.optim.SGD(model.parameters(),lr=0.1)

for epoch in range(1000):

    #前馈

    #y_pred是张量

    y_pred = model(x_data)

    #loss是数据为一个标量的张量

    loss = criterion(y_pred, y_data)

    epoch_list.append(epoch)

    loss_list.append(loss.item())

     #把所有参数的梯度都归零

    optimizer.zero_grad()

     #进行反向传播,计算loss对参数的梯度

    loss.backward()

     #更新参数

    optimizer.step()

print(loss_list[-1])

plt.plot(epoch_list, loss_list)

plt.ylabel("losss")

plt.xlabel("epoch")

plt.show()

阅读(1206) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~