lsd.c 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378
  1. #include <math.h>
  2. #include "darknet.h"
  3. /*
  4. void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg, char *aweight, int clear)
  5. {
  6. #ifdef GPU
  7. //char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt";
  8. char *train_images = "/home/pjreddie/data/imagenet/imagenet1k.train.list";
  9. //char *style_images = "/home/pjreddie/data/coco/trainvalno5k.txt";
  10. char *style_images = "/home/pjreddie/zelda.txt";
  11. char *backup_directory = "/home/pjreddie/backup/";
  12. srand(time(0));
  13. network fnet = load_network(fcfg, fweight, clear);
  14. network gnet = load_network(gcfg, gweight, clear);
  15. network anet = load_network(acfg, aweight, clear);
  16. char *gbase = basecfg(gcfg);
  17. char *abase = basecfg(acfg);
  18. printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", gnet->learning_rate, gnet->momentum, gnet->decay);
  19. int imgs = gnet->batch*gnet->subdivisions;
  20. int i = *gnet->seen/imgs;
  21. data train, tbuffer;
  22. data style, sbuffer;
  23. list *slist = get_paths(style_images);
  24. char **spaths = (char **)list_to_array(slist);
  25. list *tlist = get_paths(train_images);
  26. char **tpaths = (char **)list_to_array(tlist);
  27. load_args targs= get_base_args(gnet);
  28. targs.paths = tpaths;
  29. targs.n = imgs;
  30. targs.m = tlist->size;
  31. targs.d = &tbuffer;
  32. targs.type = CLASSIFICATION_DATA;
  33. targs.classes = 1;
  34. char *ls[1] = {"zelda"};
  35. targs.labels = ls;
  36. load_args sargs = get_base_args(gnet);
  37. sargs.paths = spaths;
  38. sargs.n = imgs;
  39. sargs.m = slist->size;
  40. sargs.d = &sbuffer;
  41. sargs.type = CLASSIFICATION_DATA;
  42. sargs.classes = 1;
  43. sargs.labels = ls;
  44. pthread_t tload_thread = load_data_in_thread(targs);
  45. pthread_t sload_thread = load_data_in_thread(sargs);
  46. clock_t time;
  47. float aloss_avg = -1;
  48. float floss_avg = -1;
  49. fnet->train=1;
  50. int x_size = fnet->inputs*fnet->batch;
  51. int y_size = fnet->truths*fnet->batch;
  52. float *X = calloc(x_size, sizeof(float));
  53. float *y = calloc(y_size, sizeof(float));
  54. int ax_size = anet->inputs*anet->batch;
  55. int ay_size = anet->truths*anet->batch;
  56. fill_gpu(ay_size, .9, anet->truth_gpu, 1);
  57. anet->delta_gpu = cuda_make_array(0, ax_size);
  58. anet->train = 1;
  59. int gx_size = gnet->inputs*gnet->batch;
  60. int gy_size = gnet->truths*gnet->batch;
  61. gstate.input = cuda_make_array(0, gx_size);
  62. gstate.truth = 0;
  63. gstate.delta = 0;
  64. gstate.train = 1;
  65. while (get_current_batch(gnet) < gnet->max_batches) {
  66. i += 1;
  67. time=clock();
  68. pthread_join(tload_thread, 0);
  69. pthread_join(sload_thread, 0);
  70. train = tbuffer;
  71. style = sbuffer;
  72. tload_thread = load_data_in_thread(targs);
  73. sload_thread = load_data_in_thread(sargs);
  74. printf("Loaded: %lf seconds\n", sec(clock()-time));
  75. data generated = copy_data(train);
  76. time=clock();
  77. int j, k;
  78. float floss = 0;
  79. for(j = 0; j < fnet->subdivisions; ++j){
  80. layer imlayer = gnet->layers[gnet->n - 1];
  81. get_next_batch(train, fnet->batch, j*fnet->batch, X, y);
  82. cuda_push_array(fstate.input, X, x_size);
  83. cuda_push_array(gstate.input, X, gx_size);
  84. *gnet->seen += gnet->batch;
  85. forward_network_gpu(fnet, fstate);
  86. float *feats = fnet->layers[fnet->n - 2].output_gpu;
  87. copy_gpu(y_size, feats, 1, fstate.truth, 1);
  88. forward_network_gpu(gnet, gstate);
  89. float *gen = gnet->layers[gnet->n-1].output_gpu;
  90. copy_gpu(x_size, gen, 1, fstate.input, 1);
  91. fill_gpu(x_size, 0, fstate.delta, 1);
  92. forward_network_gpu(fnet, fstate);
  93. backward_network_gpu(fnet, fstate);
  94. //HERE
  95. astate.input = gen;
  96. fill_gpu(ax_size, 0, astate.delta, 1);
  97. forward_network_gpu(anet, astate);
  98. backward_network_gpu(anet, astate);
  99. float *delta = imlayer.delta_gpu;
  100. fill_gpu(x_size, 0, delta, 1);
  101. scal_gpu(x_size, 100, astate.delta, 1);
  102. scal_gpu(x_size, .001, fstate.delta, 1);
  103. axpy_gpu(x_size, 1, fstate.delta, 1, delta, 1);
  104. axpy_gpu(x_size, 1, astate.delta, 1, delta, 1);
  105. //fill_gpu(x_size, 0, delta, 1);
  106. //cuda_push_array(delta, X, x_size);
  107. //axpy_gpu(x_size, -1, imlayer.output_gpu, 1, delta, 1);
  108. //printf("pix error: %f\n", cuda_mag_array(delta, x_size));
  109. printf("fea error: %f\n", cuda_mag_array(fstate.delta, x_size));
  110. printf("adv error: %f\n", cuda_mag_array(astate.delta, x_size));
  111. //axpy_gpu(x_size, 1, astate.delta, 1, delta, 1);
  112. backward_network_gpu(gnet, gstate);
  113. floss += get_network_cost(fnet) /(fnet->subdivisions*fnet->batch);
  114. cuda_pull_array(imlayer.output_gpu, imlayer.output, imlayer.outputs*imlayer.batch);
  115. for(k = 0; k < gnet->batch; ++k){
  116. int index = j*gnet->batch + k;
  117. copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, generated.X.vals[index], 1);
  118. generated.y.vals[index][0] = .1;
  119. style.y.vals[index][0] = .9;
  120. }
  121. }
  122. */
  123. /*
  124. image sim = float_to_image(anet->w, anet->h, anet->c, style.X.vals[j]);
  125. show_image(sim, "style");
  126. cvWaitKey(0);
  127. */
  128. /*
  129. harmless_update_network_gpu(anet);
  130. data merge = concat_data(style, generated);
  131. randomize_data(merge);
  132. float aloss = train_network(anet, merge);
  133. update_network_gpu(gnet);
  134. free_data(merge);
  135. free_data(train);
  136. free_data(generated);
  137. free_data(style);
  138. if (aloss_avg < 0) aloss_avg = aloss;
  139. if (floss_avg < 0) floss_avg = floss;
  140. aloss_avg = aloss_avg*.9 + aloss*.1;
  141. floss_avg = floss_avg*.9 + floss*.1;
  142. printf("%d: gen: %f, adv: %f | gen_avg: %f, adv_avg: %f, %f rate, %lf seconds, %d images\n", i, floss, aloss, floss_avg, aloss_avg, get_current_rate(gnet), sec(clock()-time), i*imgs);
  143. if(i%1000==0){
  144. char buff[256];
  145. sprintf(buff, "%s/%s_%d.weights", backup_directory, gbase, i);
  146. save_weights(gnet, buff);
  147. sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i);
  148. save_weights(anet, buff);
  149. }
  150. if(i%100==0){
  151. char buff[256];
  152. sprintf(buff, "%s/%s.backup", backup_directory, gbase);
  153. save_weights(gnet, buff);
  154. sprintf(buff, "%s/%s.backup", backup_directory, abase);
  155. save_weights(anet, buff);
  156. }
  157. }
  158. #endif
  159. }
  160. */
  161. /*
  162. void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear)
  163. {
  164. #ifdef GPU
  165. //char *train_images = "/home/pjreddie/data/coco/train1.txt";
  166. //char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt";
  167. char *train_images = "/home/pjreddie/data/imagenet/imagenet1k.train.list";
  168. char *backup_directory = "/home/pjreddie/backup/";
  169. srand(time(0));
  170. char *base = basecfg(cfg);
  171. char *abase = basecfg(acfg);
  172. printf("%s\n", base);
  173. network net = load_network(cfg, weight, clear);
  174. network anet = load_network(acfg, aweight, clear);
  175. int i, j, k;
  176. layer imlayer = {0};
  177. for (i = 0; i < net->n; ++i) {
  178. if (net->layers[i].out_c == 3) {
  179. imlayer = net->layers[i];
  180. break;
  181. }
  182. }
  183. printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
  184. int imgs = net->batch*net->subdivisions;
  185. i = *net->seen/imgs;
  186. data train, buffer;
  187. list *plist = get_paths(train_images);
  188. //int N = plist->size;
  189. char **paths = (char **)list_to_array(plist);
  190. load_args args = {0};
  191. args.w = net->w;
  192. args.h = net->h;
  193. args.paths = paths;
  194. args.n = imgs;
  195. args.m = plist->size;
  196. args.d = &buffer;
  197. args.min = net->min_crop;
  198. args.max = net->max_crop;
  199. args.angle = net->angle;
  200. args.aspect = net->aspect;
  201. args.exposure = net->exposure;
  202. args.saturation = net->saturation;
  203. args.hue = net->hue;
  204. args.size = net->w;
  205. args.type = CLASSIFICATION_DATA;
  206. args.classes = 1;
  207. char *ls[1] = {"coco"};
  208. args.labels = ls;
  209. pthread_t load_thread = load_data_in_thread(args);
  210. clock_t time;
  211. network_state gstate = {0};
  212. gstate.index = 0;
  213. gstate.net = net;
  214. int x_size = get_network_input_size(net)*net->batch;
  215. int y_size = x_size;
  216. gstate.input = cuda_make_array(0, x_size);
  217. gstate.truth = cuda_make_array(0, y_size);
  218. gstate.delta = 0;
  219. gstate.train = 1;
  220. float *pixs = calloc(x_size, sizeof(float));
  221. float *graypixs = calloc(x_size, sizeof(float));
  222. float *y = calloc(y_size, sizeof(float));
  223. network_state astate = {0};
  224. astate.index = 0;
  225. astate.net = anet;
  226. int ay_size = get_network_output_size(anet)*anet->batch;
  227. astate.input = 0;
  228. astate.truth = 0;
  229. astate.delta = 0;
  230. astate.train = 1;
  231. float *imerror = cuda_make_array(0, imlayer.outputs);
  232. float *ones_gpu = cuda_make_array(0, ay_size);
  233. fill_gpu(ay_size, .9, ones_gpu, 1);
  234. float aloss_avg = -1;
  235. float gloss_avg = -1;
  236. //data generated = copy_data(train);
  237. while (get_current_batch(net) < net->max_batches) {
  238. i += 1;
  239. time=clock();
  240. pthread_join(load_thread, 0);
  241. train = buffer;
  242. load_thread = load_data_in_thread(args);
  243. printf("Loaded: %lf seconds\n", sec(clock()-time));
  244. data gray = copy_data(train);
  245. for(j = 0; j < imgs; ++j){
  246. image gim = float_to_image(net->w, net->h, net->c, gray.X.vals[j]);
  247. grayscale_image_3c(gim);
  248. train.y.vals[j][0] = .9;
  249. image yim = float_to_image(net->w, net->h, net->c, train.X.vals[j]);
  250. //rgb_to_yuv(yim);
  251. }
  252. time=clock();
  253. float gloss = 0;
  254. for(j = 0; j < net->subdivisions; ++j){
  255. get_next_batch(train, net->batch, j*net->batch, pixs, y);
  256. get_next_batch(gray, net->batch, j*net->batch, graypixs, y);
  257. cuda_push_array(gstate.input, graypixs, x_size);
  258. cuda_push_array(gstate.truth, pixs, y_size);
  259. */
  260. /*
  261. image origi = float_to_image(net->w, net->h, 3, pixs);
  262. image grayi = float_to_image(net->w, net->h, 3, graypixs);
  263. show_image(grayi, "gray");
  264. show_image(origi, "orig");
  265. cvWaitKey(0);
  266. */
  267. /*
  268. *net->seen += net->batch;
  269. forward_network_gpu(net, gstate);
  270. fill_gpu(imlayer.outputs, 0, imerror, 1);
  271. astate.input = imlayer.output_gpu;
  272. astate.delta = imerror;
  273. astate.truth = ones_gpu;
  274. forward_network_gpu(anet, astate);
  275. backward_network_gpu(anet, astate);
  276. scal_gpu(imlayer.outputs, .1, net->layers[net->n-1].delta_gpu, 1);
  277. backward_network_gpu(net, gstate);
  278. scal_gpu(imlayer.outputs, 1000, imerror, 1);
  279. printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs));
  280. printf("features %f\n", cuda_mag_array(net->layers[net->n-1].delta_gpu, imlayer.outputs));
  281. axpy_gpu(imlayer.outputs, 1, imerror, 1, imlayer.delta_gpu, 1);
  282. gloss += get_network_cost(net) /(net->subdivisions*net->batch);
  283. cuda_pull_array(imlayer.output_gpu, imlayer.output, imlayer.outputs*imlayer.batch);
  284. for(k = 0; k < net->batch; ++k){
  285. int index = j*net->batch + k;
  286. copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, gray.X.vals[index], 1);
  287. gray.y.vals[index][0] = .1;
  288. }
  289. }
  290. harmless_update_network_gpu(anet);
  291. data merge = concat_data(train, gray);
  292. randomize_data(merge);
  293. float aloss = train_network(anet, merge);
  294. update_network_gpu(net);
  295. update_network_gpu(anet);
  296. free_data(merge);
  297. free_data(train);
  298. free_data(gray);
  299. if (aloss_avg < 0) aloss_avg = aloss;
  300. aloss_avg = aloss_avg*.9 + aloss*.1;
  301. gloss_avg = gloss_avg*.9 + gloss*.1;
  302. printf("%d: gen: %f, adv: %f | gen_avg: %f, adv_avg: %f, %f rate, %lf seconds, %d images\n", i, gloss, aloss, gloss_avg, aloss_avg, get_current_rate(net), sec(clock()-time), i*imgs);
  303. if(i%1000==0){
  304. char buff[256];
  305. sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
  306. save_weights(net, buff);
  307. sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i);
  308. save_weights(anet, buff);
  309. }
  310. if(i%100==0){
  311. char buff[256];
  312. sprintf(buff, "%s/%s.backup", backup_directory, base);
  313. save_weights(net, buff);
  314. sprintf(buff, "%s/%s.backup", backup_directory, abase);
  315. save_weights(anet, buff);
  316. }
  317. }
  318. char buff[256];
  319. sprintf(buff, "%s/%s_final.weights", backup_directory, base);
  320. save_weights(net, buff);
  321. #endif
  322. }
  323. */
  324. void slerp(float *start, float *end, float s, int n, float *out)
  325. {
  326. float omega = acos(dot_cpu(n, start, 1, end, 1));
  327. float so = sin(omega);
  328. fill_cpu(n, 0, out, 1);
  329. axpy_cpu(n, sin((1-s)*omega)/so, start, 1, out, 1);
  330. axpy_cpu(n, sin(s*omega)/so, end, 1, out, 1);
  331. float mag = mag_array(out, n);
  332. scale_array(out, n, 1./mag);
  333. }
  334. image random_unit_vector_image(int w, int h, int c)
  335. {
  336. image im = make_image(w, h, c);
  337. int i;
  338. for(i = 0; i < im.w*im.h*im.c; ++i){
  339. im.data[i] = rand_normal();
  340. }
  341. float mag = mag_array(im.data, im.w*im.h*im.c);
  342. scale_array(im.data, im.w*im.h*im.c, 1./mag);
  343. return im;
  344. }
  345. void inter_dcgan(char *cfgfile, char *weightfile)
  346. {
  347. network *net = load_network(cfgfile, weightfile, 0);
  348. set_batch_network(net, 1);
  349. srand(2222222);
  350. clock_t time;
  351. char buff[256];
  352. char *input = buff;
  353. int i, imlayer = 0;
  354. for (i = 0; i < net->n; ++i) {
  355. if (net->layers[i].out_c == 3) {
  356. imlayer = i;
  357. printf("%d\n", i);
  358. break;
  359. }
  360. }
  361. image start = random_unit_vector_image(net->w, net->h, net->c);
  362. image end = random_unit_vector_image(net->w, net->h, net->c);
  363. image im = make_image(net->w, net->h, net->c);
  364. image orig = copy_image(start);
  365. int c = 0;
  366. int count = 0;
  367. int max_count = 15;
  368. while(1){
  369. ++c;
  370. if(count == max_count){
  371. count = 0;
  372. free_image(start);
  373. start = end;
  374. end = random_unit_vector_image(net->w, net->h, net->c);
  375. if(c > 300){
  376. end = orig;
  377. }
  378. if(c>300 + max_count) return;
  379. }
  380. ++count;
  381. slerp(start.data, end.data, (float)count / max_count, im.w*im.h*im.c, im.data);
  382. float *X = im.data;
  383. time=clock();
  384. network_predict(net, X);
  385. image out = get_network_image_layer(net, imlayer);
  386. //yuv_to_rgb(out);
  387. normalize_image(out);
  388. printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
  389. //char buff[256];
  390. sprintf(buff, "out%05d", c);
  391. save_image(out, "out");
  392. save_image(out, buff);
  393. show_image(out, "out", 0);
  394. }
  395. }
  396. void test_dcgan(char *cfgfile, char *weightfile)
  397. {
  398. network *net = load_network(cfgfile, weightfile, 0);
  399. set_batch_network(net, 1);
  400. srand(2222222);
  401. clock_t time;
  402. char buff[256];
  403. char *input = buff;
  404. int imlayer = 0;
  405. imlayer = net->n-1;
  406. while(1){
  407. image im = make_image(net->w, net->h, net->c);
  408. int i;
  409. for(i = 0; i < im.w*im.h*im.c; ++i){
  410. im.data[i] = rand_normal();
  411. }
  412. //float mag = mag_array(im.data, im.w*im.h*im.c);
  413. //scale_array(im.data, im.w*im.h*im.c, 1./mag);
  414. float *X = im.data;
  415. time=clock();
  416. network_predict(net, X);
  417. image out = get_network_image_layer(net, imlayer);
  418. //yuv_to_rgb(out);
  419. normalize_image(out);
  420. printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
  421. save_image(out, "out");
  422. show_image(out, "out", 0);
  423. free_image(im);
  424. }
  425. }
  426. void set_network_alpha_beta(network *net, float alpha, float beta)
  427. {
  428. int i;
  429. for(i = 0; i < net->n; ++i){
  430. if(net->layers[i].type == SHORTCUT){
  431. net->layers[i].alpha = alpha;
  432. net->layers[i].beta = beta;
  433. }
  434. }
  435. }
  436. void train_prog(char *cfg, char *weight, char *acfg, char *aweight, int clear, int display, char *train_images, int maxbatch)
  437. {
  438. #ifdef GPU
  439. char *backup_directory = "/home/pjreddie/backup/";
  440. srand(time(0));
  441. char *base = basecfg(cfg);
  442. char *abase = basecfg(acfg);
  443. printf("%s\n", base);
  444. network *gnet = load_network(cfg, weight, clear);
  445. network *anet = load_network(acfg, aweight, clear);
  446. int i, j, k;
  447. layer imlayer = gnet->layers[gnet->n-1];
  448. printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", gnet->learning_rate, gnet->momentum, gnet->decay);
  449. int imgs = gnet->batch*gnet->subdivisions;
  450. i = *gnet->seen/imgs;
  451. data train, buffer;
  452. list *plist = get_paths(train_images);
  453. char **paths = (char **)list_to_array(plist);
  454. load_args args= get_base_args(anet);
  455. args.paths = paths;
  456. args.n = imgs;
  457. args.m = plist->size;
  458. args.d = &buffer;
  459. args.type = CLASSIFICATION_DATA;
  460. args.threads=16;
  461. args.classes = 1;
  462. char *ls[2] = {"imagenet", "zzzzzzzz"};
  463. args.labels = ls;
  464. pthread_t load_thread = load_data_in_thread(args);
  465. clock_t time;
  466. gnet->train = 1;
  467. anet->train = 1;
  468. int x_size = gnet->inputs*gnet->batch;
  469. int y_size = gnet->truths*gnet->batch;
  470. float *imerror = cuda_make_array(0, y_size);
  471. float aloss_avg = -1;
  472. if (maxbatch == 0) maxbatch = gnet->max_batches;
  473. while (get_current_batch(gnet) < maxbatch) {
  474. {
  475. int cb = get_current_batch(gnet);
  476. float alpha = (float) cb / (maxbatch/2);
  477. if(alpha > 1) alpha = 1;
  478. float beta = 1 - alpha;
  479. printf("%f %f\n", alpha, beta);
  480. set_network_alpha_beta(gnet, alpha, beta);
  481. set_network_alpha_beta(anet, beta, alpha);
  482. }
  483. i += 1;
  484. time=clock();
  485. pthread_join(load_thread, 0);
  486. train = buffer;
  487. load_thread = load_data_in_thread(args);
  488. printf("Loaded: %lf seconds\n", sec(clock()-time));
  489. data gen = copy_data(train);
  490. for (j = 0; j < imgs; ++j) {
  491. train.y.vals[j][0] = 1;
  492. gen.y.vals[j][0] = 0;
  493. }
  494. time=clock();
  495. for (j = 0; j < gnet->subdivisions; ++j) {
  496. get_next_batch(train, gnet->batch, j*gnet->batch, gnet->truth, 0);
  497. int z;
  498. for(z = 0; z < x_size; ++z){
  499. gnet->input[z] = rand_normal();
  500. }
  501. /*
  502. for(z = 0; z < gnet->batch; ++z){
  503. float mag = mag_array(gnet->input + z*gnet->inputs, gnet->inputs);
  504. scale_array(gnet->input + z*gnet->inputs, gnet->inputs, 1./mag);
  505. }
  506. */
  507. *gnet->seen += gnet->batch;
  508. forward_network(gnet);
  509. fill_gpu(imlayer.outputs*imlayer.batch, 0, imerror, 1);
  510. fill_cpu(anet->truths*anet->batch, 1, anet->truth, 1);
  511. copy_cpu(anet->inputs*anet->batch, imlayer.output, 1, anet->input, 1);
  512. anet->delta_gpu = imerror;
  513. forward_network(anet);
  514. backward_network(anet);
  515. //float genaloss = *anet->cost / anet->batch;
  516. scal_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1);
  517. scal_gpu(imlayer.outputs*imlayer.batch, 0, gnet->layers[gnet->n-1].delta_gpu, 1);
  518. axpy_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, gnet->layers[gnet->n-1].delta_gpu, 1);
  519. backward_network(gnet);
  520. for(k = 0; k < gnet->batch; ++k){
  521. int index = j*gnet->batch + k;
  522. copy_cpu(gnet->outputs, gnet->output + k*gnet->outputs, 1, gen.X.vals[index], 1);
  523. }
  524. }
  525. harmless_update_network_gpu(anet);
  526. data merge = concat_data(train, gen);
  527. float aloss = train_network(anet, merge);
  528. #ifdef OPENCV
  529. if(display){
  530. image im = float_to_image(anet->w, anet->h, anet->c, gen.X.vals[0]);
  531. image im2 = float_to_image(anet->w, anet->h, anet->c, train.X.vals[0]);
  532. show_image(im, "gen", 1);
  533. show_image(im2, "train", 1);
  534. save_image(im, "gen");
  535. save_image(im2, "train");
  536. }
  537. #endif
  538. update_network_gpu(gnet);
  539. free_data(merge);
  540. free_data(train);
  541. free_data(gen);
  542. if (aloss_avg < 0) aloss_avg = aloss;
  543. aloss_avg = aloss_avg*.9 + aloss*.1;
  544. printf("%d: adv: %f | adv_avg: %f, %f rate, %lf seconds, %d images\n", i, aloss, aloss_avg, get_current_rate(gnet), sec(clock()-time), i*imgs);
  545. if(i%10000==0){
  546. char buff[256];
  547. sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
  548. save_weights(gnet, buff);
  549. sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i);
  550. save_weights(anet, buff);
  551. }
  552. if(i%1000==0){
  553. char buff[256];
  554. sprintf(buff, "%s/%s.backup", backup_directory, base);
  555. save_weights(gnet, buff);
  556. sprintf(buff, "%s/%s.backup", backup_directory, abase);
  557. save_weights(anet, buff);
  558. }
  559. }
  560. char buff[256];
  561. sprintf(buff, "%s/%s_final.weights", backup_directory, base);
  562. save_weights(gnet, buff);
  563. #endif
  564. }
  565. void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, int display, char *train_images, int maxbatch)
  566. {
  567. #ifdef GPU
  568. char *backup_directory = "/home/pjreddie/backup/";
  569. srand(time(0));
  570. char *base = basecfg(cfg);
  571. char *abase = basecfg(acfg);
  572. printf("%s\n", base);
  573. network *gnet = load_network(cfg, weight, clear);
  574. network *anet = load_network(acfg, aweight, clear);
  575. //float orig_rate = anet->learning_rate;
  576. int i, j, k;
  577. layer imlayer = {0};
  578. for (i = 0; i < gnet->n; ++i) {
  579. if (gnet->layers[i].out_c == 3) {
  580. imlayer = gnet->layers[i];
  581. break;
  582. }
  583. }
  584. printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", gnet->learning_rate, gnet->momentum, gnet->decay);
  585. int imgs = gnet->batch*gnet->subdivisions;
  586. i = *gnet->seen/imgs;
  587. data train, buffer;
  588. list *plist = get_paths(train_images);
  589. //int N = plist->size;
  590. char **paths = (char **)list_to_array(plist);
  591. load_args args= get_base_args(anet);
  592. args.paths = paths;
  593. args.n = imgs;
  594. args.m = plist->size;
  595. args.d = &buffer;
  596. args.type = CLASSIFICATION_DATA;
  597. args.threads=16;
  598. args.classes = 1;
  599. char *ls[2] = {"imagenet", "zzzzzzzz"};
  600. args.labels = ls;
  601. pthread_t load_thread = load_data_in_thread(args);
  602. clock_t time;
  603. gnet->train = 1;
  604. anet->train = 1;
  605. int x_size = gnet->inputs*gnet->batch;
  606. int y_size = gnet->truths*gnet->batch;
  607. float *imerror = cuda_make_array(0, y_size);
  608. //int ay_size = anet->truths*anet->batch;
  609. float aloss_avg = -1;
  610. //data generated = copy_data(train);
  611. if (maxbatch == 0) maxbatch = gnet->max_batches;
  612. while (get_current_batch(gnet) < maxbatch) {
  613. i += 1;
  614. time=clock();
  615. pthread_join(load_thread, 0);
  616. train = buffer;
  617. //translate_data_rows(train, -.5);
  618. //scale_data_rows(train, 2);
  619. load_thread = load_data_in_thread(args);
  620. printf("Loaded: %lf seconds\n", sec(clock()-time));
  621. data gen = copy_data(train);
  622. for (j = 0; j < imgs; ++j) {
  623. train.y.vals[j][0] = 1;
  624. gen.y.vals[j][0] = 0;
  625. }
  626. time=clock();
  627. for(j = 0; j < gnet->subdivisions; ++j){
  628. get_next_batch(train, gnet->batch, j*gnet->batch, gnet->truth, 0);
  629. int z;
  630. for(z = 0; z < x_size; ++z){
  631. gnet->input[z] = rand_normal();
  632. }
  633. for(z = 0; z < gnet->batch; ++z){
  634. float mag = mag_array(gnet->input + z*gnet->inputs, gnet->inputs);
  635. scale_array(gnet->input + z*gnet->inputs, gnet->inputs, 1./mag);
  636. }
  637. /*
  638. for(z = 0; z < 100; ++z){
  639. printf("%f, ", gnet->input[z]);
  640. }
  641. printf("\n");
  642. printf("input: %f %f\n", mean_array(gnet->input, x_size), variance_array(gnet->input, x_size));
  643. */
  644. //cuda_push_array(gnet->input_gpu, gnet->input, x_size);
  645. //cuda_push_array(gnet->truth_gpu, gnet->truth, y_size);
  646. *gnet->seen += gnet->batch;
  647. forward_network(gnet);
  648. fill_gpu(imlayer.outputs*imlayer.batch, 0, imerror, 1);
  649. fill_cpu(anet->truths*anet->batch, 1, anet->truth, 1);
  650. copy_cpu(anet->inputs*anet->batch, imlayer.output, 1, anet->input, 1);
  651. anet->delta_gpu = imerror;
  652. forward_network(anet);
  653. backward_network(anet);
  654. //float genaloss = *anet->cost / anet->batch;
  655. //printf("%f\n", genaloss);
  656. scal_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1);
  657. scal_gpu(imlayer.outputs*imlayer.batch, 0, gnet->layers[gnet->n-1].delta_gpu, 1);
  658. //printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs*imlayer.batch));
  659. //printf("features %f\n", cuda_mag_array(gnet->layers[gnet->n-1].delta_gpu, imlayer.outputs*imlayer.batch));
  660. axpy_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, gnet->layers[gnet->n-1].delta_gpu, 1);
  661. backward_network(gnet);
  662. /*
  663. for(k = 0; k < gnet->n; ++k){
  664. layer l = gnet->layers[k];
  665. cuda_pull_array(l.output_gpu, l.output, l.outputs*l.batch);
  666. printf("%d: %f %f\n", k, mean_array(l.output, l.outputs*l.batch), variance_array(l.output, l.outputs*l.batch));
  667. }
  668. */
  669. for(k = 0; k < gnet->batch; ++k){
  670. int index = j*gnet->batch + k;
  671. copy_cpu(gnet->outputs, gnet->output + k*gnet->outputs, 1, gen.X.vals[index], 1);
  672. }
  673. }
  674. harmless_update_network_gpu(anet);
  675. data merge = concat_data(train, gen);
  676. //randomize_data(merge);
  677. float aloss = train_network(anet, merge);
  678. //translate_image(im, 1);
  679. //scale_image(im, .5);
  680. //translate_image(im2, 1);
  681. //scale_image(im2, .5);
  682. #ifdef OPENCV
  683. if(display){
  684. image im = float_to_image(anet->w, anet->h, anet->c, gen.X.vals[0]);
  685. image im2 = float_to_image(anet->w, anet->h, anet->c, train.X.vals[0]);
  686. show_image(im, "gen", 1);
  687. show_image(im2, "train", 1);
  688. save_image(im, "gen");
  689. save_image(im2, "train");
  690. }
  691. #endif
  692. /*
  693. if(aloss < .1){
  694. anet->learning_rate = 0;
  695. } else if (aloss > .3){
  696. anet->learning_rate = orig_rate;
  697. }
  698. */
  699. update_network_gpu(gnet);
  700. free_data(merge);
  701. free_data(train);
  702. free_data(gen);
  703. if (aloss_avg < 0) aloss_avg = aloss;
  704. aloss_avg = aloss_avg*.9 + aloss*.1;
  705. printf("%d: adv: %f | adv_avg: %f, %f rate, %lf seconds, %d images\n", i, aloss, aloss_avg, get_current_rate(gnet), sec(clock()-time), i*imgs);
  706. if(i%10000==0){
  707. char buff[256];
  708. sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
  709. save_weights(gnet, buff);
  710. sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i);
  711. save_weights(anet, buff);
  712. }
  713. if(i%1000==0){
  714. char buff[256];
  715. sprintf(buff, "%s/%s.backup", backup_directory, base);
  716. save_weights(gnet, buff);
  717. sprintf(buff, "%s/%s.backup", backup_directory, abase);
  718. save_weights(anet, buff);
  719. }
  720. }
  721. char buff[256];
  722. sprintf(buff, "%s/%s_final.weights", backup_directory, base);
  723. save_weights(gnet, buff);
  724. #endif
  725. }
  726. void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int clear, int display)
  727. {
  728. #ifdef GPU
  729. //char *train_images = "/home/pjreddie/data/coco/train1.txt";
  730. //char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt";
  731. char *train_images = "/home/pjreddie/data/imagenet/imagenet1k.train.list";
  732. char *backup_directory = "/home/pjreddie/backup/";
  733. srand(time(0));
  734. char *base = basecfg(cfg);
  735. char *abase = basecfg(acfg);
  736. printf("%s\n", base);
  737. network *net = load_network(cfg, weight, clear);
  738. network *anet = load_network(acfg, aweight, clear);
  739. int i, j, k;
  740. layer imlayer = {0};
  741. for (i = 0; i < net->n; ++i) {
  742. if (net->layers[i].out_c == 3) {
  743. imlayer = net->layers[i];
  744. break;
  745. }
  746. }
  747. printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
  748. int imgs = net->batch*net->subdivisions;
  749. i = *net->seen/imgs;
  750. data train, buffer;
  751. list *plist = get_paths(train_images);
  752. //int N = plist->size;
  753. char **paths = (char **)list_to_array(plist);
  754. load_args args= get_base_args(net);
  755. args.paths = paths;
  756. args.n = imgs;
  757. args.m = plist->size;
  758. args.d = &buffer;
  759. args.type = CLASSIFICATION_DATA;
  760. args.classes = 1;
  761. char *ls[2] = {"imagenet"};
  762. args.labels = ls;
  763. pthread_t load_thread = load_data_in_thread(args);
  764. clock_t time;
  765. int x_size = net->inputs*net->batch;
  766. //int y_size = x_size;
  767. net->delta = 0;
  768. net->train = 1;
  769. float *pixs = calloc(x_size, sizeof(float));
  770. float *graypixs = calloc(x_size, sizeof(float));
  771. //float *y = calloc(y_size, sizeof(float));
  772. //int ay_size = anet->outputs*anet->batch;
  773. anet->delta = 0;
  774. anet->train = 1;
  775. float *imerror = cuda_make_array(0, imlayer.outputs*imlayer.batch);
  776. float aloss_avg = -1;
  777. float gloss_avg = -1;
  778. //data generated = copy_data(train);
  779. while (get_current_batch(net) < net->max_batches) {
  780. i += 1;
  781. time=clock();
  782. pthread_join(load_thread, 0);
  783. train = buffer;
  784. load_thread = load_data_in_thread(args);
  785. printf("Loaded: %lf seconds\n", sec(clock()-time));
  786. data gray = copy_data(train);
  787. for(j = 0; j < imgs; ++j){
  788. image gim = float_to_image(net->w, net->h, net->c, gray.X.vals[j]);
  789. grayscale_image_3c(gim);
  790. train.y.vals[j][0] = .95;
  791. gray.y.vals[j][0] = .05;
  792. }
  793. time=clock();
  794. float gloss = 0;
  795. for(j = 0; j < net->subdivisions; ++j){
  796. get_next_batch(train, net->batch, j*net->batch, pixs, 0);
  797. get_next_batch(gray, net->batch, j*net->batch, graypixs, 0);
  798. cuda_push_array(net->input_gpu, graypixs, net->inputs*net->batch);
  799. cuda_push_array(net->truth_gpu, pixs, net->truths*net->batch);
  800. /*
  801. image origi = float_to_image(net->w, net->h, 3, pixs);
  802. image grayi = float_to_image(net->w, net->h, 3, graypixs);
  803. show_image(grayi, "gray");
  804. show_image(origi, "orig");
  805. cvWaitKey(0);
  806. */
  807. *net->seen += net->batch;
  808. forward_network_gpu(net);
  809. fill_gpu(imlayer.outputs*imlayer.batch, 0, imerror, 1);
  810. copy_gpu(anet->inputs*anet->batch, imlayer.output_gpu, 1, anet->input_gpu, 1);
  811. fill_gpu(anet->inputs*anet->batch, .95, anet->truth_gpu, 1);
  812. anet->delta_gpu = imerror;
  813. forward_network_gpu(anet);
  814. backward_network_gpu(anet);
  815. scal_gpu(imlayer.outputs*imlayer.batch, 1./100., net->layers[net->n-1].delta_gpu, 1);
  816. scal_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1);
  817. printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs*imlayer.batch));
  818. printf("features %f\n", cuda_mag_array(net->layers[net->n-1].delta_gpu, imlayer.outputs*imlayer.batch));
  819. axpy_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, net->layers[net->n-1].delta_gpu, 1);
  820. backward_network_gpu(net);
  821. gloss += *net->cost /(net->subdivisions*net->batch);
  822. for(k = 0; k < net->batch; ++k){
  823. int index = j*net->batch + k;
  824. copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, gray.X.vals[index], 1);
  825. }
  826. }
  827. harmless_update_network_gpu(anet);
  828. data merge = concat_data(train, gray);
  829. //randomize_data(merge);
  830. float aloss = train_network(anet, merge);
  831. update_network_gpu(net);
  832. #ifdef OPENCV
  833. if(display){
  834. image im = float_to_image(anet->w, anet->h, anet->c, gray.X.vals[0]);
  835. image im2 = float_to_image(anet->w, anet->h, anet->c, train.X.vals[0]);
  836. show_image(im, "gen", 1);
  837. show_image(im2, "train", 1);
  838. }
  839. #endif
  840. free_data(merge);
  841. free_data(train);
  842. free_data(gray);
  843. if (aloss_avg < 0) aloss_avg = aloss;
  844. aloss_avg = aloss_avg*.9 + aloss*.1;
  845. gloss_avg = gloss_avg*.9 + gloss*.1;
  846. printf("%d: gen: %f, adv: %f | gen_avg: %f, adv_avg: %f, %f rate, %lf seconds, %d images\n", i, gloss, aloss, gloss_avg, aloss_avg, get_current_rate(net), sec(clock()-time), i*imgs);
  847. if(i%1000==0){
  848. char buff[256];
  849. sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
  850. save_weights(net, buff);
  851. sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i);
  852. save_weights(anet, buff);
  853. }
  854. if(i%100==0){
  855. char buff[256];
  856. sprintf(buff, "%s/%s.backup", backup_directory, base);
  857. save_weights(net, buff);
  858. sprintf(buff, "%s/%s.backup", backup_directory, abase);
  859. save_weights(anet, buff);
  860. }
  861. }
  862. char buff[256];
  863. sprintf(buff, "%s/%s_final.weights", backup_directory, base);
  864. save_weights(net, buff);
  865. #endif
  866. }
  867. /*
  868. void train_lsd2(char *cfgfile, char *weightfile, char *acfgfile, char *aweightfile, int clear)
  869. {
  870. #ifdef GPU
  871. char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt";
  872. char *backup_directory = "/home/pjreddie/backup/";
  873. srand(time(0));
  874. char *base = basecfg(cfgfile);
  875. printf("%s\n", base);
  876. network net = parse_network_cfg(cfgfile);
  877. if(weightfile){
  878. load_weights(&net, weightfile);
  879. }
  880. if(clear) *net->seen = 0;
  881. char *abase = basecfg(acfgfile);
  882. network anet = parse_network_cfg(acfgfile);
  883. if(aweightfile){
  884. load_weights(&anet, aweightfile);
  885. }
  886. if(clear) *anet->seen = 0;
  887. int i, j, k;
  888. layer imlayer = {0};
  889. for (i = 0; i < net->n; ++i) {
  890. if (net->layers[i].out_c == 3) {
  891. imlayer = net->layers[i];
  892. break;
  893. }
  894. }
  895. printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
  896. int imgs = net->batch*net->subdivisions;
  897. i = *net->seen/imgs;
  898. data train, buffer;
  899. list *plist = get_paths(train_images);
  900. //int N = plist->size;
  901. char **paths = (char **)list_to_array(plist);
  902. load_args args = {0};
  903. args.w = net->w;
  904. args.h = net->h;
  905. args.paths = paths;
  906. args.n = imgs;
  907. args.m = plist->size;
  908. args.d = &buffer;
  909. args.min = net->min_crop;
  910. args.max = net->max_crop;
  911. args.angle = net->angle;
  912. args.aspect = net->aspect;
  913. args.exposure = net->exposure;
  914. args.saturation = net->saturation;
  915. args.hue = net->hue;
  916. args.size = net->w;
  917. args.type = CLASSIFICATION_DATA;
  918. args.classes = 1;
  919. char *ls[1] = {"coco"};
  920. args.labels = ls;
  921. pthread_t load_thread = load_data_in_thread(args);
  922. clock_t time;
  923. network_state gstate = {0};
  924. gstate.index = 0;
  925. gstate.net = net;
  926. int x_size = get_network_input_size(net)*net->batch;
  927. int y_size = 1*net->batch;
  928. gstate.input = cuda_make_array(0, x_size);
  929. gstate.truth = 0;
  930. gstate.delta = 0;
  931. gstate.train = 1;
  932. float *X = calloc(x_size, sizeof(float));
  933. float *y = calloc(y_size, sizeof(float));
  934. network_state astate = {0};
  935. astate.index = 0;
  936. astate.net = anet;
  937. int ay_size = get_network_output_size(anet)*anet->batch;
  938. astate.input = 0;
  939. astate.truth = 0;
  940. astate.delta = 0;
  941. astate.train = 1;
  942. float *imerror = cuda_make_array(0, imlayer.outputs);
  943. float *ones_gpu = cuda_make_array(0, ay_size);
  944. fill_gpu(ay_size, 1, ones_gpu, 1);
  945. float aloss_avg = -1;
  946. float gloss_avg = -1;
  947. //data generated = copy_data(train);
  948. while (get_current_batch(net) < net->max_batches) {
  949. i += 1;
  950. time=clock();
  951. pthread_join(load_thread, 0);
  952. train = buffer;
  953. load_thread = load_data_in_thread(args);
  954. printf("Loaded: %lf seconds\n", sec(clock()-time));
  955. data generated = copy_data(train);
  956. time=clock();
  957. float gloss = 0;
  958. for(j = 0; j < net->subdivisions; ++j){
  959. get_next_batch(train, net->batch, j*net->batch, X, y);
  960. cuda_push_array(gstate.input, X, x_size);
  961. *net->seen += net->batch;
  962. forward_network_gpu(net, gstate);
  963. fill_gpu(imlayer.outputs, 0, imerror, 1);
  964. astate.input = imlayer.output_gpu;
  965. astate.delta = imerror;
  966. astate.truth = ones_gpu;
  967. forward_network_gpu(anet, astate);
  968. backward_network_gpu(anet, astate);
  969. scal_gpu(imlayer.outputs, 1, imerror, 1);
  970. axpy_gpu(imlayer.outputs, 1, imerror, 1, imlayer.delta_gpu, 1);
  971. backward_network_gpu(net, gstate);
  972. printf("features %f\n", cuda_mag_array(imlayer.delta_gpu, imlayer.outputs));
  973. printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs));
  974. gloss += get_network_cost(net) /(net->subdivisions*net->batch);
  975. cuda_pull_array(imlayer.output_gpu, imlayer.output, imlayer.outputs*imlayer.batch);
  976. for(k = 0; k < net->batch; ++k){
  977. int index = j*net->batch + k;
  978. copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, generated.X.vals[index], 1);
  979. generated.y.vals[index][0] = 0;
  980. }
  981. }
  982. harmless_update_network_gpu(anet);
  983. data merge = concat_data(train, generated);
  984. randomize_data(merge);
  985. float aloss = train_network(anet, merge);
  986. update_network_gpu(net);
  987. update_network_gpu(anet);
  988. free_data(merge);
  989. free_data(train);
  990. free_data(generated);
  991. if (aloss_avg < 0) aloss_avg = aloss;
  992. aloss_avg = aloss_avg*.9 + aloss*.1;
  993. gloss_avg = gloss_avg*.9 + gloss*.1;
  994. printf("%d: gen: %f, adv: %f | gen_avg: %f, adv_avg: %f, %f rate, %lf seconds, %d images\n", i, gloss, aloss, gloss_avg, aloss_avg, get_current_rate(net), sec(clock()-time), i*imgs);
  995. if(i%1000==0){
  996. char buff[256];
  997. sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
  998. save_weights(net, buff);
  999. sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i);
  1000. save_weights(anet, buff);
  1001. }
  1002. if(i%100==0){
  1003. char buff[256];
  1004. sprintf(buff, "%s/%s.backup", backup_directory, base);
  1005. save_weights(net, buff);
  1006. sprintf(buff, "%s/%s.backup", backup_directory, abase);
  1007. save_weights(anet, buff);
  1008. }
  1009. }
  1010. char buff[256];
  1011. sprintf(buff, "%s/%s_final.weights", backup_directory, base);
  1012. save_weights(net, buff);
  1013. #endif
  1014. }
  1015. */
  1016. /*
  1017. void train_lsd(char *cfgfile, char *weightfile, int clear)
  1018. {
  1019. char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt";
  1020. char *backup_directory = "/home/pjreddie/backup/";
  1021. srand(time(0));
  1022. char *base = basecfg(cfgfile);
  1023. printf("%s\n", base);
  1024. float avg_loss = -1;
  1025. network net = parse_network_cfg(cfgfile);
  1026. if(weightfile){
  1027. load_weights(&net, weightfile);
  1028. }
  1029. if(clear) *net->seen = 0;
  1030. printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
  1031. int imgs = net->batch*net->subdivisions;
  1032. int i = *net->seen/imgs;
  1033. data train, buffer;
  1034. list *plist = get_paths(train_images);
  1035. //int N = plist->size;
  1036. char **paths = (char **)list_to_array(plist);
  1037. load_args args = {0};
  1038. args.w = net->w;
  1039. args.h = net->h;
  1040. args.paths = paths;
  1041. args.n = imgs;
  1042. args.m = plist->size;
  1043. args.d = &buffer;
  1044. args.min = net->min_crop;
  1045. args.max = net->max_crop;
  1046. args.angle = net->angle;
  1047. args.aspect = net->aspect;
  1048. args.exposure = net->exposure;
  1049. args.saturation = net->saturation;
  1050. args.hue = net->hue;
  1051. args.size = net->w;
  1052. args.type = CLASSIFICATION_DATA;
  1053. args.classes = 1;
  1054. char *ls[1] = {"coco"};
  1055. args.labels = ls;
  1056. pthread_t load_thread = load_data_in_thread(args);
  1057. clock_t time;
  1058. //while(i*imgs < N*120){
  1059. while(get_current_batch(net) < net->max_batches){
  1060. i += 1;
  1061. time=clock();
  1062. pthread_join(load_thread, 0);
  1063. train = buffer;
  1064. load_thread = load_data_in_thread(args);
  1065. printf("Loaded: %lf seconds\n", sec(clock()-time));
  1066. time=clock();
  1067. float loss = train_network(net, train);
  1068. if (avg_loss < 0) avg_loss = loss;
  1069. avg_loss = avg_loss*.9 + loss*.1;
  1070. printf("%d: %f, %f avg, %f rate, %lf seconds, %d images\n", i, loss, avg_loss, get_current_rate(net), sec(clock()-time), i*imgs);
  1071. if(i%1000==0){
  1072. char buff[256];
  1073. sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
  1074. save_weights(net, buff);
  1075. }
  1076. if(i%100==0){
  1077. char buff[256];
  1078. sprintf(buff, "%s/%s.backup", backup_directory, base);
  1079. save_weights(net, buff);
  1080. }
  1081. free_data(train);
  1082. }
  1083. char buff[256];
  1084. sprintf(buff, "%s/%s_final.weights", backup_directory, base);
  1085. save_weights(net, buff);
  1086. }
  1087. */
  1088. void test_lsd(char *cfg, char *weights, char *filename, int gray)
  1089. {
  1090. network *net = load_network(cfg, weights, 0);
  1091. set_batch_network(net, 1);
  1092. srand(2222222);
  1093. clock_t time;
  1094. char buff[256];
  1095. char *input = buff;
  1096. int i, imlayer = 0;
  1097. for (i = 0; i < net->n; ++i) {
  1098. if (net->layers[i].out_c == 3) {
  1099. imlayer = i;
  1100. printf("%d\n", i);
  1101. break;
  1102. }
  1103. }
  1104. while(1){
  1105. if(filename){
  1106. strncpy(input, filename, 256);
  1107. }else{
  1108. printf("Enter Image Path: ");
  1109. fflush(stdout);
  1110. input = fgets(input, 256, stdin);
  1111. if(!input) return;
  1112. strtok(input, "\n");
  1113. }
  1114. image im = load_image_color(input, 0, 0);
  1115. image resized = resize_min(im, net->w);
  1116. image crop = crop_image(resized, (resized.w - net->w)/2, (resized.h - net->h)/2, net->w, net->h);
  1117. if(gray) grayscale_image_3c(crop);
  1118. float *X = crop.data;
  1119. time=clock();
  1120. network_predict(net, X);
  1121. image out = get_network_image_layer(net, imlayer);
  1122. //yuv_to_rgb(out);
  1123. constrain_image(out);
  1124. printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
  1125. save_image(out, "out");
  1126. show_image(out, "out", 1);
  1127. show_image(crop, "crop", 0);
  1128. free_image(im);
  1129. free_image(resized);
  1130. free_image(crop);
  1131. if (filename) break;
  1132. }
  1133. }
  1134. void run_lsd(int argc, char **argv)
  1135. {
  1136. if(argc < 4){
  1137. fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
  1138. return;
  1139. }
  1140. int clear = find_arg(argc, argv, "-clear");
  1141. int display = find_arg(argc, argv, "-display");
  1142. int batches = find_int_arg(argc, argv, "-b", 0);
  1143. char *file = find_char_arg(argc, argv, "-file", "/home/pjreddie/data/imagenet/imagenet1k.train.list");
  1144. char *cfg = argv[3];
  1145. char *weights = (argc > 4) ? argv[4] : 0;
  1146. char *filename = (argc > 5) ? argv[5] : 0;
  1147. char *acfg = argv[5];
  1148. char *aweights = (argc > 6) ? argv[6] : 0;
  1149. //if(0==strcmp(argv[2], "train")) train_lsd(cfg, weights, clear);
  1150. //else if(0==strcmp(argv[2], "train2")) train_lsd2(cfg, weights, acfg, aweights, clear);
  1151. //else if(0==strcmp(argv[2], "traincolor")) train_colorizer(cfg, weights, acfg, aweights, clear);
  1152. //else if(0==strcmp(argv[2], "train3")) train_lsd3(argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], clear);
  1153. if(0==strcmp(argv[2], "traingan")) train_dcgan(cfg, weights, acfg, aweights, clear, display, file, batches);
  1154. else if(0==strcmp(argv[2], "trainprog")) train_prog(cfg, weights, acfg, aweights, clear, display, file, batches);
  1155. else if(0==strcmp(argv[2], "traincolor")) train_colorizer(cfg, weights, acfg, aweights, clear, display);
  1156. else if(0==strcmp(argv[2], "gan")) test_dcgan(cfg, weights);
  1157. else if(0==strcmp(argv[2], "inter")) inter_dcgan(cfg, weights);
  1158. else if(0==strcmp(argv[2], "test")) test_lsd(cfg, weights, filename, 0);
  1159. else if(0==strcmp(argv[2], "color")) test_lsd(cfg, weights, filename, 1);
  1160. /*
  1161. else if(0==strcmp(argv[2], "valid")) validate_lsd(cfg, weights);
  1162. */
  1163. }