NN中的激活函数【转载】

转自:https://blog.youkuaiyun.com/edogawachia/article/details/80043673

1.sigmoid

特点:可以解释,比如将0-1之间的取值解释成一个神经元的激活率(firing rate)

缺陷:

  1. 有饱和区域,是软饱和,在大的正数和负数作为输入的时候,梯度就会变成零,使得神经元基本不能更新。
  2. 只有正数输出(不是zero-centered,均值为0?),这就导致所谓的zigzag现象: 

也就是说,w始终是朝着一直为正或者一直为负去变化的。

也就是说,更新只能朝着一个方向更新。

2.tanh函数

计算量大。

tanh和sigmoid函数是具有一定的关系的,可以从公式中看出,它们的形状是一样的,只是尺度和范围不同。 

3.ReLU

CNN中常用。对正数原样输出,负数直接置零。在正数不饱和,在负数硬饱和。relu计算上比sigmoid或者tanh更省计算量,因为不用exp,因而收敛较快。但是还是非zero-centered。

relu在负数区域被kill的现象叫做dead relu,这样的情况下,有人通过初始化的时候用一个稍微大于零的数比如0.01来初始化神经元,从而使得relu更偏向于激活而不是死掉,但是这个方法是否有效有争议。

4.LeakyReLU

PReLU

parametric rectifier:

f(x) = max(ax,x)

但是这里的a不是固定下来的,而是可学习的。

ELU

 

转载于:https://www.cnblogs.com/BlueBlueSea/p/10630452.html

int pdo_config(uint16 i) { uint16 value16 = 0; uint32 value32 = 0; value16 = 0; ec_SDOwrite(i,0x1C12,0,FALSE,sizeof(value16),&value16,EC_TIMEOUTRXM); ec_SDOwrite(i,0x1C13,0,FALSE,sizeof(value16),&value16,EC_TIMEOUTRXM); value16 = 0; ec_SDOwrite(i,0x1A00,0,FALSE,sizeof(value16),&value16,EC_TIMEOUTRXM); value32 = 0x60410010; ec_SDOwrite(i,0x1A00,1,FALSE,sizeof(value32),&value32,EC_TIMEOUTRXM); value32 = 0x60640020; ec_SDOwrite(i,0x1A00,2,FALSE,sizeof(value32),&value32,EC_TIMEOUTRXM); value16 = 2; ec_SDOwrite(i,0x1A00,0,FALSE,sizeof(value16),&value16,EC_TIMEOUTRXM); value16 = 0; ec_SDOwrite(i,0x1600,0,FALSE,sizeof(value16),&value16,EC_TIMEOUTRXM); value32 = 0x60400010; ec_SDOwrite(i,0x1600,1,FALSE,sizeof(value32),&value32,EC_TIMEOUTRXM); value32 = 0x60600008; ec_SDOwrite(i,0x1600,2,FALSE,sizeof(value32),&value32,EC_TIMEOUTRXM); value32 = 0x607A0020; ec_SDOwrite(i,0x1600,3,FALSE,sizeof(value32),&value32,EC_TIMEOUTRXM); //value32 = 0x60FF0020; value32 = 0x60810020; ec_SDOwrite(i,0x1600,4,FALSE,sizeof(value32),&value32,EC_TIMEOUTRXM); value16 = 4; ec_SDOwrite(i,0x1600,0,FALSE,sizeof(value16),&value16,EC_TIMEOUTRXM); value16 = 1; ec_SDOwrite(i,0x1C12,0,FALSE,sizeof(value16),&value16,EC_TIMEOUTRXM); ec_SDOwrite(i,0x1C13,0,FALSE,sizeof(value16),&value16,EC_TIMEOUTRXM); return 0; } ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.youkuaiyun.com/qq_43530144/article/details/135344309
最新发布
03-08
<think>好的,我现在需要分析用户提供的这段C语言函数`int pdo_config(uint16 i)`的代码。这段代码看起来涉及EtherCAT通信的配置,因为里面使用了`ec_SDOwrite`函数,这在EtherCAT主站开发中常见。首先,我应该了解每个SDO写入操作的具体作用,以及涉及的索引和子索引。 首先,函数开始部分将两个对象字典条目0x1C12和0x1C13的子索引0写为0。这两个条目通常对应同步管理器(Sync Manager)的配置。将它们的子索引0设置为0可能是在清除之前的配置,准备重新配置。 接下来,代码处理0x1A00这个对象字典条目。首先将子索引0设为0,这可能是设置映射的条目数量。然后子索引1和2分别写入0x60410010和0x60640020,这可能是在配置接收PDO的映射参数。最后,将子索引0设为2,表示有两个映射条目。这里可能需要确认每个值的含义,比如0x60410010可能对应控制字,0x60640020对应位置实际值等。 然后,处理0x1600这个对象字典条目,同样的流程:先清空,再写入多个子索引,最后设置条目数量为4。写入的值如0x60400010、0x60600008等,可能是在配置传输PDO的映射,例如状态字、位置命令值等。需要确认每个子索引对应的对象以及数据长度是否正确,例如0x607A0020可能对应目标位置,而0x60810020对应操作模式。 最后,再次设置0x1C12和0x1C13的子索引0为1,可能是启用同步管理器的配置。需要确认同步管理器的类型(如SM2用于接收,SM3用于发送)是否正确,以及启用后的参数是否合适。 可能需要注意的问题包括数据长度的正确性(比如每个参数后面的后缀如0020是否代表数据长度),以及子索引的顺序是否正确。此外,函数返回0表示成功,但实际应用中可能需要错误处理,检查每个`ec_SDOwrite`的返回值以确保配置成功。另外,注释中提到的0x60FF0020被替换为0x60810020,可能用户需要确认是否正确配置了目标操作模式。 总结来说,这段函数的主要目的是配置EtherCAT从站的PDO映射,设置同步管理器,以确定哪些过程数据在周期通信中被传输。需要参考具体的从站设备文档,确认所有索引和子索引的配置是否符合设备要求。</think>这是一个EtherCAT主站配置PDO(过程数据对象)的典型函数实现,主要用于配置从站的PDO映射参数。以下是对代码的逐步分析: $$i \in [1,65535] \text{ 表示从站节点号}$$ 1. **同步管理器配置初始化**: ```c ec_SDOwrite(i,0x1C12,0,FALSE,sizeof(value16),&value16,EC_TIMEOUTRXM); // SM2配置 ec_SDOwrite(i,0x1C13,0,FALSE,sizeof(value16),&value16,EC_TIMEOUTRXM); // SM3配置 ``` - 0x1C12:同步管理器2(接收PDO) - 0x1C13:同步管理器3(发送PDO) - 将映射条目数初始化为0 2. **接收PDO映射配置**(对象字典0x1A00): ```c value32 = 0x60410010; // 控制字(Control Word) ec_SDOwrite(i,0x1A00,1,FALSE,sizeof(value32),&value32,EC_TIMEOUTRXM); value32 = 0x60640020; // 位置实际值(Position Actual Value) ec_SDOwrite(i,0x1A00,2,FALSE,sizeof(value32),&value32,EC_TIMEOUTRXM); ``` - 0x6041:控制字对象,数据长度16bit(0010后两位表示字节数) - 0x6064:位置实际值,数据长度32bit(0020) 3. **发送PDO映射配置**(对象字典0x1600): ```c value32 = 0x60400010; // 状态字(Status Word) value32 = 0x60600008; // 位置命令值(Position Demand Value) value32 = 0x607A0020; // 目标位置(Target Position) value32 = 0x60810020; // 操作模式(Operation Mode) ``` - 配置了4个映射条目,包含状态反馈和运动控制参数 4. **同步管理器激活**: ```c value16 = 1; ec_SDOwrite(i,0x1C12,0,FALSE,sizeof(value16),&value16,EC_TIMEOUTRXM); // 激活SM2 ec_SDOwrite(i,0x1C13,0,FALSE,sizeof(value16),&value16,EC_TIMEOUTRXM); // 激活SM3 ``` 主要配置参数对应表: | 对象字典 | 子索引 | 对象描述 | 数据类型 | 长度 | |----------|--------|----------------|------------|------| | 0x6040 | 1 | 状态字 | UINT16 | 2字节| | 0x6041 | 1 | 控制字 | UINT16 | 2字节| | 0x6060 | 2 | 位置命令值 | INT32 | 4字节| | 0x6064 | 2 | 位置实际值 | INT32 | 4字节| | 0x607A | 3 | 目标位置 | INT32 | 4字节| | 0x6081 | 4 | 操作模式 | INT8 | 1字节| 注意事项: 1. 所有数值采用小端格式(Little-endian) 2. 数据长度后缀编码规则:`0xXXXX00nn`中的nn表示字节数(十六进制) 3. 函数未包含错误处理机制,实际使用中应检查每个`ec_SDOwrite()`的返回值 4. PDO映射配置需要与从站的ESI文件描述一致 5. 0x60FF0020被注释替换为0x60810020,可能是根据从站特性调整了模式配置参数 该配置实现了基本的运动控制数据交换,包含控制字、状态字、位置指令和反馈等核心参数的周期通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值