神经网络与深度学习(五)前馈神经网络(3)鸢尾花分类


请添加图片描述

前言

本篇文章是深度学习第七周的实验内容,实践基于前馈神经网络完成鸢尾花分类任务,我们一起来学习吧(ง •_•)ง

导入需要用到的库:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets

import copy

import torch.nn as nn
import numpy as np
import torch
from sklearn.datasets import load_iris

import torch.optim as opt
import torch.nn.functional as F

深入研究鸢尾花数据集

画出数据集中150个数据的前两个特征的散点分布图:

iris = datasets.load_iris()
X = iris.data[:, :2]  # 只取前两维特征
y = iris.target
h = .02  # 网格中的步长
C = 1.0  # SVM正则化参数
svc = svm.SVC(kernel='linear', C=C).fit(X, y)  # 线性核
rbf_svc = svm.SVC(kernel='rbf', gamma=0.7, C=C).fit(X, y)  # 径向基核
poly_svc = svm.SVC(kernel='poly', degree=3, C=C).fit(X, y)  # 多项式核
lin_svc = svm.LinearSVC(C=C).fit(X, y)  # 线性核


x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                     np.arange(y_min, y_max, h))

titles = ['SVC with linear kernel',
          'LinearSVC (linear kernel)',
          'SVC with RBF kernel',
          'SVC with polynomial (degree 3) kernel']

for i, clf in enumerate((svc, lin_svc, rbf_svc, poly_svc)):
    # 绘出决策边界,不同的区域分配不同的颜色
    plt.subplot(2, 2, i + 1)  # 创建一个2行2列的图,并以第i个图为当前图
    plt.subplots_adjust(wspace=0.4, hspace=0.4)  # 设置子图间隔

    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])  # 将xx和yy中的元素组成一对对坐标,作为支持向量机的输入,返回一个array

    # 把分类结果绘制出来
    Z = Z.reshape(xx.shape)  # (220, 280)
    plt.contourf(xx, yy, Z)

    # 将训练数据以离散点的形式绘制出来
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap="brg")
    plt.xlabel('Sepal length')
    plt.ylabel('Sepal width')
    plt.xlim(xx.min(), xx.max())
    plt.ylim(yy.min(), yy.max())
    plt.xticks(())
    plt.yticks(())
    plt.title(titles[i])
plt.show()

运行结果:
在这里插入图片描述

4.5 实践:基于前馈神经网络完成鸢尾花分类

继续使用第三章中的鸢尾花分类任务,将Softmax分类器替换为前馈神经网络。

损失函数:交叉熵损失;
优化器:随机梯度下降法;
评价指标:准确率。

4.5.1 小批量梯度下降法

在梯度下降法中,目标函数是整个训练集上的风险函数,这种方式称为批量梯度下降法(Batch Gradient Descent,BGD)。 批量梯度下降法在每次迭代时需要计算每个样本上损失函数的梯度并求和。当训练集中的样本数量N很大时,空间复杂度比较高,每次迭代的计算开销也很大。

为了减少每次迭代的计算复杂度,我们可以在每次迭代时只采集一小部分样本,计算在这组样本上损失函数的梯度并更新参数,这种优化方式称为小批量梯度下降法(Mini-Batch Gradient Descent,Mini-Batch GD)。

第t次迭代时,随机选取一个包含K个样本的子集Bt,计算这个子集上每个样本损失函数的梯度并进行平均,然后再进行参数更新。
在这里插入图片描述
其中K为批量大小(Batch Size)。K通常不会设置很大,一般在1∼100之间。在实际应用中为了提高计算效率,通常设置为2的幂2n

在实际应用中,小批量随机梯度下降法有收敛快、计算开销小的优点,因此逐渐成为大规模的机器学习中的主要优化算法。
此外,随机梯度下降相当于在批量梯度下降的梯度上引入了随机噪声。在非凸优化问题中,随机梯度下降更容易逃离局部最优点。

小批量随机梯度下降法的训练过程如下:
在这里插入图片描述

为了小批量梯度下降法,我们需要对数据进行随机分组。

目前,机器学习中通常做法是构建一个数据迭代器,每个迭代过程中从全部数据集中获取一批指定数量的数据。
数据迭代器的实现原理如下图所示:
在这里插入图片描述
1.首先,将数据集封装为Dataset类,传入一组索引值,根据索引从数据集合中获取数据;
2.其次,构建DataLoader类,需要指定数据批量的大小和是否需要对数据进行乱序,通过该类即可批量获取数据

4.5.2 数据处理
#加载数据集
def load_data(shuffle=True):
    #加载原始数据
    X = np.array(load_iris().data, dtype=np.float32)
    y = np.array(load_iris().target, dtype=np.int64)

    X = torch.as_tensor(X)
    y = torch.as_tensor(y)

    #数据归一化
    X_min = torch.min(X, dim=0)
    X_max = torch.max(X, dim=0)
    X = (X-X_min.values) / (X_max.values-X_min.values)

    #如果shuffle为True,随机打乱数据
    if shuffle:
        idx = torch
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值