classNeuralNetwork: def__init__(self): self._layers=[]#网络层对象列表 #追加网络层 defadd_layer(self,layer):#这里的layer将由Layer类实例化得到 self._layers.append(layer) #网络的前向传播 deffeed_forward(self,X): # 依次通过各个网络层,流动态 for layer inself._layers: X=layer.activate(X) return X #网络的反向传播 defbackpropagation(self,X,y,lr): #首先前向计算,得到输出值 output=self.feed_forward(X) #然后反向循环,这里有些不明白 for i inreversed(range(len(self._layers))): layer=self._layers[i]#得到当前层的对象 #如果是输出层 if layer==self._layers[-1]: layer.error=y-output layer.delta=layer.error*layer.apply_activation_derivative(output) #如果是隐藏层 else: next_layer=self._layers[i+1]#得到下一层的对象 layer.error=np.dot(next_layer.weights,next_layer.delta) layer.delta=layer.error*layer.apply_activation_derivative(layer.last_activation)
#最后循环更新权值 for i inrange(len(self._layers)): layer=self._layers[i] # o_i 为上一网络层的输出 o_i=np.atleast_2d(X if i==0elseself._layers[i-1].last_activation) #执行梯度下降算法 layer.weights+=lr*layer.delta*o_i.T#layer.delta*o_i.T便是梯度,注意delta为负,故这里用的加号 #训练模型 deftrain(self,X_train,X_test,y_train,y_test,lr,max_epochs): #onehot编码 y_onehot=np.zeros((y_train.shape[0],2)) y_onehot[np.arange(y_train.shape[0]),y_train]=1 #开始训练... mses=[] for i inrange(max_epochs): for j inrange(len(X_train)):#一次训练一个样本 self.backpropagation(X_train[j],y_onehot[j],lr) if i%10==0: #打印loss mse=np.mean(np.square(y_onehot-self.feed_forward(X_train))) mses.append(mse) print('Epoch:#%s:%f'%(i,float(mse))) #打印准确率 #print('Accurary:%.2f%%'%(self.accuracy(self.predict(X_test),y_test.flatten())*100))