| 120 | #----------------------------------------------------------------- |
| 121 | #定义一个网络类 |
| 122 | class Network: |
| 123 | def __init__(self, network_shape): |
| 124 | self.shape = network_shape |
| 125 | self.layers = [] |
| 126 | for i in range(len(network_shape)-1): |
| 127 | layer = Layer(network_shape[i], network_shape[i+1]) |
| 128 | self.layers.append(layer) |
| 129 | |
| 130 | #前馈运算函数 |
| 131 | def network_forward(self, inputs): |
| 132 | outputs = [inputs] |
| 133 | for i in range(len(self.layers)): |
| 134 | layer_sum = self.layers[i].layer_forward(outputs[i]) |
| 135 | if i < len(self.layers)-1: |
| 136 | layer_output = activation_ReLU(layer_sum) |
| 137 | layer_output = normalize(layer_output) |
| 138 | else: |
| 139 | layer_output = activation_softmax(layer_sum) |
| 140 | outputs.append(layer_output) |
| 141 | return outputs |
| 142 | |
| 143 | #反向传播函数 |
| 144 | def network_backward(self, layer_outputs, target_vector): |
| 145 | backup_network = copy.deepcopy(self) # 备用网络 |
| 146 | preAct_demands = get_final_layer_preAct_damands(layer_outputs[-1], target_vector) |
| 147 | for i in range(len(self.layers)): |
| 148 | layer = backup_network.layers[len(self.layers) - (1+i)] # 倒序 |
| 149 | if i != 0: |
| 150 | layer.biases += LEARNING_RATE * np.mean(preAct_demands, axis=0) |
| 151 | layer.biases = vector_normalize(layer.biases) |
| 152 | |
| 153 | outputs = layer_outputs[len(layer_outputs) - (2+i)] |
| 154 | results_list = layer.layer_backward(outputs, preAct_demands) |
| 155 | preAct_demands = results_list[0] |
| 156 | weights_adjust_matrix = results_list[1] |
| 157 | layer.weights += LEARNING_RATE * weights_adjust_matrix |
| 158 | layer.weights = normalize(layer.weights) |
| 159 | return backup_network |
| 160 | |
| 161 | #单批次训练 |
| 162 | def one_batch_train(self, batch): |
| 163 | global force_train, random_train, n_improved, n_not_improved |
| 164 | |
| 165 | inputs = batch[:,(0, 1)] |
| 166 | targets = copy.deepcopy(batch[:, 2]).astype(int) # 标准答案 |
| 167 | outputs = self.network_forward(inputs) |
| 168 | precise_loss = precise_loss_function(outputs[-1], targets) |
| 169 | loss = loss_function(outputs[-1], targets) |
| 170 | |
| 171 | if np.mean(loss) <= LOSS_THRESHOLD:#损失函数小于这个值就不需要训练了 |
| 172 | print('No need for training') |
| 173 | else: |
| 174 | backup_network = self.network_backward(outputs, targets) |
| 175 | backup_outputs = backup_network.network_forward(inputs) |
| 176 | backup_precise_loss = precise_loss_function(backup_outputs[-1], targets) |
| 177 | backup_loss = loss_function(backup_outputs[-1], targets) |
| 178 | |
| 179 | if np.mean(precise_loss) >= np.mean(backup_precise_loss) or np.mean(loss) >= np.mean(backup_loss): |
no outgoing calls
no test coverage detected