PaddlePaddle实现多层神经网络
欢迎大家来到这次实验,在这次实验中我们将使用PaddlePaddle来实现一个多层神经网络,这个多层神经网络包含2个隐藏层,并且在隐藏层中使用到了Relu激活函数,在最后的输出层使用了Softmax激活函数。多层神经网络具有比逻辑回归更强的学习能力,并且更适合解决多分类问题,现在让我们进入实验来看看多层神经网络与逻辑回归之间的差异性吧!
你将学会
-
实现一个具有两个隐藏层的神经网络,用于解决多分类问题
-
使用batch_norm做数据归一化
-
在隐藏层中使用Relu激活函数
-
在输出层使用Softmax激活函数
-
使用classification_cost
-
使用Adam作为优化器
现在让我们进入实验吧!
1 - 引用库
首先,载入几个需要用到的库,它们分别是:
- numpy:一个python的基本库,用于科学计算
- matplotlib.pyplot:用于生成图,在验证模型准确率和展示成本变化趋势时会使用到
- paddle.fluid:paddle 的新一代的版本
- os:在本例中用于获取文件或目录的路径
- csv:用于对csv文件的存储和读取等操作
In[2]
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
import os
import csv
import paddle
import paddle.fluid as fluid
from __future__ import print_function
try:
from paddle.fluid.contrib.trainer import *
from paddle.fluid.contrib.inferencer import *
except ImportError:
print(
"In the fluid 1.0, the trainer and inferencer are moving to paddle.fluid.contrib",
file=sys.stderr)
from paddle.fluid.trainer import *
from paddle.fluid.inferencer import *
%matplotlib inline
问题描述:
红酒的品种多样,质量也有高低之分,质量的好坏决定了红酒的价格定位,假设你被聘为一家红酒供应商的红酒质量鉴定专家,红酒供应商给你提供了一些红酒的指标值和评分数据,希望你能从这些数据中学习到红酒的质量鉴定方法。
你的目标:
构建一个多层神经网络来对红酒质量评分
数据集分析:
红酒数据集是采集于葡萄牙北部“Vinho Verde”葡萄酒的数据,它是研究Classification/Regression模型训练的经典数据集。这个数据集包含了红白两种葡萄酒的数据,在本实验中采用了红酒数据作为实验数据,红酒的数据包含 11 个特征值(指标)和一个 0-10 的评分值(由于隐私等问题,在特征值中不包含价格、品牌等因素,只涵盖了红酒的物理化学性质因素):
输入值:
- fixed acidity 固定酸度
- volatile acidity 挥发性酸度
- citric acid 柠檬酸
- residual sugar 残糖
- chlorides 氯化物
- free sulfur dioxide 自由二氧化硫
- total sulfur dioxide 总二氧化硫
- density 密度
- pH pH值
- sulphates 硫酸盐
- alcohol 酒精
输出值:
12 - quality (0-10的评分) 质量
2 - 数据预处理
文件路径
红酒数据被存储在当前文件夹下的 data 目录中,data 目录中共有两个数据文件,分别是:
- winequality-red.csv:红(葡萄)酒数据
- winequality-white.csv:白(葡萄)酒数据
我们暂时先使用数据量较少的红酒数据来训练模型,当然你可以在完成实验后,使用白(葡萄)酒数据来重新训练或者验证你的模型。
In[3]
# 获得当前文件夹
cur_dir = os.path.dirname(os.path.realpath("__file__"))
# 获得文件路径
filename = cur_dir + "/winequality-red.csv"
载入数据
首先,我们使用csv.reader()来读取红酒数据,并存入data数组中,输出数据的属性和一组值。
In[4]
with open(filename) as f:
reader = csv.reader(f)
data = []
for row in reader:
data.append([i for i in row[0].split(';')])
print( data[0],"\n" )
print( data[1] )
['fixed acidity', '"volatile acidity"', '"citric acid"', '"residual sugar"', '"chlorides"', '"free sulfur dioxide"', '"total sulfur dioxide"', '"density"', '"pH"', '"sulphates"', '"alcohol"', '"quality"']
['7.4', '0.7', '0', '1.9', '0.076', '11', '34', '0.9978', '3.51', '0.56', '9.4', '5']
可以看到,数据中存储了关于红酒的11类特征值和1个标签值(分数)。
预处理
现在让我们对数据进行一些预处理操作。观察上面输出的数据样例,我们发现数据是以字符串的形式存储的,并且第一行数据(data[0])存储的是属性,而不是具体的数据,所以我们需要去除第一行数据,并且将剩余的数据类型转换为np.float32的numpy数组。这一操作十分简单,只需要使用 np.array(array).astype(type) 即可完成。 例如,我们有一个 list 为 arr = ['1', '2', '3']
,我们使用 np.array(arr).astype(np.float32)
既可以将其转化为 numpy 类型的数据。
练习:
取出除第一行外的数据,并将数据类型转换为 np.float32 的 numpy 数组。
特别需要注意除了第一行外,其他的每一行都要转化,所以,可以考虑使用切片技术,将除了第一行意外的数据都放入
np.array()
切片技术:data[5:] 表示从下标为 5 的位置开始向后取得所有的行
In[49]