这里写目录标题
一、处理多维特征的输入
多维数据的 行:record 列:feature
当输入x变成n
维的向量,让其和n
维的权重w
作内积,内积之后转置。
![image-20211029172006876](https://i-blog.csdnimg.cn/blog_migrate/aec9df966718158b76f05110be70c1c8.png)
![image-20211029172526474](https://i-blog.csdnimg.cn/blog_migrate/b7aa0f8225d8e18fa147672f55ae7da7.png)
广播:Python/Numpy中的矩阵向量的广播(Broadcasting)特性
矩阵和向量:
self.linear = torch.nn.Linear(8, 2) 可以将8维的输入进行空间维度变换,成为2维的输出。
每次空间压缩,需要引入σ(激活函数)
,进行非线性的空间变换。
![image-20211029174116104](https://i-blog.csdnimg.cn/blog_migrate/26d35b9c9850a80d951dd78b41d7e4ff.png)
变换的维度和层数,决定了网络的复杂程度。过程中到底如何变化,即为超参数搜索。
![image-20211029174843415](https://i-blog.csdnimg.cn/blog_migrate/d8d764f2584dcc6020165fe7e9d8750a.png)
二、代码:
import torch
import numpy as np
import matplotlib.pyplot as plt
xy = np.loadtxt('diabetes.csv.gz', delimiter=',', dtype=np.float32)
x_data = torch.from_numpy(xy[ : , :-1]) # 第一个:的前后参数缺省,表示读取所有行 第二个:指从开始列到倒数第二列
y_data = torch.from_numpy(xy[ : , [-1]]) # [-1]使向量转换为矩阵 from_numpy可以生成tensor
# test = np.loadtxt('test.csv.gz', delimiter='', dtype=np.float32)
# print(y_data)
# Define Model
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)
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()
# Construct Loss and Optimizer
criterion = torch.nn.BCELoss(reduction = 'mean')
optimizer = torch.optim.SGD(model.parameters(), lr = 0.1)
epoch_list = []
loss_list = []
# Training Cycle
for epoch in range(100):
# Forward
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
epoch_list.append(epoch)
loss_list.append(loss.item())
print(epoch, loss.item())
# Backward
optimizer.zero_grad()
loss.backward()
# Update
optimizer.step()
plt.plot(epoch_list, loss_list)
plt.ylabel('loss_list')
plt.xlabel('epoch_list')
plt.show()