文章目录
多维特征数据的输入
对于一个多维数据,其行表示一个样本,列表示样本的特征
对于多维特征的运算,实质上可以当做特征的映射
代码
python
import torch
import torch.nn.functional as F
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
xy=np.loadtxt('./data/Diabetes_class.csv.gz',delimiter=',',dtype=np.float32)#加载训练集合
x_data = torch.from_numpy(xy[:,:-1])#取前八列
y_data = torch.from_numpy(xy[:,[-1]])#取最后一列
test =np.loadtxt('./data/test_class.csv.gz',delimiter=',',dtype=np.float32)#加载测试集合,这里我用数据集的最后一个样本做测试,训练集中没有最后一个样本
test_x = torch.from_numpy(test)
class Model(torch.nn.Module):
def __init__(self):#构造函数
super(Model,self).__init__()
self.linear1 = torch.nn.Linear(8,6)#8维到6维
self.linear2 = torch.nn.Linear(6, 4)#6维到4维
self.linear3 = torch.nn.Linear(4, 1)#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(size_average=False)
#model.parameters()会扫描module中的所有成员,如果成员中有相应权重,那么都会将结果加到要训练的参数集合上
optimizer = torch.optim.SGD(model.parameters(),lr=0.1)#lr为学习率,因为0.01太小了,我改成了0.1
for epoch in range(1000):
#Forward
y_pred = model(x_data)
loss = criterion(y_pred,y_data)
print(epoch,loss.item())
#Backward
optimizer.zero_grad()
loss.backward()
#update
optimizer.step()
y_pred = model(x_data)
print(y_pred.detach().numpy())
y_pred2 = model(test_x)
print(y_pred2.data.item())
加载数据集
概念
python
# Training cycle
for epoch in range(training_epochs):
# Loop over all batches
for i in range(total_batch)
epoch:表示训练的周期,表示所有的样本都经过前向传播和后向传播才叫一个训练周期
batch-size:每一次训练的时候所需要的样本数量,这个训练包括了前向传播和后向传播
iterations:内层循环一共执行了多少次,= 样本数量 ÷ batch-size
概念