Python:鱼书第三章神经网络的学习笔记与补充

文章介绍了多维度数组运算在神经网络中的应用,包括向量内积、矩阵乘法等操作。接着,文章讲解了神经网络的基本概念,如感知机中的阶跃函数和Sigmoid函数,强调了非线性激活函数在神经网络中的重要性。之后,展示了三层神经网络的实现,以及前向传播过程。最后,讨论了输出层函数的选择,如分类问题中的softmax函数和回归问题中的恒等函数。
摘要由CSDN通过智能技术生成

目录

0.多维度数组运算

1.引入神经网络

 2.神经网络的实现

3.输出层函数的选择

0.多维度数组运算

shape ndim 函数请运行下面代码自行体会。

import numpy as np
#please run the following codes
a = np.array([1,2,4,3])
print(a)
print(np.ndim(a)) # Number of array dimension
print(a.shape)  # returns a tuple and the tuple gives the lengths of the input array dimensions
print(a.shape[0]) # 一维的长度 即 元素的数量

b = np.array([[1,2],[3,4],[5,6]])
print(np.ndim(b)) #2维
print(b.shape)  #  3*2矩阵
print(b.shape[0]) #b的第一个维度长
print(b.shape[1])#b的第二个维度长

下面这段话不一定全对,但可以参考

当进行向量的内积运算时,可以通过np.dot()
当进行矩阵的乘法运算时,可以通过np.matmul()或者@
当进行标量的乘法运算时,可以通过np.multiply()或者*

np.dot()、np.multiply()、np.matmul()方法以及*和@运算符的用法总结 - 山上有风景 - 博客园

import numpy as np
#please run the following codes
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
print(np.matmul(a,b))
print(np.dot(a,b))    #普通的矩阵乘法情况下两者都可以用

#向量点乘
a1 = np.array([1,2,3])
b1 = np.array([1,2,3])
print(np.dot(a1,b1))
print(np.matmul(a1,b1))
print(a1 @ b1)

# 1*2 与 2*2 这种是我们常理解的乘法
a3 = np.array([1,2])
b3 = np.array([[1,2],[3,4]])
print(np.dot(a3,b3))

#这样也可以算 这种超脱了我们一般理解的矩阵乘法
# 2*2矩阵 与 一维数组相乘 只要对应维度元素保持一致即可
#用记住shape查看
a2 = np.array([[1,2],[3,4]])
print(a2.shape)# (2,2)
b2 = np.array([1,2])
print(b2.shape)  #(2,)
# (2,2) * (2,) 可以相乘
print(np.dot(a2,b2))

1.引入神经网络

感知机中根据计算的输入信号的总和 ,w1*x1+w2*x2+b ,返回的值是0和1,可以定义函数h(x)h(x) = 1\ when \, x>0 \, h(x)=0\, when\, x<=0,可以称为阶跃函数。

阶跃函数图像

# 阶跃函数图像
import numpy as np
import matplotlib.pyplot as mp

#下面函数是对阶跃函数的实现
def step_function(x):
    y = x>0
    y = y.astype(np.int_)
    return y   #astype()对数据类型进行转换
    # 书中numpy.int型已经被淘汰 最新用 np.int_ or np.int16 or np.int32

#满足 function(x<0)=0 function(x>0)=1
x = np.arange(-6,6,0.1)
y = step_function(x)
mp.plot(x,y)
mp.ylim(-0.1,1.1) #对y轴值进行限制
mp.show()

 另一种写step function的方法 (较难理解)

def step_function(x): 
    return  np.array(x>0,dtype=np.int_)#np.array(object,dtype=None(默认))

阶跃函数 是一种 激活函数activate function,我们将阶跃函数,换成sigmoid funtion 就可以变成神经网络了。

Sigmoid函数图像

# Sigmoid function 图像
import numpy as np
import matplotlib.pyplot as mp
x = np.arange(-6,6,0.1)
y = 1/(1+np.exp(-x))
mp.plot(x,y)
mp.show()

两者共同点: 都是输入重要信息时(输入大),值越靠近1,输入不重要信息时(输入小)值越靠近0,且 函数输出信号值均在 0~1之间。

同为激活函数的还有ReLU (rectified linear unit),图像如下,(后面章节会用到)

import numpy as np
import matplotlib.pyplot as plt
def relu(x):
    return np.maximum(0,x)  #返回0 or X 较大的数
x = np.arange(-6,6,0.1)
y = relu(x)
plt.plot(x,y)
plt.show()

 我们注意到 Activate function都是 inlinear 的 ,只有非线性的函数才能发挥出神经网络中的中间层(隐藏层)的作用  (图来自鱼书)

 2.神经网络的实现

三层神经网络的实现,指有3个权重向量,四层,中间两层隐藏层,首尾是输入和输出层

#三层神经网络的实现 A = XW + B
import numpy as np

def init_network(): #初始化偏置和权重
    network = {}
    network['w1'] = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]]) #第一层权重 第一行代表x1向下层传递的权重
    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 sigmoid(x):#隐藏层激活函数
    return 1/(1+np.exp(-x))

def sigma(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(a1) #第一层激活函数
    a2 = np.dot(z1,w2) + b2
    z2 = sigmoid(a2) #第二层激活函数
    a3 = np.dot(z2,w3) + b3
    y = sigma(a3)  #输出层激活函数
    return y

network = init_network()
x = np.array([1,0.5])
y = forward(network,x)
print(y)

3.输出层函数的选择

隐藏层我们一般选择sigmoid函数,但输出层根据不同问题有不同选择,对于分类问题,如识别图像数字是0~9中哪个,我们一般用softmax函数;对于回归问题,如预测问题,选择恒等函数,如图上面代码输出层激活函数一样。

softmax函数返回的是各个输出y的百分比,百分比大的就是概率大的

def 恒等函数(x):
    return x
def softmax(x):
    c = np.max(x)
    y = np.exp(x-c)/np.sum(np.exp(x-c))
    return y

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值