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

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

一、实验目的

(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)+b1
        out1 = sigmoid(u1)
        u2 = np.dot(out1,w2)+b2
        out2 = sigmoid(u2)
        loss = np.mean(np.square(y - out2))/2
        losslist.append(loss)
        print('iter:%d  loss:%.4f'%(ite,loss))
        ##反向传播
        ##标准BP
        d_out2 = -(y - out2)
        d_u2 = d_out2*d_sigmoid(out2)
        d_w2 = np.dot(np.transpose(out1),d_u2)
        d_b2 = d_u2
        d_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_w1
        w2 = w2 - eta*d_w2
        b1 = b1 - eta*d_b1
        b2 = 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 = 1
    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):
        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)+b1
            out1 = sigmoid(u1)
            u2 = np.dot(out1,w2)+b2
            out2 = sigmoid(u2)
            loss = np.square(yi - out2)/2
            loss_per_ite.append(loss)
            print('iter:%d  loss:%.4f'%(ite,loss))
            ##反向传播
            ##标准BP
            d_out2 = -(yi - out2)
            d_u2 = d_out2*d_sigmoid(out2)
            d_w2 = np.dot(np.transpose(out1),d_u2)
            d_b2 = d_u2
            d_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_w1
            w2 = w2 - eta*d_w2
            b1 = b1 - eta*d_b1
            b2 = b2 - eta*d_b2
        losslist.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)+b1
    out1 = sigmoid(u1)
    u2 = np.dot(out1,w2)+b2
    out2 = 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 plt

from 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) / std

x_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

在这里插入图片描述
分析:算法性能随着节点个数增加,先提高后降低。

神经网络实验步骤详细分析具体-神经网络大作业(一).doc 本人做的神经网络实验,步骤详细,分析具体,适合做入门学习用-I do neural network experiments, the steps detailed analysis of specific, suitable for entry to study 截取某些内容,方便参考: 用BP网络识别雷达测速的三类信号 一.数据来源      此信号来自一部测速雷达获得的三种目标的回波信号,三种目标分别是行人W、自行车B和卡车T,信号中包含目标的速度信息。 二.信号的分析与处理      根据所给的三类信号的样本,每一个样本中均包含1024个数据,由于每一个样本的数据量较大,不可能将所有1024个数据全都作为神经元的输入,计算量太大,所以必须首先对信号进行分析,提取最有价值的特征信息。      首先可以看看每一个样本中的数据图,以各类信号中的第一个样本为例,如图1所示。 (1)                                       (2)                                        (3) 图1 (1)行人数据图  (2)自行车数据图  (3)卡车数据图              从上图的时域数据基本上观察不出规律,因此我们要对数据进行傅立叶变换,从频域分析数据的特征,如下图2所示。 图2 行人数据频谱图 从上图中看到行人的数据的频谱的幅度很小,原因是因为信号在零点处的值特别大,所以要将在零点处的值去掉,得到如图3所示。 图3 行人数据去掉零点后的频谱图 这时可以观察到信号的一些特征,从图中发现信号的频谱图是基本对称分布的,而且信号的峰值也很大,可以对它首先进行归一化,如下图4所示。 图4 (1)行人数据归一化后的频谱图 (2)取绝对值后的频谱图 同时将自行车和卡车的频谱图来做比较如图5,6所示 图5 (1)自行车数据归一化后的频谱图        (2)取绝对值后的频谱图 图6 (1)卡车数据归一化后的频谱图              (2)取绝对值后的频谱图 从上面三幅图中,可以观察到信号都有明显的峰值,但是出现的位置不同,另外,信号的均值和方差明显不同。但是考虑到雷达所测数据中,会有一些速度反常规的游离数据,所以考虑采用受游离数据影响小的平均绝对值偏差来代替样本方差作为输入特征。同时,以数据的样本中位数来作为输入特征来减少游离数据的影响。根据这些特征进行提取来作为输入。 三.特征提取 1.取信号归一化后的均值作为一个特征量。 2.取信号归一化后的平均绝对值偏差作为一个特征量。 3.取信号归一化后的样本中位数作为一个特征量。 4.由三幅图的比较可以发现,信号的每两点之间的起伏程度也不尽相同,所以可以设定一个特征量,来纪录信号两点间的起伏程度的大小。 5.信号在经过归一化后,可以将信号全部的值加起来,用这个总的值来作为一个特征量。 除了上述的特征,还有很多特征可以提取,但是特征越多,需要的输入神经元越多,依照隐层神经元约为输入神经元的两倍的原则,隐层的神经元也将越多。则网络训练的时间将花费很大。所以,本实验只提取了上述特征中的1,2,3。 四.算法与实现 根据提取的特征的维数,来决定输入神经元的个数。因为提取的三个特征的维数分别为8,1和1,所以输入神经元的个数为10。输出神经元的个数定为3个,考虑到被识别的三种信号分别对应三个输出,虽然用两个神经元就可以表示三种输出状态,但是用三个神经元能更好地分辨,减少出错的概率。至于隐层的神经元个数则按照约为输入神经元个数的两倍的原则,设为20个。当然还可以在调试过程中根据输出的识别率来找到一个一个较为合适的个数。
<think>好的,我需要帮助用户在Ubuntu 18.04上安装和配置ROS Melodic以及UR5机械臂的相关环境。首先,我得回忆一下安装ROS Melodic的标准步骤,以及可能遇到的依赖问题。根据用户提供的引用,特别是引用[1]和[4],涉及到使用apt安装ROS包,比如ros-melodic-moveit-simple-controller-manager。还有引用[3]提到Melodic和Kinetic的资源较多,用户可能需要这些资源来配置UR5。 首先,安装ROS Melodic的标准流程应该是设置sources.list,添加密钥,更新apt,然后安装完整版ROS。接着初始化rosdep,这一步有时候会遇到网络问题,可能需要多次尝试或者换源。然后配置环境变量,自动添加到.bashrc中。这些步骤用户可能已经了解,但需要详细说明。 接下来是配置UR5的支持包。用户可能需要的包包括universal_robot的仓库,这通常托管在GitHub上。需要克隆相应的仓库到工作空间的src目录,然后安装依赖,这里可能涉及到rosdep install。之后用catkin_make编译整个工作空间。编译完成后,需要source setup.bash使环境变量生效。这部分可能需要检查是否有遗漏的依赖,比如moveit相关的包,引用[4]提到了安装ros-melodic-moveit-simple-controller-manager,所以用户如果遇到依赖问题,可能需要手动安装这个包。 用户可能会遇到的问题包括:依赖安装失败,编译错误,或者运行示例时的权限问题。例如,某些ROS节点可能需要执行权限,或者USB设备的权限问题。此外,虚拟机环境下的配置可能有额外的步骤,如引用[3]提到的使用虚拟机安装Ubuntu系统,可能需要检查虚拟机的USB设置是否正确。 另外,用户可能希望使用MoveIt来控制UR5,所以需要确认moveit的包是否安装正确。引用[4]中的命令是手动安装依赖的例子,这可能是在编译过程中发现缺失依赖时的解决方案。因此,在指导用户时,需要强调在编译前运行rosdep install,同时也要准备好手动安装某些依赖的可能。 最后,测试部分建议用户运行示例启动文件,并检查UR5在Gazebo或Rviz中的表现。如果出现模型无法加载的情况,可能需要检查模型路径是否正确,或者相关的模型包是否安装。此外,用户可能需要参考官方文档或社区资源,如引用[3]提到的持续更新的教程,来获取最新信息或解决特定问题。 总结步骤应该是:安装ROS Melodic → 创建Catkin工作空间 → 克隆UR5相关包 → 安装依赖 → 编译 → 配置环境 → 测试。需要确保每一步都清晰,并提示可能的问题和解决方法。同时,根据用户提供的引用,适当引用相关指令,如手动安装依赖的命令,以增加答案的可信度。</think>### 在Ubuntu 18.04上安装配置ROS Melodic与UR5机械臂的步骤 #### 1. 安装ROS Melodic **步骤说明**: - **添加ROS仓库**: 配置软件源并添加密钥,确保系统能访问ROS Melodic的官方包: ```bash sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt update ``` - **安装完整版ROS**: 安装基础功能包及常用工具(如MoveIt、Gazebo插件): ```bash sudo apt install ros-melodic-desktop-full ``` - **初始化rosdep**: 用于管理依赖关系(若网络超时可尝试多次执行或更换国内镜像源): ```bash sudo rosdep init rosdep update ``` - **配置环境变量**: 将ROS环境变量自动添加到终端: ```bash echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc source ~/.bashrc ``` #### 2. 配置UR5机械臂支持包 **步骤说明**: - **创建Catkin工作空间**: 用于编译UR5相关ROS包: ```bash mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make ``` - **克隆UR5官方仓库**: 从GitHub获取UR机械臂的ROS驱动和模型文件: ```bash cd ~/catkin_ws/src git clone https://github.com/ros-industrial/universal_robot.git ``` - **安装依赖项**: 使用`rosdep`自动安装依赖(若失败需手动补充安装,如引用[4]提到的包): ```bash rosdep install --from-paths src --ignore-src -y # 手动补充依赖示例(若提示缺失) sudo apt install ros-melodic-moveit-simple-controller-manager # 引用[4] ``` - **编译工作空间**: 确保所有包正确编译: ```bash cd ~/catkin_ws catkin_make source devel/setup.bash ``` #### 3. 验证与测试 **步骤说明**: - **启动UR5仿真**: 在Gazebo中加载UR5模型: ```bash roslaunch ur_gazebo ur5.launch ``` - **使用MoveIt控制**: 在Rviz中通过MoveIt规划运动: ```bash roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch sim:=true ``` - **物理硬件连接**: 若需连接真实UR5机械臂,需配置URCap和网络通信(参考[官方文档](https://github.com/UniversalRobots/Universal_Robots_ROS_Driver))。 #### 常见问题解决 - **依赖安装失败**: 根据编译错误提示手动安装缺失包,例如: ```bash sudo apt install ros-melodic-industrial-core # 引用[1]类似格式 ``` - **虚拟机兼容性**: 若使用虚拟机(如VMware),需启用USB 3.0支持以确保机械臂通信正常(引用[3]提到虚拟机安装场景)。 - **权限问题**: 添加用户到`dialout`组以访问串口: ```bash sudo usermod -a -G dialout $USER ``` #### 相关资源推荐 - **GitHub仓库**: [universal_robot](https://github.com/ros-industrial/universal_robot) 提供UR5的ROS驱动和配置文件。 - **教程参考**: [ROS Wiki - UR5 Tutorial](http://wiki.ros.org/ur5/Tutorials) 包含详细的使用指南。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

freezing?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值