PyTorch 深度学习实践-处理多维特征的输入
通过多个线性模型来模拟非线性的空间变换,矩阵计算就是不同维度之间的空间转换
说明:1、乘的权重(w)都一样,加的偏置(b)也一样。b变成矩阵时使用广播机制。神经网络的参数w和b是网络需要学习的,其他是已知的。
2、学习能力越强,有可能会把输入样本中噪声的规律也学到。我们要学习数据本身真实数据的规律,学习能力要有泛化能力。
3、该神经网络共3层;第一层是8维到6维的非线性空间变换,第二层是6维到4维的非线性空间变换,第三层是4维到1维的非线性空间变换。
4、本算法中torch.nn.Sigmoid() # 将其看作是网络的一层,而不是简单的函数使用
5、torch.sigmoid、torch.nn.Sigmoid和torch.nn.functional.sigmoid的区别
在这里插入图片描述
可以自己随意在Model类中改torch.nn.Linear的变换,尝试后发现激活函数改成ReLU比sigmod最后得到的精确率高一些
import numpy as np
import torch
import matplotlib.pyplot as plt
# prepare dataset
xy = np.loadtxt('diabetes.csv', delimiter=',', dtype=np.float32)
x_data = torch.from_numpy(xy[:, :-1]) # 第一个‘:’是指读取所有行,第二个‘:’是指从第一列开始,最后一列不要
y_data = torch.from_numpy(xy[:, [-1]]) # [-1] 最后得到的是个矩阵
# design model using class
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear1 = torch.nn.Linear(8, 6) # 输入数据x的特征是8维,x有8个特征
self.linear2 = torch.nn.Linear(6, 4)
self.linear3 = torch.nn.Linear(4, 1)
# self.linear4 = torch.nn.Linear(4, 1)
self.activate = torch.nn.ReLU() # 将其看作是网络的一层,而不是简单的函数使用
def forward(self, x):
x = self.activate(self.linear1(x))
x = self.activate(self.linear2(x))
x = torch.sigmoid(self.linear3(x)) # y hat
# x = self.sigmoid(self.linear4(x)) # y hat
return x
model = Model()
# construct loss and optimizer
# criterion = torch.nn.BCELoss(size_average = True)
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
# training cycle forward, backward, update
for epoch in range(10000):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
# print(epoch, loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
if epoch % 1000 == 999:
y_pred_label = torch.where(y_pred >= 0.5, torch.ones_like(y_pred), torch.zeros_like(y_pred))#概率大于0.5为1
acc = torch.eq(y_pred_label, y_data).sum().item() / y_data.size(0)#计算正确率
print("loss = ", loss.item(), "acc = ", acc)
原文地址:https://blog.csdn.net/m0_52695557/article/details/140519708
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!