AI-02a5a1.神经网络概念和前向

神经网络

神经元模型

在这里插入图片描述

神经元接收到来自 n 个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接进行传递,神经元接收到的总输入值将与神经元的阈值进行比较,然后通过“激活函数”处理以产生神经元的输出。

在这里插入图片描述

激活函数

神经网络中的激活函数及其各自的优缺点、以及如何选择激活函数_神经网络的激活函数有哪些?他们对神经网络的性能有何影响。-优快云博客

什么是激活函数

所谓激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。

激活函数对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到我们的网络中。如上图,在神经元中,输入(inputs )通过加权,求和后,还被作用在一个函数上,这个函数就是激活函数。

为什么要使用激活函数

如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。

如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。

激活函数为什么是非线性的

如果使用线性激活函数,那么输入跟输出之间的关系为线性的,无论神经网络有多少层都是线性组合。

使用非线性激活函数是为了增加神经网络模型的非线性因素,以便使网络更加强大,增加它的能力,使它可以学习复杂的事物,复杂的表单数据,以及表示输入输出之间非线性的复杂的任意函数映射。

输出层可能会使用线性激活函数,但在隐含层都使用非线性激活函数

常用的激活函数

sigmoid 函数

sigmoid函数又称 Logistic函数,用于隐层神经元输出,取值范围为(0,1),可以用来做二分类。

sigmoid函数表达式: σ ( x ) = 1 1 + e − x \sigma (x) = \frac{1}{1+e^{-x}} σ(x)=1+ex1

它的导数为: d σ d x = σ ( x ) ( 1 − σ ( x ) ) \frac{d\sigma}{dx} = \sigma(x)(1-\sigma(x)) dxdσ=σ(x)(1σ(x))

优点

  1. Sigmoid函数的输出在(0,1)之间,输出范围有限,优化稳定,可以用作输出层。
  2. 连续函数,便于求导

缺点

  1. sigmoid函数在变量取绝对值非常大的正值或负值时会出现饱和现象,意味着函数会变得很平,并且对输入的微小改变会变得不敏感。在反向传播时,当梯度接近于0,权重基本不会更新,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。
  2. sigmoid函数的输出不是0均值的,会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响。
  3. 计算复杂度高,因为sigmoid函数是指数形式。
Relu 函数

Relu 的函数表达式: y = { x x > 0 , 0 x ≤ 0 y= \begin{cases} x & x>0,\\ 0 & x \le 0 \end{cases} y={x0x>0,x0
它的导数为: ∂ y ∂ x = { 1 x > 0 , 0 x ≤ 0 \frac{\partial y}{\partial x}= \begin{cases} 1 & x>0,\\ 0 & x \le 0 \end{cases} xy={10x>0,x0

优点:

  1. 使用ReLU的SGD算法的收敛速度比 sigmoid 和 tanh 快。
  2. 在x>0区域上,不会出现梯度饱和、梯度消失的问题。
  3. 计算复杂度低,不需要进行指数运算,只要一个阈值就可以得到激活值。

缺点:

  1. ReLU的输出不是0均值的。
  2. Dead ReLU Problem(神经元坏死现象):ReLU在负数区域被kill的现象叫做dead relu。ReLU在训练的时很“脆弱”。在x<0时,梯度为0。这个神经元及之后的神经元梯度永远为0,不再对任何数据有所响应,导致相应参数永远不会被更新。

产生这种现象的两个原因:参数初始化问题;learning rate太高导致在训练过程中参数更新太大。
解决方法:采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

3层神经网络和输出层的实现

"""
3层神经网络的实现

"""

import numpy as np
  

""" 激活函数:sigmoid函数 """
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

"""初始化神经网络"""
def init_network():
    network = {}
    network['W1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0., 0.6]])
    network['b1'] = np.array([0.1, 0.2, 0.3])
    network['W2'] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
    network['b2'] = np.array([0.1, 0.2])
    network['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]])
    network['b3'] = np.array([0.1, 0.2])
    return network

"""前向传播"""
def forward(network, x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']

    a1 = np.dot(x, W1) + b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1, W2) + b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, W3) + b3
    y = sigmoid(a3)
    return y

""" 输出层:softmax函数 """
def softmax(a):
    c = np.max(a) # 溢出对策
    exp_a = np.exp(a - c)
    return exp_a / np.sum(exp_a)

if __name__ == "__main__":
    network = init_network()
    x = np.array([1.0, 5.0])
    y = forward(network, x)
    print(y)

    a = np.array([0.3, 2.9, 4.0])
    y = softmax(a)
    print(y)
    print(y.sum())

softmax

y k = e x p ( a k ) ∑ i = 1 n e x p ( a i ) y_k = \frac{exp(a_k)}{\sum_{i=1}^nexp(a_i)} yk=i=1nexp(ai)exp(ak)

SELECT T391.FuserId AS FuserId --??ID ,T391.FASNId391 AS FASNId391 --?????ID ,T391.FcompanyId391 AS FcompanyId391 --??ID ,T391.FwarehouseId391 AS FwarehouseId391 --??ID ,T046C.Fnumber046 AS FwarehouseId391Number --???? ,T046C.FbarcodeId046 AS FwarehouseId391Barcode --???? ,T046C.Fname046 AS FwarehouseId391Name --???? ,T391.FcustomerId391 AS FcustomerId391 --??ID ,T046A.Fnumber046 AS FcustomerId391Number --???? ,T046A.Fname046 AS FcustomerId391Name --???? ,T391.FASNnumber391 AS FASNnumber391 --??????? ,T391.FinterfaceNumberA391 AS FinterfaceNumberA391 --????A ,T391.FinterfaceNumberB391 AS FinterfaceNumberB391 --????B ,T391.FinterfaceNumberC391 AS FinterfaceNumberC391 --????C ,T391.FsysTypeId391 AS FsysTypeId391 --????ID ,T391.FbillTypeId391 AS FbillTypeId391 --????? ,T346.Fnumber346 AS FbillTypeId391Number --????? ,T346.Fname346 AS FbillTypeId391Name --??????? ,T391.FdeliveryTime391 AS FdeliveryTime391 --???? ,T391.FbillTime391 AS FbillTime391 --???? ,T391.FbillEmpId391 AS FbillEmpId391 --???ID ,T391.Fenabledflag391 AS fenabledflag391 --???? ,T046B.Fnumber046 AS FbillEmpId391Number --????? ,T046B.Fname046 AS FbillEmpId391Name --????? ,T391.FtotalLine391 AS FtotalLine391 --??? ,Fstate391 AS Fstate391 ,Fstate391 AS fnumber020 ,T391.FaddTime391 AS FaddTime391 --???? ,T391.FaddEmpId391 AS FaddEmpId391 --????ID ,T391.FaddEmpName391 AS FaddEmpName391 --?????? ,T391.FeditTime391 AS FeditTime391 --???? ,T391.FeditEmpId391 AS FeditEmpId391 --????ID ,T391.FeditEmpName391 AS FeditEmpName391 --?????? ,T391.Fmemo391 AS Fmemo391 --?? ,T391.FfirstInTime391 AS FfirstInTime391 --?????? ,T391.FlastInTime391 AS FlastInTime391 --?????? ,T391.UDF01A391 AS UDF01A391 -- ,T391.UDF02A391 AS UDF02A391 -- ,T391.UDF03A391 AS UDF03A391 -- ,T391.UDF04A391 AS UDF04A391 -- ,T391.UDF05A391 AS UDF05A391 -- ,T391.UDF06A391 AS UDF06A391 -- ,T391.UDF07A391 AS UDF07A391 -- ,T391.UDF08A391 AS UDF08A391 -- ,T391.UDF09A391 AS UDF09A391 -- ,T391.UDF10A391 AS UDF10A391 -- ,T391.UDF11A391 AS UDF11A391 -- ,T391.UDF12A391 AS UDF12A391 -- ,T391.UDF13A391 AS UDF13A391 -- ,T391.UDF14A391 AS UDF14A391 -- ,T391.UDF15A391 AS UDF15A391 -- ,T391.UDF16A391 AS UDF16A391 -- ,T391.UDF17A391 AS UDF17A391 -- ,T391.UDF18A391 AS UDF18A391 -- ,T391.UDF19A391 AS UDF19A391 -- ,T391.UDF20A391 AS UDF20A391 -- ,T391.UDF21N391 AS UDF21N391 -- ,T391.UDF22N391 AS UDF22N391 -- ,T391.UDF23N391 AS UDF23N391 -- ,T391.UDF24N391 AS UDF24N391 -- ,T391.UDF25N391 AS UDF25N391 -- ,T391.UDF26N391 AS UDF26N391 -- ,T391.UDF27N391 AS UDF27N391 -- ,T391.UDF28N391 AS UDF28N391 -- ,T391.UDF29N391 AS UDF29N391 -- ,T391.UDF30N391 AS UDF30N391 -- FROM WM_ASN391 T391 LEFT JOIN BS_basicData046 T046A --?? ON T391.FuserId = T046A.FuserId AND T391.FcustomerId391 = T046A.FbasicDataId046 LEFT JOIN BS_basicData046 T046B --??? ON T391.FuserId = T046B.FuserId AND T391.FbillEmpId391 = T046B.FbasicDataId046 LEFT JOIN BS_basicData046 T046C --?? ON T391.FuserId = T046C.FuserId AND T391.FwarehouseId391 = T046C.FbasicDataId046 LEFT JOIN BS_billType346 T346 --???? ON T391.FuserId = T346.FuserId AND T391.FbillTypeId391 = T346.FbillTypeId346 这是到货通知单 分析结构
最新发布
11-04
<think>我们有一个到货通知单表(WM_ASN391几个关联表(BS_basicData046用于客户、仓库、操作员等,BS_billType346用于单据类型)。 目标:分析这个查询的结构,理解每个字段的含义以及关联关系。 步骤如下: 1. 识别主表关联表。 2. 解释每个字段的含义(根据字段名别名推测)。 3. 分析关联条件。 主表:WM_ASN391(别名为T391) 关联表: - BS_basicData046(三个不同的别名:T046A, T046B, T046C) - BS_billType346(别名为T346) 字段分析(按顺序): 1. T391.FuserId -> ??ID (用户ID?) 2. T391.FASNId391 -> 到货通知单ID (主键) 3. T391.FcompanyId391 -> 公司ID 4. T391.FwarehouseId391 -> 仓库ID 关联表T046C(仓库): T046C.Fnumber046 -> 仓库编码 T046C.FbarcodeId046 -> 仓库条码 T046C.Fname046 -> 仓库名称 5. T391.FcustomerId391 -> 客户ID 关联表T046A(客户): T046A.Fnumber046 -> 客户编码 T046A.Fname046 -> 客户名称 6. 到货通知单相关编号: FASNnumber391 -> 到货通知单编号 FinterfaceNumberA391 -> 接口编号A FinterfaceNumberB391 -> 接口编号B FinterfaceNumberC391 -> 接口编号C 7. 单据类型: T391.FsysTypeId391 -> 系统类型ID(单据大类?) T391.FbillTypeId391 -> 单据类型ID(具体类型) 关联表T346(单据类型表): T346.Fnumber346 -> 单据类型编码 T346.Fname346 -> 单据类型名称 8. 时间信息: FdeliveryTime391 -> 交货时间 FbillTime391 -> 开单时间 FbillEmpId391 -> 开单人ID fenabledflag391 -> 启用标志(注意别名是小写,但实际字段可能是Fenabledflag391) 关联操作员(T046B): T046B.Fnumber046 -> 开人工号 T046B.Fname046 -> 开单人姓名 9. 其他信息: FtotalLine391 -> 总行数(可能指明细行数) Fstate391 -> 状态(直接取两次,分别用Fstate391fnumber020作为别名?这里可能是笔误,应该是两个字段?但这里只取了一次,给了两个别名) 注意:Fstate391被取了两次别名,分别为Fstate391fnumber020,这可能是因为在应用程序中需要两个不同的名字引用同一个状态值。 10. 添加信息: FaddTime391 -> 添加时间 FaddEmpId391 -> 添加人ID FaddEmpName391 -> 添加人姓名(这里直接取到了添加人姓名,没有通过关联表,可能是主表直接存储了) FeditTime391 -> 修改时间 FeditEmpId391 -> 修改人ID FeditEmpName391 -> 修改人姓名 11. 备注:Fmemo391 -> 备注 12. 入库时间: FfirstInTime391 -> 首次入库时间 FlastInTime391 -> 最后入库时间 13. 自定义字段(20个字符串字段,8个数字字段): UDF01A391 到 UDF20A391:字符串类型 UDF21N391 到 UDF30N391:数字类型 关联条件分析: 1. 关联客户(T046A): ON T391.FuserId = T046A.FuserId AND T391.FcustomerId391 = T046A.FbasicDataId046 说明:通过用户ID客户ID(即基础数据ID)关联到基础数据表的客户记录。 2. 关联操作员(开单人,T046B): ON T391.FuserId = T046B.FuserId AND T391.FbillEmpId391 = T046B.FbasicDataId046 说明:通过用户ID操作员ID(基础数据ID)关联。 3. 关联仓库(T046C): ON T391.FuserId = T046C.FuserId AND T391.FwarehouseId391 = T046C.FbasicDataId046 4. 关联单据类型(T346): ON T391.FuserId = T346.FuserId AND T391.FbillTypeId391 = T346.FbillTypeId346 注意:所有关联都使用了T391.FuserId等于关联表的FuserId,说明数据是按用户隔离的(多租户设计)。 问题点: 1. 状态字段Fstate391被取了两次别名(Fstate391fnumber020),但实际是同一个字段。这可能是因为端需要两个不同的字段名,或者是一个错误。 2. 添加人修改人的姓名直接存储在WM_ASN391表中(FaddEmpName391FeditEmpName391),而不是通过基础数据表关联获取。这可能是为了查询性能,但会导致数据冗余。 总结:这个查询用于获取到货通知单的详细信息,包括关联的仓库、客户、开单人、单据类型等,并包含大量的自定义字段。 我们可以尝试重写这个查询,使其更清晰(比如将状态字段的两次别名改为两个不同的字段,如果确实需要两个不同的状态值,那么可能是设计问题,因为目只有一个状态字段)。 但是,根据现有信息,我们只能按照原样解释。 由于原查询较长,我们将其整理并添加注释: </think>### 到货通知单查询结构分析 #### 数据结构详解 ```sql SELECT -- 主表基本信息 T391.FuserId AS FuserId, -- 用户ID(多租户隔离) T391.FASNId391 AS FASNId391, -- 到货通知单主键ID T391.FcompanyId391 AS FcompanyId391, -- 公司ID -- 仓库信息(关联BS_basicData046) T391.FwarehouseId391 AS FwarehouseId391, -- 仓库ID T046C.Fnumber046 AS FwarehouseId391Number, -- 仓库编码 T046C.FbarcodeId046 AS FwarehouseId391Barcode, -- 仓库条码 T046C.Fname046 AS FwarehouseId391Name, -- 仓库名称 -- 客户信息(关联BS_basicData046) T391.FcustomerId391 AS FcustomerId391, -- 客户ID T046A.Fnumber046 AS FcustomerId391Number, -- 客户编码 T046A.Fname046 AS FcustomerId391Name, -- 客户名称 -- 单据核心信息 T391.FASNnumber391 AS FASNnumber391, -- 到货通知单编号 T391.FinterfaceNumberA391 AS FinterfaceNumberA391, -- 接口编号A T391.FinterfaceNumberB391 AS FinterfaceNumberB391, -- 接口编号B T391.FinterfaceNumberC391 AS FinterfaceNumberC391, -- 接口编号C -- 单据类型(关联BS_billType346) T391.FsysTypeId391 AS FsysTypeId391, -- 系统类型ID T391.FbillTypeId391 AS FbillTypeId391, -- 单据类型ID T346.Fnumber346 AS FbillTypeId391Number, -- 单据类型编码 T346.Fname346 AS FbillTypeId391Name, -- 单据类型名称 -- 时间与操作人信息 T391.FdeliveryTime391 AS FdeliveryTime391, -- 交货时间 T391.FbillTime391 AS FbillTime391, -- 开单时间 T391.FbillEmpId391 AS FbillEmpId391, -- 开单人ID T391.Fenabledflag391 AS Fenabledflag391, -- 启用标志 T046B.Fnumber046 AS FbillEmpId391Number, -- 开单人编码 T046B.Fname046 AS FbillEmpId391Name, -- 开单人姓名 -- 状态信息 T391.FtotalLine391 AS FtotalLine391, -- 总行数(明细条目数) Fstate391 AS Fstate391, -- 单据状态 Fstate391 AS Fnumber020, -- 状态码别名 -- 审计字段 T391.FaddTime391 AS FaddTime391, -- 创建时间 T391.FaddEmpId391 AS FaddEmpId391, -- 创建人ID T391.FaddEmpName391 AS FaddEmpName391, -- 创建人姓名 T391.FeditTime391 AS FeditTime391, -- 修改时间 T391.FeditEmpId391 AS FeditEmpId391, -- 修改人ID T391.FeditEmpName391 AS FeditEmpName391, -- 修改人姓名 T391.Fmemo391 AS Fmemo391, -- 备注 -- 入库时间跟踪 T391.FfirstInTime391 AS FfirstInTime391, -- 首次入库时间 T391.FlastInTime391 AS FlastInTime391, -- 最后入库时间 -- 自定义字段(20个字符串+10个数字) T391.UDF01A391 AS UDF01A391, -- 自定义字符串字段1 ... -- UDF02A391 到 UDF20A391 T391.UDF21N391 AS UDF21N391, -- 自定义数字字段1 ... -- UDF22N391 到 UDF30N391 FROM WM_ASN391 T391 -- 到货通知单主表 /* 关联说明(全部使用LEFT JOIN保证主表完整性) */ LEFT JOIN BS_basicData046 T046A -- 客户信息表 ON T391.FuserId = T046A.FuserId AND T391.FcustomerId391 = T046A.FbasicDataId046 LEFT JOIN BS_basicData046 T046B -- 操作员信息表 ON T391.FuserId = T046B.FuserId AND T391.FbillEmpId391 = T046B.FbasicDataId046 LEFT JOIN BS_basicData046 T046C -- 仓库信息表 ON T391.FuserId = T046C.FuserId AND T391.FwarehouseId391 = T046C.FbasicDataId046 LEFT JOIN BS_billType346 T346 -- 单据类型表 ON T391.FuserId = T346.FuserId AND T391.FbillTypeId391 = T346.FbillTypeId346 ``` ### 关键结构解析 #### 1. 多租户设计 所有关联都包含`FuserId`条件,实现数据隔离: ```sql ON T391.FuserId = T046A.FuserId AND ... ``` #### 2. 实体关联模式 采用`ID + 关联表`模式获取详细信息: ```sql -- 原始ID T391.FwarehouseId391 AS FwarehouseId391 -- 关联获取详细信息 T046C.Fnumber046 AS FwarehouseId391Number T046C.Fname046 AS FwarehouseId391Name ``` #### 3. 自定义字段设计 扩展性设计(20个字符串+10个数字字段): ```sql UDF01A391 ... UDF20A391 -- 字符串字段 UDF21N391 ... UDF30N391 -- 数字字段 ``` #### 4. 审计跟踪字段 完整记录操作历史: ```sql FaddTime391/FaddEmpId391/FaddEmpName391 -- 创建信息 FeditTime391/FeditEmpId391/FeditEmpName391 -- 修改信息 ``` #### 5. 状态管理 双重状态表示法(原始值+编码): ```sql Fstate391 AS Fstate391, -- 原始状态值 Fstate391 AS Fnumber020 -- 状态编码(可能用于外部系统) ``` ### 查询优化建议 #### 1. 添加缺失索引 ```sql -- WM_ASN391表 CREATE INDEX idx_asn_user ON WM_ASN391(FuserId); CREATE INDEX idx_asn_warehouse ON WM_ASN391(FwarehouseId391); CREATE INDEX idx_asn_customer ON WM_ASN391(FcustomerId391); -- BS_basicData046表 CREATE INDEX idx_basicdata_user ON BS_basicData046(FuserId); CREATE INDEX idx_basicdata_id ON BS_basicData046(FbasicDataId046); ``` #### 2. 避免全表扫描的过滤条件 ```sql -- 示例:添加时间范围过滤 WHERE T391.FaddTime391 BETWEEN '2023-01-01' AND '2023-12-31' ``` #### 3. XML/JSON格式输出(可选) ```sql SELECT FASNId391 AS "@id", FASNnumber391 AS "number", (SELECT ... FOR XML PATH('warehouse'), TYPE) FROM ... FOR XML PATH('asn'), ROOT('data') ``` ### 典型使用场景 ```mermaid graph TD A[创建到货通知单] --> B[关联仓库信息] A --> C[关联客户信息] A --> D[指定单据类型] B --> E[库存系统对接] C --> F[客户管理系统] D --> G[流程引擎] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值