PyTorch深度学习实践——处理多维特征的输入

import torch
import numpy as np

xy = np.loadtxt('diabetes.csv', delimiter=',', dtype=np.float32)  # 括号内第一个为文件名,第二个为分隔符,第三个为指定数据类型
x_data = torch.from_numpy(xy[:, :-1])  # 最后一列不要(-1表示最后一列),取前面八列(最后一列是y)
y_data = torch.from_numpy(xy[:, [-1]])  # 中括号表示仅取-1这一列(即最后一列),写中括号代表拿出来的是一个矩阵,否则是一个向量


class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear1 = torch.nn.Linear(8, 6)  # 输入维度为8,输出维度为6(列的数量为此处的维度),Linear函数实现了空间维度的变换
        self.linear2 = torch.nn.Linear(6, 4)
        self.linear3 = torch.nn.Linear(4, 1)
        self.sigmoid = torch.nn.Sigmoid()  # 构造sigmoid函数,使用其他函数只需要修改这一行代码即可
        # 和上一讲中不需要初始化sigmoid函数的区别:上一讲中调用torch.nn.functional.Sigmoid,sigmoid是可以直接使用的函数;
        # 而此处使用torch.nn.Sigmoid,此处的sigmoid是一个模块,继承自Module,没有可训练的参数,故只需要一个(linear需要三个)

    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')  # BCE损失函数
optimizer = torch.optim.SGD(model.paraments(), lr=0.1)  # 优化器

for epoch in range(100):
    # Forward
    y_pred = model(x_data)  # 此处并没有做mini-batch,而是使用了所有数据
    loss = criterion(y_pred, y_data)
    print(epoch, loss.item())

    # Backward
    optimizer.zero_grad()  # 梯度清零
    loss.backward()

    # Update
    optimizer.step()

此讲的主要内容是输入多维数据并调用。注意根据输入维度和输出维度调用数据集的某几列,如本例中,数据集的前八列作为输入维度为8维的x,最后一列为输出维度为1维的y,所以可以看到在代码中分别取了前八列和最后一列。

此外,本例还使用了多层神经网络,他们的线性单元中的参数不同,故需要linear1、2、3分别对参数进行训练,而sigmoid函数由于没有需要训练的参数,故只有一个即可。神经网络层与层的连接靠不同维度的矩阵变换实现,本例中是8*6,6*4,4*1共三个变换矩阵,最终效果要保证输入维度为8,输出维度为1。(在调用数据集以及后续计算过程中一定要注意矩阵维度的匹配,否则无法计算)

此例也说明了神经网络的功能:实现非线性的空间变换。

你可能感兴趣的:(PyTorch深度学习实践,pytorch,深度学习)