目录
1、基础知识
准备数据集(每一行是一个样本,每一个样本有8个特征)
公式推导
第 i 个样本 z^(i)的线性计算
mini-batch(N个样本)
线性层
注意事项
1、乘的权重(w)都一样,加的偏置(b)也一样。b变成矩阵时使用广播机制。神经网络的参数w和b是网络需要学习的,其他是已知的。
2、学习能力越强,有可能会把输入样本中噪声的规律也学到。我们要学习数据本身真实数据的规律,学习能力要有泛化能力。
3、该神经网络共3层;第一层是8维到6维的非线性空间变换,第二层是6维到4维的非线性空间变换,第三层是4维到1维的非线性空间变换。
4、本算法中torch.nn.Sigmoid() 将其看作是网络的一层,而不是简单的函数使用 ,目的是为了在 forward函数中直接调用Sigmoid()函数将线性前一步中的线性计算转化为非线性。所以要在模型的初始化中实例化对象,当做网络的一层进行非线性计算。同时注意 def __init__(self)中定义的都是类,如果是函数(例如torch.sigmoid 和 torch.nn.functional.sigmoid )都在 forward 中直接使用,而不用在def __init__(self)进行实例化对象,因为他们都不是类
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.sigmoid = torch.nn.Sigmoid() # 将其看作是网络的一层,而不是简单的函数使用
5、torch.sigmoid、torch.nn.Sigmoid和torch.nn.functional.sigmoid的区别
torch.sigmoid是一个函数,可以直接调用,它将输入的张量作为参数,并将其应用于Sigmoid函数,返回经过Sigmoid函数处理后的张量。
torch.nn.Sigmoid是一个类,用于创建一个Sigmoid函数对象。它可以在模型的初始化方法中被实例化,并在模型的前向传播方法中调用。和torch.sigmoid函数一样,torch.nn.Sigmoid也可以将输入的张量应用于Sigmoid函数,但它是以对象的方式进行调用。
torch.nn.functional.sigmoid是一个函数,可以直接调用,它和torch.sigmoid函数的功能相同。在较新的PyTorch版本中,torch.nn.functional模块中的函数已经被移动到torch中,所以现在推荐使用torch.sigmoid函数。
总的来说,torch.sigmoid和torch.nn.functional.sigmoid是可以直接使用的函数,而torch.nn.Sigmoid是一个类,需要实例化后才能调用。在实际应用中,推荐使用torch.sigmoid函数。
2、代码实现
import numpy as np
import torch
import matplotlib.pyplot as plt
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.sigmoid = torch.nn.Sigmoid() # 将其看作是网络的一层,而不是简单的函数使用
def forward(self, x):
o_1 = self.sigmoid(self.linear1(x))
o_2 = self.sigmoid(self.linear2(o_1))
y_pred = self.sigmoid(self.linear3(o_2)) # y hat
return y_pred
def use_model(x_data,y_data):
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)
epoch_list = []
loss_list = []
# training cycle forward, backward, update
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.backward()
optimizer.step()
return (epoch_list,loss_list)
if __name__ == "__main__":
# 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] 最后得到的是个矩阵
epoch_list,loss_list = use_model(x_data,y_data)
plt.plot(epoch_list, loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()