首先说明一下逻辑回归模型
小批量的模型
定义线性层
神经网络内部计算过程
代码如下:
'''
利用pytorch构建模型大多可分为四步:
1、准备数据集
2、模型的构造,定义相应的模型
3、构造损失函数和优化器
4、训练循环
'''
import torch #导入需要的包
import numpy as np
import matplotlib.pyplot as plt
xy = np.loadtxt('diabetes.csv',delimiter=',',dtype=np.float32) #np.loadtxt,读取txt,csv文件
x_data = torch.from_numpy(xy[:,:-1]) # 第一个‘:’是指读取所有行,第二个‘:’是指从第一列开始,最后一列不要
y_data = torch.from_numpy(xy[:,[-1]]) # [-1] 最后得到的是个矩阵,避免产生的是一个向量
class Model(torch.nn.Module): #构建模型。继承自module
def __init__(self): #构建初始函数
super(Model, self).__init__()
self.linear1 = torch.nn.Linear(8,6) # 输入数据x的特征是8维,x有8个特征,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)) #y hat
return x
model = Model()
criterion = torch.nn.BCELoss(reduction='mean') #定义损失函数和优化器,损失函数使用二分类交叉熵损失,优化随机梯度下降算法
optimizer = torch.optim.SGD(model.parameters(),lr=0.1)
epoch_list = []
loss_list = []
for epoch in range(100):
y_pred = model(x_data)
loss = criterion(y_pred,y_data)
print(epoch,loss.item())
epoch_list.append(epoch)
loss_list.append(loss.item())
optimizer.zero_grad() #每使用一次loss会构建计算图,梯度会累加,需要清零
loss.backward() #损失的反向传播
optimizer.step() #更新
plt.plot(epoch_list,loss_list) #绘图
plt.xlabel('epoch') #选中单词或者句子,点击单引号或者双引号可以快速添加引号
plt.ylabel('loss')
plt.show()
运行输出: