深度学习入门:基于Python的理论与实现3神经网络

发布于:2023-01-26 ⋅ 阅读:(644) ⋅ 点赞:(0)

从感知机到神经网络

输入层、中间层(隐藏层)、输出层
实际权重层数=输入层+中间层+输出层-1

激活函数

  1. 激活函数:通过感知机接收信号x1、x2……,计算加权信号与偏置的总和a=Σ(w1 * x1+w2 * x2+……)+b,利用激活函数h()将a转换为输出y=h(a)

  2. 信号:连续实数值信号

  3. simoid函数:(计算量更大,有梯度为0的情况)
    h ( x ) = 1 / ( 1 + e x p ( − 1 ) ) h(x)=1/(1+exp(-1)) h(x)=1/1+exp(1)

     def simoid(x):
         return 1/(1+np.exp(-x))
    
  4. ReLU函数:(学习率需要设计较小)
    h ( x ) = { x x > 0 0 x ≤ 0 h(x)=\left\{ \begin{array}{rcl} x & & {x > 0}\\ 0 & & {x \leq 0} \end{array} \right. h(x)={x0x>0x0

    def relu(x):
        return np.maximum(0,x)
    
  5. 隐藏层激活函数h(),输出层激活函数σ()
    回归问题用恒等函数;
    分类问题用softmax函数
    y k = e x p ( a k + c ) Σ e x p ( a i + c ) y^k=\frac{exp(ak+c)}{Σexp(ai+c)} yk=Σexp(ai+c)exp(ak+c)

    i为[1,n],n是输出层神经元个数, y k y_k yk为第k个神经元输出,c防止溢出

    输出层激活函数定为恒等函数

    def identity_function(x):
        return x
    

    输出激活函数定为softmax函数( softmax函数输出值总和为1)

    def softmax(a):
        c=np.max(a)
        exp_a=np.exp(a-c)#c防止溢出
        sum_exp_a=np.sum(exp_a)
        y=exp_a/sum_exp_a
        return y
    
  6. 阶跃函数

    	import numpy as np
    	import matplotlib.pylab as plt
    	def step_function(x):
    	    return np.array(x>0,dtype=np.int)
    	def simoid(x):
    	    return 1/(1+np.exp(-x))
    	def relu(x):
    	    return np.maximum(0,x)
    
       x=np.arange(-5.0,5.0,0.1)
       y=step_function(x)
       z=simoid(x)
       r=relu(x)
       plt.plot(x,y,linestyle="--",label="step")
       plt.plot(x,z,label="simoid")
       plt.plot(x,r,label="ReLU")
       plt.ylim(-0.1,1.1)#指定y轴范围
       plt.legend()
       plt.show()
    

图4

多维数组的运算

	#多维数组/张量
	#矩阵乘法,维度需要保持一致
	A=np.array([[1,2],[3,4],[5,6]])
	B=np.array([7,8])#1*2 0r 2*1
	C=np.array([[1,3,5],[2,4,6]])
	print(A.shape)
	print(B.shape)
	print(C.shape)
	print(np.dot(A,B))
	print(np.dot(B,C))

多层神经网络的实现

  1. 信号,权重,偏置
	#信号,权重,偏置
	X=np.array([1.0,0.5])
	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=simoid(A1)
	print(A1)
	print(Z1)
  1. 第一层到第二层的信号传递
	#第一层到第二层的信号传递
	W2=np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])
	B2=np.array([0.1,0.2])
	A2=np.dot(Z1,W2)+B2
	Z2=simoid(A2)#第一层输出变成第二层输入
	print(A2)
	print(Z2)
  1. 第二层到输出层的信号传递
	W3=np.array([[0.1,0.3],[0.2,0.4]])
	B3=B2
	A3=np.dot(Z2,W3)+B3
	Y=identity_function(A3)#or Y=A3
	print(Y)

输出层的设计

一般输出激活函数为σ()

   	#输出层激活函数定为恒等函数
   	def identity_function(x):
   	    return x
   	#输出激活函数定为softmax函数
   	def softmax(a):
   	    c=np.max(a)
   	    exp_a=np.exp(a-c)#c防止溢出
   	    sum_exp_a=np.sum(exp_a)
   	    y=exp_a/sum_exp_a
   	    return y
   	W3=np.array([[0.1,0.3],[0.2,0.4]])
   	B3=B2
   	A3=np.dot(Z2,W3)+B3
   	Y=identity_function(A3)#or Y=A3
   	print(Y)
本文含有隐藏内容,请 开通VIP 后查看