本次的实验,就类似于神经网络中的全连接神经网络,这是用来处理高维数据的。
神经网络共3层;第一层是8维到6维的非线性空间变换,第二层是6维到4维的非线性空间变换,第三层是4维到1维的非线性空间变换。
代码如下所示:
#准备数据集
xy = np.loadtxt('E:\\tmp\\.keras\\datasets\\diabetes.csv\\diabetes.csv',delimiter=',',dtype=np.float32)
x_data = torch.from_numpy(xy[:,:-1])
y_data = torch.from_numpy(xy[:,[-1]])
#定义模型
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()
def forward(self,x):
x = self.sigmoid(self.linear1(x))
x = self.sigmoid(self.linear2(x))
x = self.sigmoid(self.linear3(x))
return x
model = Model()
#定义优化器和损失函数
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(),lr=0.01)
epoch_list = []
acc_list = []
#前向、反向、更新
for epoch in range(100000):
y_pred = model(x_data)
loss = criterion(y_pred,y_data)
optimizer.zero_grad()
loss.backward()
optimizer.step()
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)#用来计算准确率
epoch_list.append(epoch)
acc_list.append(acc)
print('epoch=',epoch,'loss=',loss.item(),'acc=',acc)
plt.plot(epoch_list,acc_list)
plt.xlabel('epoch')
plt.ylabel('acc')
plt.show()
模型最终的效果并不是很好,准确率在78%左右。
epoch= 99999 loss= 0.4616067409515381 acc= 0.764163372859025
努力加油a啊