主要内容
- 熟悉numpy和pandas扩展库(可见往期博客)
- 理解逻辑回归模型实现鸢尾花分类
- mnist手写体识别
线性回归模型
线性回归是通过使用y=ax+b,通过调整a和b的值来使这条直线趋近于所有的数据点,即让他们的方差(或标准差)最小,而他们的方差是一个凸函数,所以可以通过求导,得到变化的趋势,从而降低方差,得到a和b的最优解。
到逻辑回归
sigmod函数,他将所有的x的值都映射在了0-1之间,这样也可以将其看成输入一个x值时总能得到一个唯一的0-1的概率
1 | # sigmod绘制代码 |
逻辑回归就是在线性回归的基础上加了一个sigmod函数,将分母上面的那个Z替换为一个Z = W0+W1X1+W2X2+…+WnXn, 再用一个代价函数表示预测值与真实值之间的差距,这个代价函数常用的是最小二乘法,也就是方差,也可以是交叉熵损失函数。
有了损失函数就可以利用梯度下降法,通过多次训练将损失函数减到最低的所有的w的值。X的个数代表了特征的维度
这里的表述可能不是很标准,其中的推导过程要复杂的多
鸢尾花识别
该数据集测量了所有150个样本的4个特征,分别是:
sepal length(花萼长度)
sepal width(花萼宽度)
petal length(花瓣长度)
petal width(花瓣宽度)
以上四个特征的单位都是厘米(cm)。
通常使用m表示样本量的大小,n表示每个样本所具有的特征数。因此在该数据集中,m=150,n=4
二维特征鸢尾花识别及可视化(以花瓣宽和长进行逻辑回归为例)
1 | from sklearn import datasets |
四维特征鸢尾花识别
1 | from sklearn.model_selection import train_test_split |
使用pytorch,卷积神经网络实现mnist手写体识别
在本次识别任务中,我选择了卷积神经网络(CNN)的做法来实现,mnist数据是28*28的图片及其表示的数字标签,数据导入可以使用pytorch自带的mnist数据进行测试训练,分析原数据得知,训练数据60000,测试数据10000。
神经网络结构
由于数据非常单一,且容易识别,所以选择了较为简单的神经网络结构,两层1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20class ConvNet(nn.Module):
def __init__(self):
super().__init__()
self.conv1=nn.Conv2d(1,10,5) # input:(1,28,28) output:(10,24,24)
self.conv2=nn.Conv2d(10,20,3) # input:(10,12,12) output:(20,10,10)
self.fc1 = nn.Linear(20*10*10,500)
self.fc2 = nn.Linear(500,10)
def forward(self,x):
in_size = x.size(0)
out = self.conv1(x)
out = F.relu(out)
out = F.max_pool2d(out, 2, 2)
out = self.conv2(out)
out = F.relu(out)
out = out.view(in_size,-1)
out = self.fc1(out)
out = F.relu(out)
out = self.fc2(out)
out = F.log_softmax(out,dim=1)
return out
训练部分代码
1 | def train(model, device, train_loader, optimizer, epoch): |
测试部分代码
1 | def test(model, device, test_loader): |
完整代码
1 | import torch |