PyTorch深度学习实践——7.处理多维特征的输入

PyTorch深度学习实践——7.处理多维特征的输入

课程链接:《PyTorch深度学习实践》7.处理多维特征的输入
单维:输入x是一个实数
多维输入:x有多个不同的特征,预测对应的分类
对于回归问题:输出值y是一个实数
对于分类问题:输出y属于一个离散的集合
对于下面这个数据集,在机器学习中每一行叫做一个样本,每一列叫做一个特征
在数据库中,每一行叫做一个记录,每一列叫做一个字段在这里插入图片描述
单维特征输入的时候,x是一个实数,所以乘以一个权重就行了
在这里插入图片描述现在x变成了8个维度,所以模型里面肯定要算出一个实数,所以每一个特征xi的值都要和一个w相乘在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

import torch
import numpy as np

xy = np.loadtxt('diabetes.csv.gz', delimiter=',', dtype=np.float32)     
											# 读取数据集文件。参数:文件名(.csv或.csv.gz),分隔符,数据类型 
											# 注意使用32位
											# 加载数据集,用逗号分隔
x_data = torch.from_numpy(xy[:, :-1])       # 加载特征,Tensor类型。参数:所有行,第一列到倒数第二列
											# from_numpy将取出来的x和y转换为tensor
											# x取所有行, 然后除开最后一列————xy[:, :-1],[]前面表示行,后面表示列
											#-1 表示最后一列不要
y_data = torch.from_numpy(xy[:, [-1]])      # 加载标签,Tensor类型。参数:所有行,最后一列(中括号[-1]意为矩阵,若无中括号,则意为向量)
											# y取每一行的最后一个数,[-1]——-1表示取最后一列,[]表示将向量转换成矩阵

class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear1 = torch.nn.Linear(8, 6)        # 特征从8维降到6维
        self.linear2 = torch.nn.Linear(6, 4)        # 特征从6维降到4维
        self.linear3 = torch.nn.Linear(4, 1)        # 特征从4维降到1维
        # 之前是用的torch.nn.Functional.sigmoid()函数,现在是用torch.nn.Sigmoid()模块
        self.sigmoid = torch.nn.Sigmoid()       # 可更换激活函数:self.activate = torch.nn.ReLU() 
        										# 与nn.Function.sigmoid不同,用于构建计算图

    def forward(self, x):
        x = self.sigmoid(self.linear1(x))       # 都用x,进行迭代
        x = self.sigmoid(self.linear2(x))       # 更换激活函数后可使用:x = self.activate(self.linear2(x))
        x = self.sigmoid(self.linear3(x))       # 使用ReLu时,>0的数值都为0,可能会计算ln0,需要改回:self.sigmoid()
        return x

model = Model()
criterion = torch.nn.BCELoss(size_average=True)  # 损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)  # 优化器

for epoch in range(100):
    # Forward
    y_pred = model(x_data)              # 直接使用所有数据,Mini-Batch后面再讲(DataLoader)
    loss = criterion(y_pred, y_data)
    print(epoch, loss.item())

    # Backward
    optimizer.zero_grad()  # 注意清零
    loss.backward()

    # Update
    optimizer.step()


在这里插入图片描述

输出结果:

0 0.7210900783538818
1 0.7137091159820557
2 0.7070571184158325
3 0.7010629177093506
4 0.6956613659858704
5 0.6907935738563538
6 0.686406672000885
7 0.6824524998664856
8 0.6788880825042725
9 0.6756744384765625
10 0.6727766394615173
11 0.6701630353927612
12 0.6678054928779602
13 0.6656782627105713
14 0.6637586355209351
15 0.6620258688926697
16 0.6604613661766052
17 0.6590486168861389
18 0.6577724814414978
19 0.6566197276115417
20 0.6555778980255127
21 0.6546363234519958
22 0.6537850499153137
23 0.6530153751373291
24 0.6523191332817078
25 0.651689350605011
26 0.651119589805603
27 0.6506038308143616
28 0.6501370668411255
29 0.6497144103050232
30 0.64933180809021
31 0.6489852666854858
32 0.6486712694168091
33 0.6483867764472961
34 0.6481289267539978
35 0.6478952765464783
36 0.6476834416389465
37 0.6474913954734802
38 0.6473171710968018
39 0.6471591591835022
40 0.6470157504081726
41 0.6468855738639832
42 0.6467674970626831
43 0.646660327911377
44 0.6465629935264587
45 0.6464744210243225
46 0.6463941931724548
47 0.6463211178779602
48 0.6462547779083252
49 0.6461944580078125
50 0.6461396217346191
51 0.6460896730422974
52 0.6460441946983337
53 0.6460028886795044
54 0.6459652185440063
55 0.6459308862686157
56 0.6458995938301086
57 0.6458710432052612
58 0.6458449959754944
59 0.6458212733268738
60 0.6457995176315308
61 0.6457796692848206
62 0.6457614302635193
63 0.6457448601722717
64 0.645729660987854
65 0.6457157135009766
66 0.6457028388977051
67 0.6456912159919739
68 0.6456803679466248
69 0.6456704139709473
70 0.6456611752510071
71 0.645652711391449
72 0.6456448435783386
73 0.6456376910209656
74 0.6456308960914612
75 0.6456246972084045
76 0.6456188559532166
77 0.645613431930542
78 0.6456084251403809
79 0.6456037163734436
80 0.6455993056297302
81 0.645595133304596
82 0.6455912590026855
83 0.6455875635147095
84 0.6455840468406677
85 0.6455807685852051
86 0.645577609539032
87 0.6455746293067932
88 0.6455718278884888
89 0.6455691456794739
90 0.6455665230751038
91 0.6455639600753784
92 0.6455616354942322
93 0.6455592513084412
94 0.6455570459365845
95 0.6455548405647278
96 0.6455527544021606
97 0.6455506682395935
98 0.6455487012863159
99 0.6455467343330383

在这里插入图片描述

替换其它的激活函数

relu函数,在以下两处修改即可

import torch
import numpy as np
import matplotlib.pyplot as plt

# 加载数据集,用逗号分隔
xy = np.loadtxt('diabetes.csv.gz', delimiter=',', dtype=np.float32)
# from_numpy将取出来的x和y转换为tensor
# x取所有行, 然后除开最后一列————xy[:, :-1],[]前面表示行,后面表示列
x_data = torch.from_numpy(xy[:, :-1])
# y取每一行的最后一个数,[-1]——-1表示取最后一列,[]表示将向量转换成矩阵
y_data = torch.from_numpy(xy[:, [-1]])

print(x_data.shape)

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.sigmoid = torch.nn.Sigmoid()
        self.relu = torch.nn.ReLU()

    def forward(self, x):
        # x = self.sigmoid(self.linear1(x))
        # x = self.sigmoid(self.linear2(x))
        # x = self.sigmoid(self.linear3(x))

        x = self.relu(self.linear1(x))
        x = self.relu(self.linear2(x))
        x = self.sigmoid(self.linear3(x))
        return x


model = Model()

criterion = torch.nn.BCELoss(size_average=True)
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

loss_list = []
for epoch in range(100):
    # Forward
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    print(epoch, loss.item())
    loss_list.append(loss.item())

    # backward
    optimizer.zero_grad()
    loss.backward()

    # update
    optimizer.step()

plt.plot(range(100), loss_list)
plt.xlabel('epoch')
plt.ylabel('cost')
plt.show()
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮肤小白生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值