处理多维特征的输入

课程来源:PyTorch深度学习实践——河北工业大学

《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibili

这一讲介绍输入为多维数据时的分类。

一个数据集示例如下:

由于使用的是多维的数据,因此模型中的x和y都应该变为向量的形式,变为如下式子:

而下方针对多维数据的式子中的一部分可以使用矩阵相乘的方式表示:

\[\hat y^{(i)}=\sigma([x_1^{(i)}...x_8^{(i)}]\begin{bmatrix}
w_1\\
.\\
.\\
.\\
w_8
\end{bmatrix}+b)
\]

由于我们使用的是mini-batch的计算方式,因此计算的形式如下:

\[\begin{bmatrix}
\hat y^{(1)}\\
.\\
.\\
.\\
\hat y^{(N)}
\end{bmatrix}=\sigma
\begin{bmatrix}
z^{(1)}\\
.\\
.\\
.\\
z^{(N)}
\end{bmatrix}
\]

其中z的计算方式如下:

\[Z^{(N)}=[x_1^{(N)}...x_8^{(N)}]\begin{bmatrix}
w_1\\
.\\
.\\
.\\
w_8
\end{bmatrix}+b
\]

为了利用并行计算进行优化,因此将计算改为矩阵运算如下:

\[\begin{bmatrix}
z^{(1)}\\
.\\
.\\
.\\
z^{(N)}
\end{bmatrix}=
\begin{bmatrix}
x_1^{(1)}...x_8^{(1)}\\
.\\
.\\
.\\
x_1^{(N)}...x_8^{(N)}
\end{bmatrix}
\begin{bmatrix}
w_1\\
.\\
.\\
.\\
w_8
\end{bmatrix}+b
\]

由于我们想将神经网络的层数增加几层,不是只用一层来预测,因此模型使用主要部分代码示例如下:

线性层的使用:

self.linear1 = torch.nn.Linear(8, 6)

注:叠加线性层每两层之间一定要加入非线性层,否则没有意义。

非线性层的使用:

x = self.sigmoid(self.linear1(x))

一般而言,神经网络中的隐层越多,中间神经元越多学习能力越强,但是过拟合的可能性也越大。

一个简单的神经网络的模型如下图:

代码如下:

import torch
import numpy as np import matplotlib.pyplot as plt
##1. Prepare Dataset
xy = np.loadtxt('diabetes.csv.gz', delimiter=',', dtype=np.float32)
x_data = torch.from_numpy(xy[:,:-1])
y_data = torch.from_numpy(xy[:, [-1]])
loss_list=[]
epoch_list=[] ##2. Define Model
class Model(torch.nn.Module):
def __init__(self):
super(Model, self).__init__()
##定义了三层线性层
self.linear1 = torch.nn.Linear(8, 6)
self.linear2 = torch.nn.Linear(6, 4)
self.linear3 = torch.nn.Linear(4, 1)
##定义激活函数,除了sigmoid也有其他的如self.activate = torch.nn.ReLU()
self.sigmoid = torch.nn.Sigmoid() def forward(self, x):
##处理单元(线性层+非线性变化层),三层,用同一个变量x(每一层处理的结果都传递到下一层)
x = self.sigmoid(self.linear1(x))
x = self.sigmoid(self.linear2(x))
x = self.sigmoid(self.linear3(x))
return x
model = Model() ##3. Construct Loss and Optimizer
criterion = torch.nn.BCELoss(size_average=True)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) ##4. Training Cycle
for epoch in range(10000):
##Forward
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
loss_list.append(loss.item())
epoch_list.append(epoch)
print(epoch, loss.item())
# Backward
optimizer.zero_grad()
loss.backward()
# Update
optimizer.step()
print(epoch,loss)
plt.plot(epoch_list, loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()

注:上述代码没有实现mini-batch的训练模式,还是使用全部输入,一次性训练的结果。

最新文章

  1. <button> 标签 id 与 function 重复时发生的问题
  2. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q95-Q98)
  3. 设计模式C#实现(十二)——装饰模式
  4. HTML---Android与js交互实例
  5. Jquery常用方法(转)
  6. 电子工程师名片——FAT16文件系统(转)
  7. Nginx日志配置及日志切割
  8. (读书笔记)函数参数浅析-JavaScript高级程序设计(第3版)
  9. Dubbo Data length too large: 11557050, max payload: 8388608 传输数据超限
  10. Python学习_07_错误、异常
  11. C# 实现Html转JSON
  12. Java 原生网络编程.
  13. 千兆以太网TCP协议的FPGA实现
  14. Mysql依赖库Boost的源码安装,linux下boost库的安装
  15. appium简明教程(9)——如何获取android app的Activity
  16. 复制控件出错--提示XX控件不存在
  17. Java NIO之拥抱Path和Files
  18. LCT解读(1)
  19. 1008 Elevator (20)(20 point(s))
  20. MySQL案例之Timestamp和Datetime

热门文章

  1. iOS14新功能一览
  2. python12day
  3. 人工智能与智能系统1->机器人学1 | 位置与姿态描述
  4. 用了这么久 Linux ,才知道这些概念。。。
  5. AT2400 [ARC072B] Alice&Brown
  6. bom-页面加载事件
  7. Idea 如何不通过模板创建支持Maven的JavaWeb项目
  8. ARP协议工作原理
  9. vi/vim 设置.vimrc(/etc/vim | $HOME)
  10. js 数组map用法 Array.prototype.map()