实验名称:实验二、神经网络

一、实验目的

(1)掌握神经网络的 BP 算法原理与实现方法;
(2)神经网络的构建、训练和测试方法。

二、实验内容

(1)BP算法

使用 Python 语言编程实现标准 BP 算法和累积 BP 算法,在 wine 数据集(wine_data.csv)上分别使用这两个算法训练一个单隐层网络(如,13×100×3),并进行比较。要求:
1)学习率 e 在[0.001, 0.5]内,分析 e 的大小对算法性能的影响;
2)绘制均方误差随训练轮数的变化曲线;
3)改变隐层神经元的个数,观察网络的性能,进行分析;
4)输出混淆矩阵和准确率。

说明:
1)wine 数据集的最后一列为 wine 的类别;
2)建议标准 BP 算法的学习率 e 选在[0.001, 0.1]内,使用试错法选出合适值;
3)建议累积 BP 算法的学习率 e 选在[0.05, 0.5]内,使用试错法选出合适值,设置适当的循环轮数。

(2)TensorFlow使用

使用 TensorFlow(或 Pytorch)建立一个 4 层神经网络(如,13×16×50×10×3),对 wine 数据集(wine_data.csv)进行分类。要求:
1)学习率 e 在[0.001, 0.01]内;
2)绘制均方误差、准确率随训练轮数的变化曲线;
3)改变隐层神经元的个数,观察网络的性能,进行分析;
4)(选做)从训练数据集中留出一部分测试数据,进行验证,输出混淆矩阵和准确率。

三、实验代码和过程

(1)bp算法

1)导包

import seaborn as sn
import pandas as pd
import numpy as np
from sklearn.metrics import confusion_matrix
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
from sklearn.utils import shuffle

2)设置随机种子

seed = 2022
import random
np.random.seed(seed)  # Numpy module.
random.seed(seed)  # Python random module.

3)归一化

def preprocess(data):ss = StandardScaler()X = data.drop('class',axis='columns')Y = data['class']# print(Y[0])X = ss.fit_transform(X)x,y = np.array(X),np.array(Y).reshape(Y.shape[0],1)return x,y

4)累积BP算法

def accumulate_BP(x,y,dim=10,eta=0.1,max_iter=1000):n_samples = x.shape[0]w1 = np.zeros((x.shape[1],dim))b1 = np.zeros((n_samples,dim))w2 = np.zeros((dim,1))b2 = np.zeros((n_samples,1))losslist = []for ite in range(max_iter):##前向传播u1 = np.dot(x,w1)+b1out1 = sigmoid(u1)u2 = np.dot(out1,w2)+b2out2 = sigmoid(u2)loss = np.mean(np.square(y - out2))/2losslist.append(loss)print('iter:%d  loss:%.4f'%(ite,loss))##反向传播##标准BPd_out2 = -(y - out2)d_u2 = d_out2*d_sigmoid(out2)d_w2 = np.dot(np.transpose(out1),d_u2)d_b2 = d_u2d_out1 = np.dot(d_u2,np.transpose(w2))d_u1 = d_out1*d_sigmoid(out1)d_w1 = np.dot(np.transpose(x),d_u1)d_b1 = d_u1##更新w1 = w1 - eta*d_w1w2 = w2 - eta*d_w2b1 = b1 - eta*d_b1b2 = b2 - eta*d_b2##Loss可视化plt.figure()plt.plot([i+1 for i in range(max_iter)],losslist)plt.legend(['accumlated BP'])plt.xlabel('iteration')plt.ylabel('loss')plt.show()return w1,w2,b1,b2

5)标准BP算法

def standard_BP(x,y,dim=100,eta=0.1,max_iter=500):n_samples = 1w1 = np.zeros((x.shape[1],dim))b1 = np.zeros((n_samples,dim))w2 = np.zeros((dim,1))b2 = np.zeros((n_samples,1))losslist = []for ite in range(max_iter):loss_per_ite = []for m in range(x.shape[0]):xi,yi = x[m,:],y[m,:]xi,yi = xi.reshape(1,xi.shape[0]),yi.reshape(1,yi.shape[0])##前向传播u1 = np.dot(xi,w1)+b1out1 = sigmoid(u1)u2 = np.dot(out1,w2)+b2out2 = sigmoid(u2)loss = np.square(yi - out2)/2loss_per_ite.append(loss)print('iter:%d  loss:%.4f'%(ite,loss))##反向传播##标准BPd_out2 = -(yi - out2)d_u2 = d_out2*d_sigmoid(out2)d_w2 = np.dot(np.transpose(out1),d_u2)d_b2 = d_u2d_out1 = np.dot(d_u2,np.transpose(w2))d_u1 = d_out1*d_sigmoid(out1)d_w1 = np.dot(np.transpose(xi),d_u1)d_b1 = d_u1##更新w1 = w1 - eta*d_w1w2 = w2 - eta*d_w2b1 = b1 - eta*d_b1b2 = b2 - eta*d_b2losslist.append(np.mean(loss_per_ite))##Loss可视化plt.figure()plt.plot([i+1 for i in range(max_iter)],losslist)plt.legend(['standard BP'])plt.xlabel('iteration')plt.ylabel('loss')plt.show()return w1,w2,b1,b2

5)测试

    u1 = np.dot(x,w1)+b1out1 = sigmoid(u1)u2 = np.dot(out1,w2)+b2out2 = sigmoid(u2)# print(out2)y_pred = np.round(out2)# print(y_pred)result = pd.DataFrame(np.hstack((y,y_pred)),columns=['真值','预测'] )result.to_excel('result_numpy.xlsx',index=False)

(2)TF使用

1)导包

import os
import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as pltfrom tensorflow import keras
from keras import layers

2)数据处理

data_num = data.shape[0]
indexes = np.random.permutation(data_num)
train_indexes = indexes[:int(data_num * 0.6)]
val_indexes = indexes[int(data_num * 0.6):int(data_num * 0.8)]
test_indexes = indexes[int(data_num * 0.8):]train_data = data.loc[train_indexes]
val_data = data.loc[val_indexes]
test_data = data.loc[test_indexes]train_validation_data = pd.concat([train_data, val_data])
mean = train_validation_data.mean()
std = train_validation_data.std()train_data = (train_data - mean) / std
val_data = (val_data - mean) / stdx_train = np.array(train_data.drop('class', axis='columns'))
y_train = np.array(train_data['class'])
x_val = np.array(val_data.drop('class', axis='columns'))
y_val = np.array(val_data['class'])

3)构建神经网络训练

model = keras.Sequential(name = 'model-1')
model.add(layers.Dense(16, activation='relu', input_shape=(13,)))
model.add(layers.Dense(50, activation='relu'))
model.add(layers.Dense(10, activation='relu'))
model.add(layers.Dense(3))
model.summary()model.compile(keras.optimizers.Adam(0.001),loss=keras.losses.MeanSquaredError(),metrics=[keras.metrics.MeanAbsoluteError()])history = model.fit(x_train, y_train,batch_size = 64,epochs = 300,validation_data = (x_val, y_val),)

4)绘制曲线

# 绘制曲线
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
lns1 = ax1.plot(np.arange(1000), fig_loss, label="Loss")
# 按一定间隔显示实现方法
# ax2.plot(200 * np.arange(len(fig_accuracy)), fig_accuracy, 'r')
lns2 = ax2.plot(np.arange(1000), fig_accuracy, 'r', label="Accuracy")
ax1.set_xlabel('iteration')
ax1.set_ylabel('training loss')
ax2.set_ylabel('training accuracy')
# 合并图例
lns = lns1 + lns2
labels = ["Loss", "Accuracy"]
# labels = [l.get_label() for l in lns]
plt.legend(lns, labels, loc=7)
plt.show()

四、实验结果截图及结果分析

(1)BP算法

1)标准BP算法

1、研究学习率

学习率0.1

学习率0.01

学习率0.001

分析:在迭代次数为500次,隐藏层为10的前提下,提高学习率可以加快损失值的下降收敛,提高算法的性能。

2、研究神经元个数

隐藏层为1

隐藏层为10

隐藏层为100

隐藏层为1000

分析:在学习率为0.1,迭代次数为500前提下,隐藏层需设置比较低的值,但是不宜过低,隐藏层设置太高会导致曲线紊乱。

2)累计BP算法

1、研究学习率

学习率为0.5

学习率为0.1

学习率为0.05

分析:在隐藏层为10,迭代次数为500的前提下,学习率过高的情况导致曲线瞬间完成收敛结果不可靠,学习率需要低一些但是随着学习率降低收敛速度会下降,导致算法性能降低。

2、研究神经元个数

隐藏层为1

隐藏层为10

隐藏层为20

隐藏层为50

分析:在学习率为0.1,迭代次数为500前提下,隐藏层越低算法性能越高,隐藏层越高,曲线越容易紊乱,隐藏层到50以上曲线直接崩溃。

3、混淆矩阵和准确率

(2)TF使用

1)研究学习率

学习率为0.01

学习率为0.005

学习率为0.001

分析:由上述结果可知,在一定范围内随着学习率的增加,算法性能先提高后降低。所以为了提高算法性能我们可以选增加学习率,但首先要确定好大概范围。

2)绘制曲线

分析:loss随着迭代次数降低收敛,准确率随着迭代次数上升收敛

3)研究神经元个数(学习率为0.005)

中间层为50

中间层为100

中间层为500

中间层为1000


分析:算法性能随着节点个数增加,先提高后降低。

机器学习——神经网络实验(附全过程代码)相关推荐

  1. 这篇Nature子刊文章的蛋白组学数据PCA分析竟花费了我两天时间来重现|附全过程代码...

    复现PCA原图之蛋白组学数据 NGS系列文章包括NGS基础.转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这).ChIP-seq分析 (ChIP-seq基本分析流程).单细胞测序 ...

  2. bp神经网络预测python代码_机器学习之多层神经网络(附Python代码和数据)

    1 引言 多层神经网络,Multiple-layers Perceptron (MLP),又被称为多层感知机,是机器学习中深度学习的典型算法.关于多层神经网络的算法原理,我们在Stata和R实现的文章 ...

  3. 实战篇:如何用Keras建立神经网络(附全部代码)

    摘要: 机器学习实战篇:用简单的代码打造属于自己的神经网络模型- Keras是目前最受欢迎的深度学习库之一,对人工智能的商业化做出了巨大贡献.它使用起来非常简单,它使你能够通过几行代码就可以构建强大的 ...

  4. 【雷达】线性调频脉冲雷达仿真实验附matlab代码

    1 内容介绍 在MATLAB上实现线性调频信号(LMCW)的脉冲压缩(PC).动目标显示 (MTI)和动目标检测(MTD).解速度度模糊以及恒虚警率检测(CFAR)等信号 处理算法.(本实验原内容为D ...

  5. python 神经网络_推荐 :用Python实现神经网络(附完整代码)!

    Datawhale干货   作者:[美]霍布森·莱恩,科尔·霍华德 在学习神经网络之前,我们需要对神经网络底层先做一个基本的了解.我们将在本节介绍感知机.反向传播算法以及多种梯度下降法以给大家一个全面 ...

  6. python决策树代码解读_建模分析之机器学习算法(附pythonR代码)

    0序 随着移动互联和大数据的拓展越发觉得算法以及模型在设计和开发中的重要性.不管是现在接触比较多的安全产品还是大互联网公司经常提到的人工智能产品(甚至人类2045的的智能拐点时代).都基于算法及建模来 ...

  7. 用Python实现神经网络(附完整代码)!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:[美]霍布森·莱恩,科尔·霍华德 在学习神经网络之前,我们需要对神 ...

  8. 最适合初学者的21个机器学习项目,附实战代码+数据集

    大家好,平时大家看机器学习视频教程或者书籍时,是不是总有一种自己已经精通的感觉,但当你尝试去应用它时,可能会发现它比看起来更难.而「项目」可帮助你快速提高应用技巧,同时让你有机会探索有趣的主题. 此外 ...

  9. 机器学习稀疏矩阵简介(附Python代码)

    对于一个矩阵而言,若数值为零的元素远远多于非零元素的个数,且非零元素分布没有规律时,这样的矩阵被称作稀疏矩阵:与之相反,若非零元素数目占据绝大多数时,这样的矩阵被称作稠密矩阵. 稀疏矩阵在工程应用中经 ...

最新文章

  1. 破解加密PDF文件pdfcrack
  2. python爬虫入门实例-Python爬虫快速入门:基本结构简单实例
  3. [JLOI2011]不重复数字
  4. awr报告分析 mysql_AWR报告的生成和简单分析方法
  5. 看完白鹤滩水电站建造历程 感觉《流浪地球》那些真能造出来
  6. IM、RTC技术两生花,看融云如何打造“IM+RTC+Push”一站式通信云服务
  7. matlab r如何看曲线图,MATLAB 提取图片中的曲线数据重新画图
  8. 利用iis服务器创建站点,如何使用iis建立一个网站
  9. sja1000 CAN控制器波特率计算方法详解
  10. 计算机更新bios,小编教你如何升级bios
  11. xCat 批量安装系统
  12. 简单又实用的MRP手机平台下软件及游戏破解方法
  13. Chaotica for Mac(分形艺术作品创作工具)
  14. 利用计算机及网络系统支持考试的方式是,2012年7月全国自主考试(网络操作系统)真题...
  15. 高压直流电源为什么要“接地”?如何“接地”?
  16. Ubuntu2Go制作使用和资料说明(LinuxtoGo)
  17. 智慧工地安全施工实时监测系统解决方案
  18. 首届“攀升玩创嘉年华”端午江城噶事!
  19. Android中动态生成ListView及SimpleAdapter的使用
  20. 每日一题 11.3 账户合并

热门文章

  1. java 微信公众号之授权登录
  2. 中文汉字转阿拉伯数字
  3. c语言程序设计 大学考试题库,广东工业大学《C语言程序设计》考试复习重点题库.pdf...
  4. 为什么现在的视频都会加入自动字幕功能?
  5. 五年以太扩容梦 破壁原是枕边人——记2016年G神与V神的ETH 2.0路线之争
  6. C++ 函数:accumulate()
  7. From Seeing to Moving: A Survey on Learning for Visual Indoor Navigation (VIL)
  8. android 的悬浮窗口,Android 之 悬浮窗口
  9. 【LeetCode - 362】敲击计数器
  10. 学会Python如何利用业余时间赚外快?分享几个接单途径