代码来源:
卷积神经⽹络中卷积层Conv2D(带stride、padding)的具体实现:
激活函数的实现(sigmoid、softmax、tanh、relu、leakyrelu、elu、selu、softplus):损失函数定义(均⽅误差、交叉熵损失):
优化器的实现(SGD、Nesterov、Adagrad、Adadelta、RMSprop、Adam):卷积层反向传播过程:
全连接层实现代码:
class Dense(Layer):
\"\"\"A fully-connected NN layer. Parameters: ----------- n_units: int
The number of neurons in the layer. input_shape: tuple
The expected input shape of the layer. For dense layers a single digit specifying the number of features of the input. Must be specified if it is the first layer in the network. \"\"\"
def __init__(self, n_units, input_shape=None): self.layer_input = None
self.input_shape = input_shape self.n_units = n_units self.trainable = True self.W = None self.w0 = None
def initialize(self, optimizer): # Initialize the weights
limit = 1 / math.sqrt(self.input_shape[0])
self.W = np.random.uniform(-limit, limit, (self.input_shape[0], self.n_units)) self.w0 = np.zeros((1, self.n_units)) # Weight optimizers
self.W_opt = copy.copy(optimizer) self.w0_opt = copy.copy(optimizer)
def parameters(self):
return np.prod(self.W.shape) + np.prod(self.w0.shape) def forward_pass(self, X, training=True): self.layer_input = X
return X.dot(self.W) + self.w0
def backward_pass(self, accum_grad):
# Save weights used during forwards pass W = self.W
if self.trainable:
# Calculate gradient w.r.t layer weights
grad_w = self.layer_input.T.dot(accum_grad)
grad_w0 = np.sum(accum_grad, axis=0, keepdims=True) # Update the layer weights
self.W = self.W_opt.update(self.W, grad_w) self.w0 = self.w0_opt.update(self.w0, grad_w0)
# Return accumulated gradient for next layer
# Calculated based on the weights used during the forward pass accum_grad = accum_grad.dot(W.T) return accum_grad def output_shape(self): return (self.n_units, )
因篇幅问题不能全部显示,请点此查看更多更全内容