一、线性分类与感知机
1.线性回归
(1)定义:利用数理统计中回归分析,来确定两种或两种以上变量间相
互依赖的定量关系的一种统计分析方法。
(2)要素:训练集(即输入数据),比如预测房价和面积的关系时,面积就是训练集
输出数据,模型(映射关系),条目数
(3)多维问题:
假设原问题和n个因素有关,则可以构造代价函数:
2.线性二分类问题
(1)定义:线性分类器则透过特征的线性组合来做出分类决定,以达到
此种目的。简言之,样本通过直线(或超平面)可分
(2)输入是特征向量,输出有多种可能,如果是二分类问题,则是0和1,如果输出是某类的概率,则是0到1之间的数字
(3)为了最终获得0到1之间的概率,我们构造了sigmoid函数:
因此,可以构造如下的损失函数:
这种回归叫做softmax
二、前向神经网络原理
“人工智能”是目前非常火的一个概念,而“深度学习”是催生人工智能发展的一个重要因素。这个领域其实是非常会造概念的。由于和人的神经结构有类似,最初始的模型被命名为“神经网络”。之后随着机器硬件的发展和算力的提高,神经网络的层数不断被提高,这种比较多层的神经网络就被命名为“深度学习”。不可否认的是,在实践中深度学习模型取得了非常好的效果。
最早知道“神经网络”这个名词是在七八年前的数学建模竞赛资料大全里,记得当时感觉什么神经网络,蚁群算法,模拟退火fancy的不行。谁也没想到,仅仅过了几年,神经网络就已经成为明星般的存在。其中原因包含下面两个:1. 随着 multi-core CPU 和 GPU 的发展,计算能力足以支持复杂神经网络的计算;2. 产生可用的数据量越来越大,而神经网络正是在训练数据量达到一定程度的时候才能发挥作用。最开始提出的是前向神经网络(feed forward neural network),之后又有卷积神经网络(convolutional neural network)和 循环神经网络(recurrent neural network)等。
我们知道给定输入向量 x1 和权重矩阵 w1,w2 ,神经网络模型是如何输出 x3 。但是,在实际问题中我们最开始除了网络的机构以外,是不知道权重w1,w2的,所给的数据仅仅是输入向量 x1以及其所对应的标签 y1 。于是,这就需要我们用手头上的数据来“训练”神经网络,所谓的“训练”就是估计权重矩阵w1,w2.
要建立一个待训练的神经网络,需要确定以下要素:
1.确定神经网络的结构(如图一所示),具体包括各层的神经元个数,激活函数的选择,神经元连接方式等。
2.确定损失函数。不同的损失函数对应不同的目的,不过总的来说分为分类神经网络和回归神经网络。
确定参数优化方式。参数优化一般都是用的梯度下降法,不同的优化方法在细节方面会有一些差异。
三、使用pytorch搭建前向神经网络
import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
batch_size = 64
learning_rate = 1e-2
num_epochs = 5
use_gpu = torch.cuda.is_available()
train_dataset = datasets.FashionMNIST(
root='../datasets', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = datasets.FashionMNIST(
root='../datasets', train=False, transform=transforms.ToTensor())
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
# 基本的网络构建类模板
class net_name(nn.Module):
def __init__(self):
super(net_name, self).__init__()
self.conv1 = nn.Conv2d(3, 10, 3)
def forward(self, x):
out = self.conv1(x)
return out
# 定义简单的前馈神经网络
class neuralNetwork(nn.Module):
def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim):
super(neuralNetwork, self).__init__() # super()
self.layer1 = nn.Sequential(
nn.Linear(in_dim, n_hidden_1),
nn.ReLU(True))
self.layer2 = nn.Sequential(
nn.Linear(n_hidden_1, n_hidden_2),
nn.ReLU(True))
self.layer3 = nn.Sequential(
nn.Linear(n_hidden_2, out_dim),
nn.ReLU(True))
# 定义向前传播
def forward(self, x):
x = self.layer1(x)
x = self.layer2(x)
x = self.layer3(x)
return x
model = neuralNetwork(28 * 28, 300, 100, 10)
if use_gpu:
model = model.cuda()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)