神经网络设计过程
案例: 鸢尾花分类
鸢尾花三种类别:
三种: 狗尾巴 杂草 小腹肌
通过搭建一个神经网络来对鸢尾花进行分类
收集花朵 的特征值: 四种
花萼长
花萼宽
花瓣长
花瓣宽
以及:
三种输出结果
狗尾巴 杂草 小腹肌
操作方法:
1.收集数据集,花的特征,以及这些花是什么品种,即 标签。
2.将数据集 训练模型。通过反向传播训练。
3.将不知道品种的花的特征输入模型,自动出来花的种类。
神经网络模型:
输入神经元 4个,输出神经元3个
4个是花的四个特征
3个是三种花
连接关系是12个,全连接,也成为全连接网络。
权重w和偏置b也会被随机分配初始化为0-1的数。
神经网络是由多个神经元组成的。
单个神经元结构图:
如下图,注意非线性函数也叫激活函数。
前面的输入到求和部分,细分为下图
前向传播:
代入训练集 的 x ,到模型里面,输出y的过程,称之为 前向传播。
最初的参数w和b是随机产生的,所以,刚开始模型输出的结果很可能不对,是随便的。
但是要将模型输出的结果和真实值进行做差,平方求和,从而得到损失函数。
损失函数:
当损失函数最小,出现的w和b即为最优解。
损失函数有多个方式: 均方误差是最常见的。
因此,目的变成了 寻找一组w和b,让损失函数最小。
最常见的方法,即为 梯度下降法。
梯度下降法:
梯度下降法 还涉及 一个新的概念 叫做 学习率:
公式如下
如果梯度下降比作,是从半山腰往下走的话。
学习率:就是下山的步幅长度。
下面是一个经典的梯度下降示意图
获取数据代码
from sklearn import datasets
from pandas import DataFrame
import pandas as pd
# .data返回iris数据集所有输入特征
x_data = datasets.load_iris().data
y_data = datasets.load_iris().target
# .target返回iris数据集所有标签
# 为表格增加行索引(左侧)和列标签(上方)
x_data = DataFrame(x_data, columns=['花萼长度', '花萼宽度', '花瓣长度', '花瓣宽度'])
# 设置列名对齐
pd.set_option('display.unicode.east_asian_width', True)
# 新加一列,列标签为‘类别’,数据为y_data
x_data['类别'] = y_data
划分 训练集 和 测试集
训练集 训练模型
测试集 验证模型
一共150行数据:其中75%作为训练集,即120行;25%作为测试集,即后30行。
注意这里使用了seed随机种子函数,目的是为了在打乱x和y的同时,采用相同的随机数可以
保证其仍然是一一对应的关系。
之所以采用随机,是因为 模仿人的大脑,这里人在学习如何辨识花朵种类的时候,输入的也是无规律的数据。
# 导入所需模块
import tensorflow as tf
from sklearn import datasets
from matplotlib import pyplot as plt
import numpy as np
# 导入数据,分别为输入特征和标签
x_data = datasets.load_iris().data
y_data = datasets.load_iris().target
# 随机打乱数据(因为原始数据是顺序的,顺序不打乱会影响准确率)
# seed: 随机数种子,是一个整数,当设置之后,每次生成的随机数都一样(为方便教学,以保每位同学结果一致)
np.random.seed(16) # 使用相同的seed,保证输入特征和标签一一对应
np.random.shuffle(x_data)
np