请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

正在回答

插入代码

1回答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import numpy as np
def tanh(x):
    return np.tanh(x)
  
def tanh_deriv(x):
    return 1.0-np.tanh(x)*np.tanh(x)
  
def logistic(x):
    return 1/(1+np.exp(-x))
  
def logistic_derivative(x):
    return logistic(x)*(1-logistic(x))
  
class NeuralNetwork:
    def __init__(self,layers,activation='tanh'):
    #根据类实例化一个函数,_init_代表的是构造函数
    #self相当于java中的this
        """
        :param layers:一个列表,包含了每层神经网络中有几个神经元,至少有两层,输入层不算作
                [, , ,]中每个值代表了每层的神经元个数
        :param activation:激活函数可以使用tanh 和 logistics,不指明的情况下就是tanh函数
        """
        if activation =='logistic':
            self.activation = logistic
            self.activation_deriv = logistic_derivative
        elif activation =='tanh':
            self.activation =tanh
            self.activation_deriv=tanh_deriv
        #初始化weights,    
        self.weights =[]
        #len(layers)layer是一个list[10,10,3],则len(layer)=3
        #除了输出层都要赋予一个随机产生的权重
        for in range(1,len(layers)-1):
            #np.random.random为nunpy随机产生的数
            #实际是以第二层开始,前后都连线赋予权重,权重位于[-0.25,0.25]之间
            self.weights.append((2*np.random.random((layers[i-1]+1,layers[i]+1))-1)*0.25)
            self.weights.append((2*np.random.random((layers[i]+1,layers[i+1]))-1)*0.25)
    #定义一个方法,训练神经网络
    def fit(self,X,y,learning_rate=0.2,epochs=10000):
        #X:数据集,确认是二维,每行是一个实例,每个实例有一些特征值
        X=np.atleast_2d(X)
        #np.ones初始化一个矩阵,传入两个参数全是1
        #X.shape返回的是一个list[行数,列数]
        #X.shape[0]返回的是行,X.shape[1]+1:比X多1,对bias进行赋值为1
        temp = np.ones([X.shape[0],X.shape[1]+1])
        #“ :”取所有的行
        #“0:-1”从第一列到倒数第二列,-1代表的是最后一列
        temp[:,0:-1]=X
        X=temp
        #y:classlabel,函数的分类标记
        y=np.array(y)
        #K代表的是第几轮循环 
        for in range(epochs):
            #从0到X.shape[0]随机抽取一行做实例
            =np.random.randint(X.shape[0])
            a=[X[i]]
             
            #正向更新权重    ,len(self.weights)等于神经网络层数
            for in range(len(self.weights)):
                #np.dot代表两参数的内积,x.dot(y) 等价于 np.dot(x,y)
                #即a与weights内积,之后放入非线性转化function求下一层
                #a输入层,append不断增长,完成所有正向的更新
                a.append(self.activation(np.dot(a[l],self.weights[l])))
            #计算错误率,y[i]真实标记   ,a[-1]预测的classlable   
            error=y[i]-a[-1]
            #计算输出层的误差,根据最后一层当前神经元的值,反向更新
            deltas =[error*self.activation_deriv(a[-1])]
             
            #反向更新
            #len(a)所有神经元的层数,不能算第一场和最后一层
            #从最后一层到第0层,每次-1
            for in range(len(a)-2,0,-1):
                #
                deltas.append(deltas[-1].dot(self.weights[l].T)*self.activation_deriv(a[l]))
            #reverse将deltas的层数跌倒过来
            deltas.reverse()
            for in range(len(self.weights)):
                #
                layer = np.atleast_2d(a[i])
                #delta代表的是权重更新
                delta = np.atleast_2d(deltas[i])
                #layer.T.dot(delta)误差和单元格的内积
                self.weights[i]+=learning_rate*layer.T.dot(delta)
         
    def predict(self,x):
        x=np.array(x)
        temp=np.ones(x.shape[0]+1)
        #从0行到倒数第一行
        temp[0:-1]=
        a=temp
        for in range(0,len(self.weights)):
            a=self.activation(np.dot(a,self.weights[l]))
        return a


1 回复 有任何疑惑可以回复我~
  • wangwox #1
    我也没找到,我自己用的是百度搜到的
    回复 有任何疑惑可以回复我~ 2019-02-07 22:01:26
  • 提问者 宝慕林309924 #2
    非常感谢!
    回复 有任何疑惑可以回复我~ 2020-09-15 19:52:55
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号