Exemple #1
0
    def backward(self, onepic, labels):
        # 计算误差
        delta = np.multiply(self.fl1.activator.backward(self.fl1.output),
                            (labels - self.fl1.output))  # 计算输出层激活函数前的误差
        # print('输出误差:',delta.shape)

        # 反向传播
        self.fl1.backward(delta)  # 计算了全连接层输入前的误差,以及全连接的w和b的梯度
        self.fl1.update()  # 更新权重w和偏量b
        # print('全连接层输入误差:', self.fl1.delta.shape)
        sensitivity_array = self.fl1.delta.reshape(
            self.pl2.output_array.shape)  # 将误差转化为同等形状
        self.pl2.backward(
            self.cl2.output_array,
            sensitivity_array)  # 计算第二采样层的输入误差。参数为第二采样层的 1、输入,2、输出误差
        # print('第二采样层的输入误差:', self.pl2.delta_array.shape)
        self.cl2.backward(self.pl1.output_array, self.pl2.delta_array,
                          activators.SigmoidActivator()
                          )  # 计算第二卷积层的输入误差。参数为第二卷积层的 1、输入,2、输出误差,3、激活函数
        self.cl2.update()  # 更新权重w和偏量b
        # print('第二卷积层的输入误差:', self.cl2.delta_array.shape)
        self.pl1.backward(
            self.cl1.output_array,
            self.cl2.delta_array)  # 计算第一采样层的输入误差。参数为第一采样层的 1、输入,2、输出误差
        # print('第一采样层的输入误差:', self.pl1.delta_array.shape)
        self.cl1.backward(onepic, self.pl1.delta_array,
                          activators.SigmoidActivator()
                          )  # 计算第一卷积层的输入误差。参数为第一卷积层的 1、输入,2、输出误差,3、激活函数
        self.cl1.update()  # 更新权重w和偏量b
Exemple #2
0
 def __init__(self, layers):
     """
     构造函数
     """
     self.layers = []
     for i in range(len(layers) - 1):
         if i == len(layers) - 2:
             self.layers.append(
                 FullConnectedLayer(layers[i], layers[i + 1],
                                    activators.SigmoidActivator()))
         else:
             self.layers.append(
                 FullConnectedLayer(layers[i], layers[i + 1],
                                    activators.SigmoidActivator()))
Exemple #3
0
 def __init__(self):
     self.C1 = CNN.ConvolutionalLayer((28,28), (5,5), 6, 0, 1, \
                                      activators.ReluActivator(), 0.001)
     self.S1 = CNN.MaxPoolingLayer((24, 24), (2, 2), 6, 2)
     self.OutLayer = full_layer.FullConnectedLayer(864, 10, \
                                              activators.SigmoidActivator(), \
                                              0.001)
Exemple #4
0
 def __init__(self):
     # 初始化构造卷积层:输入宽度、输入高度、通道数、滤波器宽度、滤波器高度、滤波器数目、补零数目、步长、激活器、学习速率
     self.cl1 = cnn.ConvLayer(
         28, 28, 1, 5, 5, 6, 0, 1, activators.SigmoidActivator(),
         0.02)  # 输入28*28 一通道,滤波器5*5的6个,步长为1,不补零,所以输出为24*24深度6
     # 构造降采样层,参数为输入宽度、高度、通道数、滤波器宽度、滤波器高度、步长
     self.pl1 = cnn.MaxPoolingLayer(
         24, 24, 6, 2, 2, 2)  # 输入24*24,6通道,滤波器2*2,步长为2,所以输出为12*12,深度保持不变为6
     # 初始化构造卷积层:输入宽度、输入高度、通道数、滤波器宽度、滤波器高度、滤波器数目、补零数目、步长、激活器、学习速率
     self.cl2 = cnn.ConvLayer(
         12, 12, 6, 5, 5, 12, 0, 1, activators.SigmoidActivator(),
         0.02)  # 输入12*12,6通道,滤波器5*5的12个,步长为1,不补零,所以输出为8*8深度12
     # 构造降采样层,参数为输入宽度、高度、通道数、滤波器宽度、滤波器高度、步长
     self.pl2 = cnn.MaxPoolingLayer(
         8, 8, 12, 2, 2,
         2)  # 输入8*8,12通道,滤波器2*2,步长为2,所以输出为4*4,深度保持不变为12。共192个像素
     # 全连接层构造函数。input_size: 本层输入向量的维度。output_size: 本层输出向量的维度。activator: 激活函数
     self.fl1 = dnn.FullConnectedLayer(
         192, 10, activators.SigmoidActivator(),
         0.02)  # 输入192个像素,输出为10种分类概率,学习速率为0.05
Exemple #5
0
    def __init__(self,
                 input_size,
                 output_size,
                 learning_rate,
                 activator,
                 L2_reg,
                 rng: np.random.RandomState = None):
        self.input_size = input_size
        self.output_size = output_size

        if rng is None:
            rng = np.random.RandomState(int(time.time()))

        if activator == 'tanh':
            self.activator = activators.TanhActivator()
            self.W = np.asarray(rng.uniform(
                low=-np.sqrt(6. / (input_size + output_size)),
                high=np.sqrt(6. / (input_size + output_size)),
                size=(input_size, output_size)),
                                dtype=np.float)
            self.W = self.W.T
        elif activator == 'sigmoid':
            self.activator = activators.SigmoidActivator()
            self.W = np.asarray(rng.uniform(
                low=-np.sqrt(6. / (input_size + output_size)) * 4,
                high=np.sqrt(6. / (input_size + output_size)) * 4,
                size=(output_size, input_size)),
                                dtype=np.float)

        self.b = np.zeros((output_size, 1))
        self.A = np.zeros((output_size, 1))
        self.X = 0
        self.Z = 0
        self.dW = 0
        self.db = 0
        self.learning_rate = learning_rate
        self.L2_reg = L2_reg