• 大小: 6KB
    文件类型: .py
    金币: 1
    下载: 0 次
    发布日期: 2021-06-16
  • 语言: Python
  • 标签: python  numpy  

资源简介

本代码利用numpy实现了深度前馈网络;代码包括了网络深度,每层的单元数和每层的激活函数可以自选,BP算法;最后跟了一个多项式拟合的例子。该代码适合深度学习初学者。

资源截图

代码片段和文件信息

# =============================================================================
# 深度前馈网络框架
#     多项式(正弦)拟合任务,需要numpy包和matplotlib包;
#                                                       Written By Wang Chunlei
# =============================================================================

#------------------ 定义深度前馈网络 -------------------------------------
import numpy as np
class MyDfn:
    __WtInitVar = 0.01 #初始权值服从标准正态分布,该参数控制方差
    __BsInitAmp = 0.01 #初始阈值服从均匀分布,该参数控制取值范围
    __miu = 0.02 #随机梯度下降学习率
    
    # 网络初始化函数
    def __init__(self InputLen=1 layerNum=0 UnitNum=[] ActiveFcs=[]):
        self.layerNum = layerNum #网络层数(int)
        self.InputLen = InputLen #网络输入数据长度(int)
        self.WeightMts =[] #网络各层权值list内容为numpy矩阵
        self.BiasVc = [] #网络各层阈值list内容为numpy矩阵
        self.ActiveFcs =[] #网络各层的激活函数list内容为函数指针
        self.UnitNum = [] #网络各层的单元数numpy数组     
        # 如果网络层数等于0
        if(self.layerNum == 0):
            return
        # 每层网络的单元数目
        if(UnitNum.size == layerNum):
            self.UnitNum = UnitNum
        else:
            print(“UnitNum长度和layerNum不等“)
            return
        # 每层网络的激活函数和导数对应的函数指针
        if(len(ActiveFcs) != self.layerNum):
            print(“ActiveFcs维度有误“)
            return
        else:
            self.ActiveFcs = ActiveFcs
        # 初始化网络        
        self.WeightMts.append( self.__WtInitVar*np.random.randn(UnitNum[0] InputLen) )
        self.BiasVc.append( self.__BsInitAmp*np.random.rand(UnitNum[0]1) )
        for idi in range(1 self.layerNum):
            self.WeightMts.append(self.__WtInitVar*np.random.randn(UnitNum[idi] UnitNum[idi-1]))
            self.BiasVc.append(self.__BsInitAmp*np.random.rand(UnitNum[idi]1))
    
    # 显示网络结构函数    
    def PrintNetworkInfo(self):           
        print(“网络层数=%d“ % self.layerNum)
        if(self.layerNum >= 1):
            print(“第1层:输入数据长度=%d,该层单元数=%d“ % (self.InputLen self.UnitNum[0]))
            for idi in range(1 self.layerNum):
                print(“第%d层:输入数据长度=%d,该层单元数=%d“ % (idi+1 self.UnitNum[idi-1] self.UnitNum[idi]))
    
    # 前馈函数(Input为numpy列向量)
    def Forward(self Input):
        if(Input.shape != (self.InputLen 1)):
            print(“输入数据维度和网络不符“)
            return 0.0
        # self.LyVals是一个长度为(self.layerNum+1)的列表
        # 第一个元素是网络输入值,后面依次是各层输出值
        # self.LyDris是一个长度为self.layerNum的列表,每个元素都是对应层输出的导数
        self.LyVals = [Input]
        self.LyDris = []
        for idi in range(self.layerNum):
            ZVal = np.dot(self.WeightMts[idi] self.LyVals[idi]) + self.BiasVc[idi]
            ValTmp DriTmp = self.ActiveFcs[

评论

共有 条评论