darknet是一个用纯c语言开发的基于cudnn的深度学习框架,有python的接口,在目标检测领域具有非常重要的影响力,支持cpu和gpu,cpu版本就不多说了,下面介绍如何编译gpu版本的darknet

1、下载源代码

官网githup地址:https://github.com/pjreddie/darknet

# 用git命令下载
git clone https://github.com/pjreddie/darknet.git

因为githup在国外,如果觉得下载有点慢,我本地已经提前下载,下载地址:darknet-master.zip

# 用wget命令下载
wget -c -t 20 https://www.ivdone.top/wordpress/pic/p1710/darknet-master.zip

2、编译安装gpu版本darknet

先设置环境变量,查看你的cuda安装目录,比如我的安装目录如下:

/usr/local/cuda

darknet需要nvcc的命令,需要导出环境变量

# 编辑bashrc文件
vi ~/.bashrc
# 添加下面的环境变量,然后保存
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
export CUDA_HOME=/usr/local/cuda
export PATH=/usr/local/cuda/bin:$PATH

如果是本地下载,则解压并进入darknet目录

unzip darknet-master.zip
mv darknet-master darknet
cd darknet/

编辑Makefile文件,修改配置

# 编辑bashrc文件,然后保存
vi Makefile

编译

# 在Makefile文件同级目录直接make
make

成功编译后会产出下面的二进制文件,静态和动态链接库文件

到现在你已经完成darknet的GPU版本的安装,请尽情享受吧

0
Posted in 深度学习&强化学习, 研究, 问题解决

paper 的地址:Intelligent Laser Welding through Representation, Prediction, and Control Learning: An Architecture with Deep Neural Networks and Reinforcement Learning

中文翻译:通过表达、预测、控制学习实现智能的激光焊接:一个基于深度学习和强化学习的架构

1 简介

这篇 paper 主要是教机器学会焊接。

如上图,焊接的质量是分质量好质量坏的。上图是质量好的焊接,右图是质量不好的焊接。其中,质量的好坏是通过焊接的平整度来区分的。

目的: 实现智能激光焊接系统的快速建立和焊接系统的灵活性。

成果: 一个自学习和自提升的激光焊接系统。

关键的技术:
(1)使用深度学习来提取特征
(2)使用强化学习来预测和控制

2 算法的架构

该算法主要包括 3 个部分。

(1)表达
基于深度学习算法,对传感器数据进行降维,提取出重要的特征。

(2)预测
基于时间差分法的强化学习对焊接过程进行预测,建立知识库模型

(3)控制
根据强化学习的预测结果,选择 value 最大的 action,进行相应的动作。

2.1 表达

(1)数据的采集
传感器为工业相机和光电二极管。由于获取的数据是多维度的和多模态的,很那直接应用于控制算法,因此将原始的数据转换到低维的数据空间中。

(2)业界常用的方法
主成分分析、线性离散化分析、深度自编码技术。

(3)作者的方法
作者使用了 深度学习+自编码技术,能够有效的防止过拟合,鲁棒性更强。
为了证明作者说的这些优点,论文之后将深度自编码技术与主成分分析的方法进行了对比,通过数据表明深度自编码技术具有更好的效果。

2.1.1 表达——深度自编码提取特征

作者的模型就是我们常见的自编码模型。如下图所示。

分为编码和解码两部分。图中的 x 层输入数据,h5 层是提取的特征,之后进行解码,y 层是重建后的数据。

通过将解码的数据(对应于图中的 y 层)与原始的数据(对应于图中的 x 层)进行比较,计算 loss 值,训练神经网络。

这个 loss 值是重构的误差。具体的 loss 构建方法,这里不作概述,一般是均方误差。

2.1.2 表达——训练神经网路的小 tip

作者在训练神经网路的时候,使用了一个小 tip:Greedy layer-wise pre-training

如上图所示。

首先,作者训练了一个传统的自编码神经网络(图 a)。训练好这个网络后,保留编码器部分的权值(图 b)。保留好 W1 部分的权值后,增加一层隐藏层 h2(图 c),训练 h1 到 y 之间的神经网络,训练好后,仍旧保留编码器部分的权值(即保留 w2,图 d)。依次循环步骤 c 和步骤 d,直到建立完整的神经网络。

最后,输入数据,对整个神经网络进行训练,对参数进行微调。

总之,作者的思路是依次单独训练每一层,然后再对整个神经网络进行训练。

2.1.3 表达——深度学习训练结果 1

文中,从不同的角度和不同的距离下的 16000 张激光焊接图像进行训练。分别采取了不同维度的特征向量:4 维、8 维、16 维、32 维、64 维。将文中的算法与 PCA 算法进行了对比试验。最后,利用 SVM 算法进行了分类。

从表中可以看到,深度自编码在 16 维特征的时候,具有更小的分类误差率。而且,相比于 PCA 方法,效果更好。

2.1.4 表达——深度学习训练结果 2

(1)为了更好将特征进行可视化,依次将 16 维特征向量的当前位置置 1,其他的置 0。之后利用解码器进行解码,得到了上图的原始图像和 DNN 特征。

(2)从山图可以看出,算法很好的重建了原始的焊缝图像,重构误差很小。

2.2 预测

(1)目的
通过焊接的动作、过程和焊接的质量,建立知识库模型,从而实现对焊接的未来动作进行预测。

(2)常见的方法
系统模型、查找表等。这些方法的精确度不高,算法的鲁棒性差。同时,目前的预测学习主要是基于线性的模型,不能够很好的适应于非线性系统。

(3)作者的方法
采用基于时间差分法的强化学习进行预测。能够很好的适应实时和多时间尺度问题。

时间差分法是强化学习中的一种常用的方法。如果不是很清楚这种方法,可以查看哔哩哔哩网站的李宏毅老师的强化学习课程。

2.2.1 预测——强化学习预测

如上图,通过输入焊接的动作、过程和焊接的质量,建立一个知识库(即图中的经验池)。通俗的来讲,经验池里存储了当前状态当前动作下,可能的焊接质量。比如,A 状态下,焊点向右移动,焊接质量会增加。这个焊接的质量是之前的“表达”部分来评估出来的。即通过深度自编码提取出来的特征来评估焊接的质量。

有了经验池后,当前状态下,便可以通过查询经验池,获得下一步最佳的动作。从而能够预测未来焊接的动作。

2.2.2 预测——强化学习预测结果

如图,是预测部分的结果。绿色的线或红色的线表示实际的焊接质量。蓝色的线表示预测的焊接质量。

图 1:训练过程中的预测结果。可以看到,预测结果和实验结果很吻合。

图 2:在未知的过程中,一次迭代训练的结果。可以看出,预测的结果与实际的曲线基本一致。但是系统预测的误差比较大。

图 3:在未知的过程中,模型训练收敛之后的预测结果。可以看到图 3 比图 2 更好地完成了未知过程的预测。

图 4:在未知的过程中,时间差分法的预测结果。

从图 4 可以看到,时间差分法中,预测的焊接质量和真实的焊接质量是基本吻合的,而且误差比较小。

图 4 比图 1 的误差比较大,是因为图 1 是在训练样本上得出的结果。而图 4 中包含了未训练的样本。实际的应用场景中会有很多的未训练过的样本。

2.3 控制

(1)目的
对焊接的动作和过程进行控制。

(2)常用的方法
PID 控制、自适应控制、模糊控制。这些方法的缺点是比较耗时,算法不能很好的解决条件变化,鲁棒性比较差。

(3)作者的方法
使用 AC(执行者—评价者)的强化学习算法,根据评价者学习的策略来执行动作。可以适应多变的场景。

在 2.2 节说到,在经验池已经存储了“经验”。因此,在提取出传感器数据的特征数据后,系统可以根据当前的特征数据和“经验池”中的数据,来计算机一条最优的策略(焊接动作的策略)。从而实现质量好的焊接。AC 模型是主要内容就是,评论者会评价当前不同策略的好坏,提出一条最优的策略,然后执行者来执行这条策略。

3 实验的整体结果

文中利用 ANSYS 仿真软件做了激光焊接的仿真实验,验证了强化学习控制算法的有效性。

上图:焊接电源、奖励、测量误差等参数的变化结果
(a)高斯分布均值
(b)高斯分布方差
(c)激光强度
(d)奖励
(e)焊接深度
(f)焊接的方差

关键是看 d 图、e 图、f 图。可以看到,焊接的奖励逐渐增加,焊接的深度也增加,而焊接的方法逐渐减小。说明这个系统是可以工作的。

4 总结

(1)提出了一个新的焊接自学习架构。该结构能够实现焊接过程的观察、知识系统的建立和焊接过程的控制。

(2)关键的技术是将深度学习和强化学习融入到了激光的焊接过程中。

(3)该架构和算法可以应用于其他的应用场景。

0
Posted in Literature, 深度学习&强化学习

本文内容同个人微信号推送文章:神经情景控制(Neural Episodic Control)

原论文地址:Neural Episodic Control

1 深度强化学习面临的问题

深度强化学习面临的问题——学习速度慢,学习时间长

(1)Stochastic gradient descent optimisation requires the useof small learning rates. (梯度下降需要较小的学习率。)

(2)Environments with a sparse reward signal can be difficultfor a neural network to model as there may be very fewinstances where the reward is non-zero. (极少情况下奖励为非零。)

如果奖励a,b,c为非零奖励,则根据算法要增强每个行为的概率。但是变化前后概率和都为1,因此变化后,有的行为的概率会减小。

(3)Reward signal propagation by value-bootstrapping tech-niques, such as Q-learning, results in reward informationbeing propagated one step at a time through the history ofprevious interactions with the environment. (用价值引导技术进行奖励信号传播。如 Q-学习,这导致每与环境交互一次奖励信息就按先前存储器传播一步。反馈信号传播慢。)

2 神经情景控制——架构


神经情景控制由三个部分组成,分别是一个处理二维图像s的卷积神经网络、一系列存储器模块以及一个将行为存储器读出到值的网络。

神经情景控制,就是一种能够快速吸收新经验基于此采取行动的深度强化学习代理。

3 DND(可微神经字典)


存储模块 Ma=(Ka,Va), hi is the i-th element of the array Ka.

按照键h执行查找输出为o(存储器价值的加权和):

k(x,y) is a kernel between vectors x and y.

不足之处:占用了更多的磁盘空间存储数据

可微神经字典有两种操作:

4 ε-greedy policy(ε贪心策略)

NEC的流程为:

对于每个action都有一个可微神经字典M_{a}

当从环境中接收到State S_{t}和嵌入层参数h后,使用3中的公式计算得到Q(s_{t},a)

之后使用ε-greedy policy来选取action,选取action后获得reward。

ε-greedy policy为:

即有ε的概率随机选择一个action,而有1-ε的概率选择Q值的最大值对应的action。

5 存储器值更新

在4中,选取action获得reward后的流程为:

将键值对(h,{\color{Red} Q^{(N)}(S_{t},a_{t})})存储进可微神经字典里面(N为N-Step Q估计)。并且将(s_{t},a_{t},Q^{(N)}(s_{t},a_{t}))存储进D(D为replay memory)。reply memory为一个经验存储空间,可以用于离线测试数据。

N-step Q估计的计算方法为:

如键值对已经存在,则将其更新;如果不存在就新增键值对。

6 N-step Q估计推导

Q-learning 中两种常用的衡量value的方式,一种MC方式,一种是TD方式。

7 训练模型


D为replay buffer,存储了经验。可以用于离线训练样本。


训练模型的步骤为:

(1)sampled mini-batches from a replay buffer
(2)calculate predicted Q value by NEC.
(3)minimising L2 loss between the predicted Q value for a given action and the Q(N) estimate

即:

8 实现结果

论文提供的结果:

9 总结

0
Posted in 深度学习&强化学习

判断输入的2个整型数据是否在0-100之间,如果是则求和,如果不是则报错是不合法的输入。

# -*- coding: utf-8 -*-
"""
Created on Mon Feb 24 20:46:49 2020
@author: Administrator
题目:判断输入的2个整型数据是否在0-100之间,如果是则求和,如果不是则报错是不合法的输入
"""

a,b = map(int, input('输入2个0-100之间的整数:').split())
if 0<=a<=100 and 0<=b<=100:
    sum = a+b
    print('{}+{}={}'.format(a,b,sum))
else:
    print('不满足条件')

0
Posted in 深度学习&强化学习

本文内容同个人微信号推送文章:经典卷积神经网络(Classic Convolutional Neural Networks)

AlexNet(2012)

AlexNet是2012年ImageNet竞赛冠军获得者Hinton和他的起学生Alex Krizhevsky设计的卷积神经网络。在比赛中取得了top-5错误率为15.3%的成绩。

AlexNet的网络结构

AlexNet的网络结构如下图所示:

AlexNet网络由8层组成,5层卷积层和3层全连接层。每层卷积层后面都有池化层。

输入:ImageNet数据集。训练集包含120万张图片,验证集包含5万张图片,测试集包含15万张图片。这些图片分为了1000个类别。

AlexNet有以下特点:

特点1:ReLU(Rectified Linear Unit) Nonlinearity

AlexNet使用了Relu激活,并验证了其效果在较深的网络超过了Sigmoid激活函数。Sigmoid函数在网络较深的时候会出现梯度弥散问题。

Sigmoid函数:

当时用sigmoid函数作为激活函数时,随着网络层数的增加(隐藏层),训练误差反而会增大。靠近输出层的隐含层梯度较大,参数更新速度快,很快就会收敛;靠近输入层的隐含层梯度较小,参数更新速度慢,几乎和初始状态一样;在含有四个隐藏层的网络中,第一层比第四层满了可能会接近100倍,即出现梯度弥散现象。

sigmoid函数的导数:

sigmoid函数计算量较大,在反向传播的过程中求导数涉及到了除法;反向传播过程中还可能出现梯度消失的现象;函数的敏感区间较短,(-1,1)之间敏感,超过区间将处于饱和状态。

Relu函数为:

Using ReLU nonlinearity, CNNs could be trained much faster.

Reasons:
1. No complicated math.数学公式简单,计算速度快。
2. It converges faster. The slope doesn’t plateau when x gets large. 当x变大的时候,不会梯度弥散或梯度消失。
3. It’s sparsely activated. Since ReLU is zero for all negative inputs, some units may not be activated. 具有稀疏性,当x为负值的时候,梯度为0,神经元将不会被训练。

Relu函数的导数:
当x小于等于0时,导数为0;当x大于0的时候,导数为1。
Relu函数的导数在大于0的时候,梯度为常数,因此不会导致梯度弥散。但是Relu函数在负半区的导数为0,当神经元激活值进入负半区的时候,梯度为0,这个神经元将不会被训练,即具有稀疏性。

特点2:Data Augmentation(Reduce Overfitting)

AlexNet对图像进行了数据增强,缓解了图像的过拟合,提高模型的泛化能力。具体来说,对图片的四个角加中间共5个位置,并进行左右翻转,一共获得10张图片,之后对10次的结果求平均值。数据增强的方法主要有两种:对图像进行镜像对称或者随机裁剪图片。

1.对图像进行镜像对称

Data Augmentation by Mirroring

2.随机裁剪图片

Data Augmentation by Random Crops

在原图和镜像反射的图(256*256)中随机抽取227*227的块。

特点3:Dropout(Reduce Overfitting)

使用Dropout随机忽略一部分神经元,从而避免了模型的过拟合。

A neuron is dropped from the network with a probability of 0.5.

以0.5的概率断开某些神经元的连接(即从全连接变为非全连接)。

通过Dropout操作也可以提高模型的准确性。

特点4:最大池化

重叠使用了最大池化。之前卷积神经网络普遍使用了平均池化,而AlexNet全部使用了最大池化,避免了平均池化的模糊效果。

0
Posted in 深度学习&强化学习