1.加载权重
1.1加载流程
load_weights_upto代码:
void load_weights_upto(network *net, char *filename, int cutoff)
load_weights_upto调用结构
1.2 load_weights_upto解析:
关于参数cutoff说明:
cutoff只在一个for循环处引用,具体看附件load_weigths_upto源代码:
再看看load_weights_upto的引用,可以知道cutoff参数可能值为max或net->n,partical函数裁剪权重的时候传入max,max是指令设置值可能比net->n小,其他情形cutoff取值等于net->n。
2.更新权重
权重内容包括
3.保存权重
4.附源代码
load_weights_upto
void load_weights_upto(network *net, char *filename, int cutoff)
{
#ifdef GPU
if(net->gpu_index >= 0){
cuda_set_device(net->gpu_index);
}
#endif
fprintf(stderr, "Loading weights from %s...", filename);
fflush(stdout);
FILE *fp = fopen(filename, "rb");
if(!fp) file_error(filename);
int major;
int minor;
int revision;
fread(&major, sizeof(int), 1, fp);
fread(&minor, sizeof(int), 1, fp);
fread(&revision, sizeof(int), 1, fp);
if ((major * 10 + minor) >= 2) {
printf("\n seen 64 \n");
uint64_t iseen = 0;
fread(&iseen, sizeof(uint64_t), 1, fp);
*net->seen = iseen;
}
else {
printf("\n seen 32 \n");
uint32_t iseen = 0;
fread(&iseen, sizeof(uint32_t), 1, fp);
*net->seen = iseen;
}
int transpose = (major > 1000) || (minor > 1000);
int i;
for(i = 0; i < net->n && i < cutoff; ++i){
layer l = net->layers[i];
if (l.dontload) continue;
if(l.type == CONVOLUTIONAL && l.share_layer == NULL){
load_convolutional_weights(l, fp);
}
if(l.type == CONNECTED){
load_connected_weights(l, fp, transpose);
}
if(l.type == BATCHNORM){
load_batchnorm_weights(l, fp);
}
if(l.type == CRNN){
load_convolutional_weights(*(l.input_layer), fp);
load_convolutional_weights(*(l.self_layer), fp);
load_convolutional_weights(*(l.output_layer), fp);
}
if(l.type == RNN){
load_connected_weights(*(l.input_layer), fp, transpose);
load_connected_weights(*(l.self_layer), fp, transpose);
load_connected_weights(*(l.output_layer), fp, transpose);
}
if(l.type == GRU){
load_connected_weights(*(l.input_z_layer), fp, transpose);
load_connected_weights(*(l.input_r_layer), fp, transpose);
load_connected_weights(*(l.input_h_layer), fp, transpose);
load_connected_weights(*(l.state_z_layer), fp, transpose);
load_connected_weights(*(l.state_r_layer), fp, transpose);
load_connected_weights(*(l.state_h_layer), fp, transpose);
}
if(l.type == LSTM){
load_connected_weights(*(l.wf), fp, transpose);
load_connected_weights(*(l.wi), fp, transpose);
load_connected_weights(*(l.wg), fp, transpose);
load_connected_weights(*(l.wo), fp, transpose);
load_connected_weights(*(l.uf), fp, transpose);
load_connected_weights(*(l.ui), fp, transpose);
load_connected_weights(*(l.ug), fp, transpose);
load_connected_weights(*(l.uo), fp, transpose);
}
if (l.type == CONV_LSTM) {
if (l.peephole) {
load_convolutional_weights(*(l.vf), fp);
load_convolutional_weights(*(l.vi), fp);
load_convolutional_weights(*(l.vo), fp);
}
load_convolutional_weights(*(l.wf), fp);
load_convolutional_weights(*(l.wi), fp);
load_convolutional_weights(*(l.wg), fp);
load_convolutional_weights(*(l.wo), fp);
load_convolutional_weights(*(l.uf), fp);
load_convolutional_weights(*(l.ui), fp);
load_convolutional_weights(*(l.ug), fp);
load_convolutional_weights(*(l.uo), fp);
}
if(l.type == LOCAL){
int locations = l.out_w*l.out_h;
int size = l.size*l.size*l.c*l.n*locations;
fread(l.biases, sizeof(float), l.outputs, fp);
fread(l.weights, sizeof(float), size, fp);
#ifdef GPU
if(gpu_index >= 0){
push_local_layer(l);
}
#endif
}
}
fprintf(stderr, "Done!\n");
fclose(fp);
}
save_weights_upto
void save_weights_upto(network net, char *filename, int cutoff)
{
#ifdef GPU
if(net.gpu_index >= 0){
cuda_set_device(net.gpu_index);
}
#endif
fprintf(stderr, "Saving weights to %s\n", filename);
FILE *fp = fopen(filename, "wb");
if(!fp) file_error(filename);
int major = MAJOR_VERSION;
int minor = MINOR_VERSION;
int revision = PATCH_VERSION;
fwrite(&major, sizeof(int), 1, fp);
fwrite(&minor, sizeof(int), 1, fp);
fwrite(&revision, sizeof(int), 1, fp);
fwrite(net.seen, sizeof(uint64_t), 1, fp);
int i;
for(i = 0; i < net.n && i < cutoff; ++i){
layer l = net.layers[i];
if(l.type == CONVOLUTIONAL && l.share_layer == NULL){
save_convolutional_weights(l, fp);
} if(l.type == CONNECTED){
save_connected_weights(l, fp);
} if(l.type == BATCHNORM){
save_batchnorm_weights(l, fp);
} if(l.type == RNN){
save_connected_weights(*(l.input_layer), fp);
save_connected_weights(*(l.self_layer), fp);
save_connected_weights(*(l.output_layer), fp);
} if(l.type == GRU){
save_connected_weights(*(l.input_z_layer), fp);
save_connected_weights(*(l.input_r_layer), fp);
save_connected_weights(*(l.input_h_layer), fp);
save_connected_weights(*(l.state_z_layer), fp);
save_connected_weights(*(l.state_r_layer), fp);
save_connected_weights(*(l.state_h_layer), fp);
} if(l.type == LSTM){
save_connected_weights(*(l.wf), fp);
save_connected_weights(*(l.wi), fp);
save_connected_weights(*(l.wg), fp);
save_connected_weights(*(l.wo), fp);
save_connected_weights(*(l.uf), fp);
save_connected_weights(*(l.ui), fp);
save_connected_weights(*(l.ug), fp);
save_connected_weights(*(l.uo), fp);
} if (l.type == CONV_LSTM) {
if (l.peephole) {
save_convolutional_weights(*(l.vf), fp);
save_convolutional_weights(*(l.vi), fp);
save_convolutional_weights(*(l.vo), fp);
}
save_convolutional_weights(*(l.wf), fp);
save_convolutional_weights(*(l.wi), fp);
save_convolutional_weights(*(l.wg), fp);
save_convolutional_weights(*(l.wo), fp);
save_convolutional_weights(*(l.uf), fp);
save_convolutional_weights(*(l.ui), fp);
save_convolutional_weights(*(l.ug), fp);
save_convolutional_weights(*(l.uo), fp);
} if(l.type == CRNN){
save_convolutional_weights(*(l.input_layer), fp);
save_convolutional_weights(*(l.self_layer), fp);
save_convolutional_weights(*(l.output_layer), fp);
} if(l.type == LOCAL){
#ifdef GPU
if(gpu_index >= 0){
pull_local_layer(l);
}
#endif
int locations = l.out_w*l.out_h;
int size = l.size*l.size*l.c*l.n*locations;
fwrite(l.biases, sizeof(float), l.outputs, fp);
fwrite(l.weights, sizeof(float), size, fp);
}
}
fclose(fp);
}