1、乘的权重(w)都一样,加的偏置(b)也一样。b变成矩阵时使用广播机制。神经网络的参数w和b是网络需要学习的,其他是已知的。
2、学习能力越强,有可能会把输入样本中噪声的规律也学到。我们要学习数据本身真实数据的规律,学习能力要有泛化能力。
3、该神经网络共3层;第一层是8维到6维的非线性空间变换,第二层是6维到4维的非线性空间变换,第三层是4维到1维的非线性空间变换。
4、本算法中torch.nn.Sigmoid() # 将其看作是网络的一层,而不是简单的函数使用
#引入numpy
import numpy as np
#引入torch
import torch
#引入数据集,用np中的加载文本功能,加载文本。分割符为逗号。数据类型为32位浮点型
xy = np.loadtxt('diabetes.csv',delimiter=',',dtype=np.float32)
#x的数据是用torch中的来自numpy提取数据,:代表所有行,:-1代表除了最后一列的所有列。
x_data = torch.from_numpy(xy[:,:-1])
#y的数据是torch中的来自numpy提取数据,:代表所有行,【-1】代表最后一列
y_data = torch.from_numpy(xy[:,[-1]])
#构造模型
class Model(torch.nn.Module):
#初始化自身对象
def __init__(self):
#super调用父类初始化器
super(Model,self).__init__()
#构造一个输入是8维,输出是6维的线性模型
self.linear1 = torch.nn.Linear(8,6)
#构造一个输入是6维,输出是4维的线性模型
self.linear2 = torch.nn.Linear(6,4)
#构造一个输入是4维,输出是1维的线性模型
self.linear3 = torch.nn.Linear(4,1)
#构造一个逻辑回归模型
self.sigmoid = torch.nn.Sigmoid()
#前向传播
def forward(self,x):
#用sigmoid激活线性模型1,也就是将线性模型1代入到sigmoid里面
x = self.sigmoid(self.linear1(x))
#用sigmoid激活线性模型2
x = self.sigmoid(self.linear2(x))
#用sigmoid激活线性模型3
x = self.sigmoid(self.linear3(x))
#返回x
return x
#实例化模型
model = Model()
#构造二分类交叉熵求损失降维求平均
criterion = torch.nn.BCELoss(reduction='mean')
#优化模块中的SGD模型中的所有参数,学习率为0.1
optimizer = torch.optim.SGD(model.parameters(),lr=0.1)
#循环100次
for epoch in range(100):
#将x代入模型求y的预测值
y_pred = model(x_data)
#将y的预测值和真实值代入损失函数中求损失值
loss = criterion(y_pred,y_data)
#输出循环次数,损失值,用item设置损失值为标量
print(epoch,loss.item())
#梯度归零
optimizer.zero_grad()
#损失反向传播
loss.backward()
#更新权重
optimizer.step()

参考链接
https://blog.csdn.net/bit452/article/details/109682078
更改epoch为100000,以准确率acc为评价指标,源代码和结果如下
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]) # 第一个‘:’是指读取所有行,第二个‘:’是指从第一列开始,最后一列不要
print("input data.shape", x_data.shape)
y_data = torch.from_numpy(xy[:, [-1]]) # [-1] 最后得到的是个矩阵
# print(x_data.shape)
# design model using class
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, 2)
self.linear4 = torch.nn.Linear(2, 1)
self.sigmoid = torch.nn.Sigmoid()
def forward(self, x):
x = self.sigmoid(self.linear1(x))
x = self.sigmoid(self.linear2(x))
x = self.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(1000000):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
# print(epoch, loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
if epoch%100000 == 99999:
y_pred_label = torch.where(y_pred>=0.5,torch.tensor([1.0]),torch.tensor([0.0]))
acc = torch.eq(y_pred_label, y_data).sum().item()/y_data.size(0)
print("loss = ",loss.item(), "acc = ",acc)


被折叠的 条评论
为什么被折叠?



