void backward_network(network net, network_state state) { int i; float *original_input = state.input; for(i = net.n-1; i >= 0; --i){ if(i == 0){ state.input = original_input; state.delta = 0; }else{ layer prev = net.layers[i-1]; state.input = prev.output; state.delta = prev.delta; } layer l = net.layers[i]; if(l.type == CONVOLUTIONAL){ backward_convolutional_layer(l, state); } else if(l.type == DECONVOLUTIONAL){ backward_deconvolutional_layer(l, state); } else if(l.type == MAXPOOL){ if(i != 0) backward_maxpool_layer(l, state); } else if(l.type == DROPOUT){ backward_dropout_layer(l, state); } else if(l.type == DETECTION){ backward_detection_layer(l, state); } else if(l.type == SOFTMAX){ if(i != 0) backward_softmax_layer(l, state); } else if(l.type == CONNECTED){ backward_connected_layer(l, state); } else if(l.type == COST){ backward_cost_layer(l, state); } else if(l.type == ROUTE){ backward_route_layer(l, net); } } }
void backward_network(network net, network_state state) { int i; float *original_input = state.input; float *original_delta = state.delta; state.workspace = net.workspace; for(i = net.n-1; i >= 0; --i){ state.index = i; if(i == 0){ state.input = original_input; state.delta = original_delta; }else{ layer prev = net.layers[i-1]; state.input = prev.output; state.delta = prev.delta; } layer l = net.layers[i]; if(l.type == CONVOLUTIONAL){ backward_convolutional_layer(l, state); } else if(l.type == DECONVOLUTIONAL){ backward_deconvolutional_layer(l, state); } else if(l.type == ACTIVE){ backward_activation_layer(l, state); } else if(l.type == NORMALIZATION){ backward_normalization_layer(l, state); } else if(l.type == BATCHNORM){ backward_batchnorm_layer(l, state); } else if(l.type == MAXPOOL){ if(i != 0) backward_maxpool_layer(l, state); } else if(l.type == AVGPOOL){ backward_avgpool_layer(l, state); } else if(l.type == DROPOUT){ backward_dropout_layer(l, state); } else if(l.type == DETECTION){ backward_detection_layer(l, state); } else if(l.type == SOFTMAX){ if(i != 0) backward_softmax_layer(l, state); } else if(l.type == CONNECTED){ backward_connected_layer(l, state); } else if(l.type == RNN){ backward_rnn_layer(l, state); } else if(l.type == GRU){ backward_gru_layer(l, state); } else if(l.type == CRNN){ backward_crnn_layer(l, state); } else if(l.type == LOCAL){ backward_local_layer(l, state); } else if(l.type == COST){ backward_cost_layer(l, state); } else if(l.type == ROUTE){ backward_route_layer(l, net); } else if(l.type == SHORTCUT){ backward_shortcut_layer(l, state); } } }