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
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()))
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)
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
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