IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 写到哪儿算哪儿的神经网络基础-3 -> 正文阅读

[人工智能]写到哪儿算哪儿的神经网络基础-3

当节点个数比较多的时候,显然直接用公式计算比较费劲了。这个时候线性代数就派上用场了,当下大部分神经网络运算其实就是矩阵的运算(这里例子是矩阵的乘积)。

上图这个神经网络省略了偏置和激活函数,只设定了权重。?

import numpy as np
X=np.array([1,2])
W=np.array([[1,3,5],[2,4,6]])
Y=np.dot(X,W)
print(Y)

?这里具体来实现一个前向传播的3层神经网络:

?

实现之前,先确定一些符号,比如?w^3_{24}, 上标3表示从第2层到第3层的权重,有时还会加括号写为(3),下标2表示后一层(当前为2-3层之间)的第2个神经元,下标4表示前一层的第4个神经元。权重按照“后一层的索引号、前一层的索引号”顺序排列。

?

?现在看下从输入层到第一层的第一个神经元的信号传递过程:

上图中,1是表示偏置的神经元,这里偏置的右下角标索引只有一个是因为前一层的神经元只有1个,偏置权重的数量取决于后一层的神经元数量。

图中,a^{(1)}_1=w^{(1)}_{11}x_1+w^{(2)}_{12}x_2+b^{(1)}_1, 同样地,a^{(1)}_2=w^{(1)}_{21}x_1+w^{(2)}_{22}x_2+b^{(1)}_2...

用线性代数的矩阵乘法运算可以表示为:

A^{(1)}=XW^{(1)}+B^{(1)}, A^{(1)}=(a^{(1)}_1 \quad a^{(2)}_1 \quad a^{(3)}_1), X=(x_1 \quad x_2), W^{(1)}=\binom{w^{(1)}_{11} \quad w^{(1)}_{21} \quad w^{(1)}_{31} }{w^{(1)}_{12} \quad w^{(1)}_{22} \quad w^{(1)}_{32} }

用Python实现一下:

import numpy as np
import sigmoid
X=np.array([1,2])
W1=np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])
B1=np.array([0.1,0.2,0.3])
A1=np.dot(X,W1)+B1
Z1=sigmoid.sigmoid(A1)
print(A1)
print(Z1)

?输出结果:

?代码部分,我们用了sigmoid激活函数h(x)使得a^{(1)}_1 \rightarrow z^{(1)}_1,这个激活函数的计算过程表示了隐藏层的加权和(包括加权信号和偏置的总和,用a表示)被激活转换后的信号(用z表示)

?下面实现从第1层到第2层的信号传递,如上图所示。

W2=np.array([[0.1,0.3],[0.2,0.4],[0.3,0.5]])
B2=np.array([0.2,0.3])

A2=np.dot(Z1,W2)+B2
Z2=sigmoid.sigmoid(A2)

?最后,实现从第2层到输出层的信号传递。

W3=np.array([[0.2,0.4],[0.3,0.5]])
B3=np.array([0.3,0.4])
A3=np.dot(Z2,W3)+B3

?这里没用sigmoid作为输出的激活函数,而是直接按照加权和输出,这种形式叫做恒等函数作为(输出层的)激活,通常输出层的激活函数为了区别于隐藏层激活函数,会用\sigma ()表示。

print(A1,A2,A3)
print(Z1,Z2)

出来后的结果是:

关于最后输出层激活函数的使用,要根据求解问题的性质确定的。通常,回归问题用恒等函数,二分类问题用sigmoid函数,多分类问题用softmax函数。

以上代码定义函数优化后:

import numpy as np
import sigmoid
def initial_network():
    network={}   #用字典来存权重
    network['W1'] = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])  #字典Key就是权重名字
    network['B1'] = np.array([0.1,0.2,0.3])
    network['W2'] = np.array([[0.1,0.3],[0.2,0.4],[0.3,0.5]])
    network['B2'] = np.array([0.2,0.3])
    network['W3'] = np.array([[0.2,0.4],[0.3,0.5]])
    network['B3'] = np.array([0.3,0.4])
    return network

def identity_function(x):
    return x

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.sigmoid(A1)
    A2=np.dot(Z1,W2)+B2
    Z2=sigmoid.sigmoid(A2)
    A3=np.dot(Z2,W3)+B3
    Y=identity_function(A3)
    return Y

network=initial_network()
X=np.array([1,0.5])
Y=forward(network,X)

print(Y) #[0.65577234 1.03624354]

?

?

?

?

?

?

?

?

?

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-19 12:04:06  更:2021-08-19 12:06:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 21:01:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码