¶Ô´ó¶àÊý´ÓÊ»úÆ÷ѧϰ¹¤×÷µÄÈËÀ´Ëµ£¬Éè¼ÆÒ»¸öÉñ¾ÍøÂçÎÞÒìÓÚÖÆ×÷Ò»ÏîÒÕÊõ×÷Æ·¡£Éñ¾ÍøÂçͨ³£Ê¼ÓÚÒ»¸ö³£¼ûµÄ¼Ü¹¹£¬È»ºóÎÒÃÇÐèÒª¶Ô²ÎÊý²»¶ÏµØ½øÐе÷ÕûºÍÓÅ»¯£¬Ö±µ½ÕÒµ½Ò»¸öºÃµÄ×éºÏ²ã¡¢¼¤»îº¯Êý¡¢ÕýÔò»¯Æ÷ºÍÓÅ»¯²ÎÊý¡£ÔÚһЩ֪ÃûµÄÉñ¾ÍøÂç¼Ü¹¹£¬ÈçVGG¡¢Inception¡¢ResNets¡¢DenseNetsµÈµÄÖ¸µ¼Ï£¬ÎÒÃÇÐèÒª¶ÔÍøÂçµÄ±äÁ¿½øÐÐÖØ¸´µÄ²Ù×÷£¬Ö±µ½ÍøÂç´ïµ½ÎÒÃÇÆÚÍûµÄËÙ¶ÈÓë׼ȷ¶È¡£Ëæ×ÅÍøÂç´¦ÀíÄÜÁ¦µÄ²»¶ÏÌá¸ß£¬½«ÍøÂçÓÅ»¯´¦Àí³ÌÐò×Ô¶¯»¯±äµÃÔ½À´Ô½¿ÉÐС£
ÔÚÏñRandom ForestsºÍSVMsÕâÑùµÄdzģÐÍÖУ¬ÎÒÃÇÒѾÄܹ»Ê¹³¬²ÎÊýÓÅ»¯µÄ²Ù×÷×Ô¶¯»¯½øÐÐÁË¡£Ò»Ð©³£ÓõŤ¾ß°ü£¬±ÈÈçsk-learn£¬ÏòÎÒÃÇÌṩÁËËÑË÷³¬²ÎÊý¿Õ¼äµÄ·½·¨¡£ÔÚÆä×î¼òµ¥µÄ¡¢×î»ù´¡µÄ¸ñʽÖУ¬¡°³¬²ÎÊý¡±ÊÇÎÒÃÇÔÚËùÓпÉÄܵIJÎÊýÖÐËÑË÷µÃµ½µÄ£¬»òÕßÊÇͨ¹ý´Ó²ÎÊý·Ö²¼ÖÐÈÎÒâ²ÉÑùµÃµ½µÄ¡££¨ÏêÇéÇëµã»÷´ËÁ´½Ó²é¿´¡££©ÕâÁ½ÖÖ·½·¨¶¼ÃæÁÙ×ÅÁ½¸öÎÊÌ⣺µÚÒ»£¬ÔÚ´íÎó²ÎÊýÇøÓò½øÐÐËÑË÷ʱ»áÔì³É×ÊÔ´ÀË·Ñ£»µÚ¶þ£¬´¦Àí´óÁ¿µÄ¶¯Ì¬ÌØÕ÷²ÎÊý¼¯½«µ¼ÖÂЧÂʹýµÍ¡£Òò´Ë£¬¸Ä±ä´¦ÀíÆ÷µÄ¼Ü¹¹±äµÃÏ൱À§ÄÑ¡£ËäÈ»ÏÖÔÚÓÐºÜ¶à¿´ËÆ¸ßЧµÄ·½·¨£¬±ÈÈçBayesianÓÅ»¯·½·¨¡£µ«BayesianÓÅ»¯·¨ËäÈ»Äܹ»½â¾öÁ˵ÚÒ»¸öÎÊÌ⣬ȴ¶ÔµÚ¶þ¸öÎÊÌâÎÞÄÜΪÁ¦£»ÁíÍ⣬ÔÚBayesianÓÅ»¯ÉèÖÃÖÐÒ²ºÜÄѽøÐÐ̽Ë÷Ä£ÐÍ¡£
×Ô¶¯Ê¶±ð×î¼ÑÄ£Ð͵ÄÏë·¨¾ÍÏÖÔÚÀ´ËµÒѾ²»ËãÐÂÏÊÁË£¬ÔÙ¼ÓÉÏ×î½ü´ó·ù¶ÈÌáÉýµÄ´¦ÀíÄÜÁ¦£¬ÊµÏÖÕâÒ»Ïë·¨±ÈÒÔÍùÈκÎʱºò¶¼ÒªÈÝÒס£
ÎÊÌâÉ趨
¿¼Âdz¬²ÎÊýÓÅ»¯µÄ·½Ê½Ö®Ò»£¬¾ÍÊǽ«Ëü¿´×öÒ»¸ö¡°ÔªÑ§Ï°ÎÊÌ⡱¡£
ÎÒÃǾ¿¾¹ÄÜ·ñ´òÔì³öÒ»¸ö¿ÉÒÔÓÃÓÚÅжÏÍøÂçÐÔÄܺûµµÄËã·¨ÄØ£¿
×¢Ò⣺½ÓÏÂÀ´ÎÒ½«¼ÌÐøÊ¹Óá°ÔªÑ§Ï°¡±Õâ¸öÊõÓ¼´Ê¹½«Õâ¸öÎÊÌâÃèÊöΪ¡°ÔªÑ§Ï°¡±Óеã»ìÏýÊÓÌý£¬µ«ÎÒÃÇǧÍò²»ÄܰÑËüÓ롰ѧϰ¡±Ïà¹ØµÄһЩ·½·¨Åª»ìÁË¡£
ÎÒÃǵÄÄ¿±êÊǶ¨ÒåÍøÂçÒþº¬²ã£¨ÂÌÉ«£©µÄÊýÁ¿ÒÔ¼°Ã¿¸öÒþº¬²ãµÄ²ÎÊý¡£
¾ßÌå¶øÑÔ£¬¾ÍÊÇ̽¾¿Ä£Ðͼܹ¹ºÍÄ£Ð͵IJÎÊý¿Õ¼ä£¬´Ó¶øÔÚ¸ø¶¨µÄÊý¾Ý¼¯ÉÏÓÅ»¯ÆäÐÔÄÜ¡£Õâ¸öÎÊÌ⸴ÔÓÄѽ⣬¶ø»Ø±¨Ï¡±¡¡£Ö®ËùÒÔ˵Ëü»Ø±¨Ï¡±¡£¬ÊÇÒòΪÎÒÃÇÐèÒª¶ÔÍøÂç½øÐÐ×ã¹»µÄѵÁ·£¬»¹Òª¶ÔËü½øÐÐÆÀ¹À£»¶øÔÚѵÁ·¡¢ÆÀ¹ÀÍê³Éºó£¬ÎÒÃǵõ½»Ø±¨µÄ½ö½öÊÇһЩµÃ·Ö¡£ÕâЩµÃ·Ö·´Ó³ÁËÕû¸öϵͳµÄÐÔÄܱíÏÖ£¬¶øÕâÖÖÀàÐ͵Ļر¨²¢²»Êǿɵ¼º¯Êý£¡Ëµµ½Õ⣬ÊDz»ÊÇÈÃÄãÏëÆðÁËÊ²Ã´ÄØ£¿Ã»´í£¬Õâ¾ÍÊÇÒ»¸öµäÐ͵ġ°Ç¿»¯Ñ§Ï°¡±Çé¾³£¡
ά»ù°Ù¿Æ¶Ô¡°Ç¿»¯Ñ§Ï°¡±µÄ¶¨Ò壺
¡°Ç¿»¯Ñ§Ï°¡±£¨RL£©ÊÇÒ»ÖÖÖØÒªµÄ»úÆ÷ѧϰ·½·¨£¬ËüµÄÁé¸ÐÀ´×ÔÓÚÐÄÀíѧµÄÐÐΪÖ÷ÒåÀíÂÛ¡£¾ßÌåÀ´Ëµ£¬¡°Ç¿»¯Ñ§Ï°¡±ÊǹØÓÚÓлúÌ壨agent£©ÈçºÎÔÚ»·¾³£¨environment£©µÄ´Ì¼¤Ï£¬½«Àۼƽ±Àø×î´ó»¯µÄ·½·¨¡£
¡°Ç¿»¯Ñ§Ï°¡±Óë±ê×¼µÄ¼à¶½Ê½Ñ§Ï°Ö®¼äµÄÇø±ðÔÚÓÚËü²»ÐèÒª³öÏÖÕýÈ·µÄÊäÈë»òÊä³ö¶Ô£¬Ò²²»ÐèÒª¾«×¼Ð£ÕýÆä´ÎÓÅ»¯ÐÐΪ¡£ÁíÍ⣬¡°ÔÚÏßÐÔÄÜ¡±Ò²ÊÇ¡°Ç¿»¯Ñ§Ï°¡±¹Ø×¢µÄ½¹µã£¬¼´ÔÚδ֪ÁìÓòµÄ̽Ë÷ÓëÏÖÓÐ֪ʶµÄ¿ª·¢Ö®¼äÕÒµ½Æ½ºâ¡£

ÉÏͼÇé¾³ÖеÄÓлúÌ壨agent£©ÊÇÒ»¸öÄ£ÐÍ£¬»·¾³£¨environment£©¾ÍÊÇÎÒÃÇÓÃÓÚѵÁ·ºÍÆÀ¹ÀµÄÊý¾Ý¼¯¡£½âÊÍÆ÷£¨interpreter£©ÊǶÔÿһÐÐΪ½øÐзÖÎöÒÔ¼°ÉèÖÃÓлúÌå״̬£¨ÔÚÎÒÃÇÕâ¸öÇé¾³ÖУ¬½âÊÍÆ÷ÉèÖõÄÊÇÍøÂç²ÎÊý£©µÄ¹ý³Ì¡£
ͨ³£Çé¿öÏ£¬¡°Ç¿»¯Ñ§Ï°¡±ÎÊÌâ¶¼±»¶¨ÒåΪһ¸öMarkov¾ö²ß¹ý³Ì¡£ÆäÄ¿µÄ¾ÍÊÇÓÅ»¯ÓлúÌåµÄ×ܻر¨¡£Ã¿Ò»²½£¬ÄãÐèÒª¶ÔÓÅ»¯Ä£ÐÍÊä³ö×÷³ö¾ö²ß£¬»òÕßÊÇ̽Ë÷³öÒ»¸öеÄÐÐΪ¡£ÔÚ»·¾³µÄ´Ì¼¤Ï£¬ÓлúÌ彫¸ù¾ÝµÃµ½µÄ·´À¡£¬ÐγÉÒ»¸öµ÷ÕûÕþ²ß£¬²»¶Ï¸Ä½øÆäÐÐΪ¡£
×¢Ò⣺Õâ¸ö»°Ìⳬ³öÁ˱¾ÎÄÌÖÂ۵ķ¶Î§£¬R.SuttonºÍA. BartoµÄ¡¶Ç¿»¯Ñ§Ï°½éÉÜ¡·¿ÉÄÜÊǹØÓÚÕâ¸öÖ÷ÌâµÄ×î¼ÑÈëÃÅÖ¸µ¼Êé¡£
½ø»¯Ëã·¨
½â¾ö¡°Ç¿»¯Ñ§Ï°¡±ÎÊÌâµÄÁíÒ»ÖÖ·½·¨ÊÇ¡°½ø»¯Ëã·¨¡±¡£ÔÚÉúÎï½ø»¯µÄÆô·¢Ï£¬½ø»¯Ë㷨ͨ¹ý´´½¨Ò»¸ö½â¾ö·½°¸µÄ¼¯ºÏ£¬Ñ°ÕÒ½â¾ö·½°¸µÄ¿Õ¼ä£»È»ºó£¬Ëü»á¶Ôÿһ½â¾ö·½°¸½øÐÐÆÀ¹À£¬²¢¸ù¾ÝÆÀ¹ÀµÃ·Ö²»¶Ïµ÷ÕûÕâ¸ö·½°¸¼¯ºÏ¡£ÉúÎï½ø»¯ÂÛÖÐËù½²µÄ¡°½ø»¯¡±Éæ¼°µ½Ò»¸öÖÖȺÖÐ×î¼Ñ³ÉÔ±µÄÑ¡ÔñºÍ±äÒì¡£Òò´Ë£¬ÎÒÃǵĽâ¾ö·½°¸¼¯ºÏÒ²»á²»¶Ï½ø»¯·¢Õ¹£¬ÒÔÌá¸ßÆäÕûÌåÊÊÓ¦ÐÔ£¬²¢ÎªÎÊÌâÕÒµ½Ìṩ¿ÉÐеĽâ¾ö·½°¸¡£
½ø»¯Ëã·¨Öеġ°½ø»¯¡±
ÉÏͼµÄ×ó±ß½éÉÜÁ˽ø»¯µÄ¹ý³Ì£¬Éè¼ÆÒ»¸ö¡°½ø»¯Ëã·¨¡±Éæ¼°µ½Á½¸ö²¿·Ö¡ª¡ª¡°Ñ¡Ôñ¡±£¬ÒÔ¼°ÐèÒª×ñѵġ°¿ç½ç¡±»ò¡°±äÒ족²ßÂÔ¡£
¡°Ñ¡Ôñ¡±£º¶ÔÓÚ¡°Ñ¡Ôñ¡±£¬ÎÒÃÇͨ³£µÄ×ö·¨ÊÇÌôÑ¡×î¼ÑµÄ¸öÌåºÍһЩÈÎÒâµÄ¸öÌ壬ÒÔ´ïµ½¶àÑùÐÔ¡£¸üÏȽøµÄÑ¡Ôñ·½·¨ÊÇÔÚÖÖȺÏÂÉèÁ¢²»Í¬µÄ¡°´ÎȺ¡±£¬¼´¡°ÎïÖÖ¡±£»È»ºóÔÚÎïÖÖÖÐÑ¡Ôñ×î¼ÑµÄ¸öÌ壬ÒÔ±£»¤Æä¶àÑùÐÔ¡£ÁíÒ»ÖֱȽÏÊÜ»¶ÓµÄ×ö·¨ÊÇ¡°¾ºÈüÑ¡Ôñ¡±£¬¼´ÈÎÒâÑ¡ÔñһЩ¸öÌå²ÎÓ뾺Èü£¬ÌôÑ¡³öʤÕߣ¨»ùÒòÓÅʤµÄ¸öÌ壩¡£
¡°¿ç½ç¡±£º¡°¿ç½ç¡±Ò²³Æ¡°½»²æ¿ç½ç¡±£¬Ö¸µÄÊÇÁ½×é»òÁ½×éÒÔÉÏÇ×±¾½»²æ»ìºÏ£¬²úÉúºó´ú¡£¡°½»²æ¿ç½ç¡±¸ß¶ÈÒÀÀµÓÚÎÊÌâ½á¹¹µÄ·½Ê½¡£³£¼ûµÄ·½·¨ÊÇÓÃÒ»¸öÏîÄ¿ÁÐ±í£¨Ò»°ãÊÇÊýÖµ£©¶ÔÇ×±¾½øÐÐÃèÊö£¬È»ºó´ÓÇ×±¾ÖÐÌôÑ¡ÈÎÒⲿ·ÖÀ´Éú³ÉеĻùÒò×éºÏ¡£
¡°±äÒ족£º¡°±äÒ족»ò¡°Í»±ä¡±Ö¸µÄÊÇÈÎÒâ¸Ä±ä»ùÒò×éµÄ¹ý³Ì¡£ÕâÊÇÖ÷ÒªµÄ¿ª·¢ÒòËØ£¬ÓÐÖúÓÚ±£³ÖÖÖȺµÄ¶àÑùÐÔ¡£
ʵʩÆôÓÃ
¡°½ø»¯Ëã·¨¡±µÄʵʩÆôÓÃʹÓÃÁËPyTorchÀ´½¨Á¢´úÀí£¬Õâ¸ö´úÀí½«»á̽Ë÷ÓÃÓÚÍê³É¼òµ¥·ÖÀàÈÎÎñµÄDNNs¡£Õâ¸öʵÑéʹÓõÄÊÇMNIST£¬ÒòΪËüСÇҿ죬¼´Ê¹ÔÚCPUÉÏÒ²ÄÜÍê³ÉѵÁ·¡£ÎÒÃǽ«½¨Á¢Ò»×éDNNÄ£ÐÍ£¬²¢½«Æä·¢Õ¹½ø»¯ÎªN¸ö²½Öè¡£
ÎÒÃÇËù½²µÄ¡°½ø»¯¡±Ö÷Ìâʵ¼ÊÉϾÍÊÇ¡°ÎᄎÌìÔñ¡±µÄʵʩ£¬ÍêÕûµÄ¸ßˮƽ¡°½ø»¯Ëã·¨¡±ÈçÏÂËùʾ£º
new_population = []
while size(new_population) < population_size:
choose k(tournament) individuals from the population
at random
choose the best from pool/tournament with probability
p1
choose the second best individual with probability
p2
choose the third best individual with probability
p3
mutate and append selected to the new_population
|
¸½×¢£ºµ±Éæ¼°µ½¼Ü¹¹ºÏ²¢Ê±£¬¿ç½çÎÊÌâ¾Í±äµÃÏ൱¸´ÔÓÁË¡£¾¿¾¹¸ÃÈçºÎ½«Á½¸öÇ×±¾µÄ¼Ü¹¹ºÏ²¢ÄØ£¿È±ÏÝͼÑù¼°»·¾³ÕûºÏѵÁ·½«¶Ô´Ë²úÉúʲôӰÏìÄØ£¿½üÆÚµÄһƪÀ´×ÔMiikkulainenµÈÈ˵ÄÂÛÎÄÌá³öÁËÒ»ÖÖ±»³ÆÎªCoDeepNEATµÄ½â¾ö·½°¸¡£»ùÓÚEvolino½ø»¯ÀíÂÛ£¬Ò»¸ö¼Ü¹¹Óɲ¿·Öµ¥ÔªÄ£¿é×é³É£¬ÆäÖеÄÿһµ¥ÔªÄ£¿é¶¼ÊÇ·þ´ÓÓÚ½ø»¯ÀíÂ۵ġ£Õâ¸ö¼Ü¹¹ÊÇÒ»¸öºÏ²¢ÁËËùÓÐ×é³É³É·ÖµÄÀíÏëÀ¶Í¼¡£ÔÚÕâÑùµÄÇ龳ϣ¬½«Ç×±¾µÄ×é³É³É·Ö»ìºÏÊÇÊ®·ÖºÏÀíµÄ£¬ÒòΪÆä³É·ÖÊÇÒ»¸öÍêÕûµÄ΢ÐÍÍøÂ硣ΪÁËʹÎÄÕ¸ü¼ò½àÒ×¶®£¬ÎÒÔÚÕâ¸öË㷨ʵʩ¹ý³ÌÖбܿªÁË¿ç½ç½»²æµÄÎÊÌ⣬¶øÊǼòµ¥½éÉÜÁËÀàËÆNEAT£¨»òCoDeepNEAT£©ÕâÑùµÄ½â¾ö·½°¸¡££¨ÎÒ´òËãÔÚÏÂһƪÎÄÕÂÖÐÏêϸ½éÉÜÕâЩ½â¾ö·½°¸¡££©
»ù±¾µÄ¹¹¼þ
ÎÒÃÇÐèÒª¶¨ÒåµÄµÚÒ»¼þÊÂÇé¾ÍÊÇÿһģÐ͵Ľâ¾ö·½°¸¿Õ¼ä£¬Ã¿Ò»¸ö¸öÌå¶¼´ú±í×ÅÒ»¸ö¼Ü¹¹¡£¼ò½àÆð¼û£¬ÎÒÃǶѵþÁËn²ã£¬Ã¿Ò»²ã¶¼°üº¬Èý¸ö²ÎÊý£ºa)Òþ²Øµ¥ÔªµÄÊýÁ¿£»b)¼¤»îÀàÐÍ£»c)¶ªÊ§ÂÊ¡£¶ÔÓÚͨÓòÎÊý£¬ÎÒÃÇÔÚ²»Í¬µÄÓÅ»¯Æ÷¡¢Ñ§Ï°ÂÊ¡¢È¨ÖØË¥¼õºÍ²ãÊýÁ¿ÖнøÐÐÑ¡Ôñ¡£
#
definition of a space
# lower bound - upper bound, type param, mutation
rate
LAYER_SPACE = dict()
LAYER_SPACE['nb_units'] = (128, 1024, 'int',
0.15)
LAYER_SPACE['dropout_rate'] = (0.0, 0.7, 'float',
0.2)
LAYER_SPACE['activation'] =\
(0, ['linear', 'tanh', 'relu', 'sigmoid', 'elu'],
'list', 0.2)
NET_SPACE = dict()
NET_SPACE['nb_layers'] = (1, 3, 'int', 0.15)
NET_SPACE['lr'] = (0.0001, 0.1, 'float', 0.15)
NET_SPACE['weight_decay'] = (0.00001, 0.0004,
'float', 0.2)
NET_SPACE['optimizer'] =\
(0, ['sgd', 'adam', 'adadelta', 'rmsprop'],
'list', 0.2) |
Íê³ÉÒÔÉϲÙ×÷ÒÔºó£¬ÎÒÃÇÒѾ¶¨ÒåÁËÄ£Ð͵Ŀռ䡣½Ó×ÅÎÒÃÇ»¹ÐèÒª½¨Á¢Èý¸ö»ù±¾¹¦ÄÜ£º
Ëæ»úÑ¡ÔñÒ»¸öÍøÂç
def
random_value(space):
"""Sample random value from the
given space."""
val = None
if space[2] == 'int':
val = random.randint(space[0], space[1])
if space[2] == 'list':
val = random.sample(space[1], 1)[0]
if space[2] == 'float':
val = ((space[1] - space[0]) * random.random())
+ space[0]
return {'val': val, 'id': random.randint(0,
2**10)}
def randomize_network(bounded=True):
"""Create a random network."""
global NET_SPACE, LAYER_SPACE
net = dict()
for k in NET_SPACE.keys():
net[k] = random_value(NET_SPACE[k])
if bounded:
net['nb_layers']['val'] = min(net['nb_layers']['val'],
1)
layers = []
for i in range(net['nb_layers']['val']):
layer = dict()
for k in LAYER_SPACE.keys():
layer[k] = random_value(LAYER_SPACE[k])
layers.append(layer)
net['layers'] = layers
return net |
Ê×ÏÈ£¬ÎÒÃÇÈÎÒâµØ¶Ô²ãÊýÁ¿ºÍÿһ²ãµÄ²ÎÊý½øÐвÉÑù£¬Ñù±¾Öµ»áÔÚÔ¤Ïȶ¨ÒåºÃµÄ·¶Î§±ßÔµÄÚ³öÏÖϽµ¡£ÔÚ³õʼ»¯Ò»¸ö²ÎÊýµÄͬʱ£¬ÎÒÃÇ»¹»á²úÉúÒ»¸öÈÎÒâµÄ²ÎÊýid¡£ÏÖÔÚËü»¹²»ÄÜʹÓ㬵«ÎÒÃÇ¿ÉÒÔ×·×ÙËùÓеIJ㡣µ±Ò»¸öеÄÄ£ÐÍ·¢ÉúÍ»±äʱ£¬¾ÉµÄ²ã»á½øÐÐ΢µ÷£¬Í¬Ê±½ö¶Ô·¢ÉúÍ»±äµÄ²ã½øÐгõʼ»¯¡£ÕâÑùµÄ×ö·¨Ó¦¸ÃÄܹ»ÏÔÖøµØ¼Ó¿ìËÙ¶È£¬²¢Îȶ¨½â¾ö·½°¸¡£
×¢Ò⣺¸ù¾ÝÎÊÌâÐÔÖʵIJ»Í¬£¬ÎÒÃÇ¿ÉÄÜÐèÒª²»Í¬µÄÏÞÖÆÌõ¼þ£¬±ÈÈç²ÎÊýµÄ×ÜÁ¿»ò²ãµÄ×ÜÊýÁ¿¡£
Ê¹ÍøÂç·¢Éú±äÒì
def
mutate_net(net):
"""Mutate a network."""
global NET_SPACE, LAYER_SPACE
# mutate optimizer
for k in ['lr', 'weight_decay', 'optimizer']:
if random.random() < NET_SPACE[k][-1]:
net[k] = random_value(NET_SPACE[k])
# mutate layers
for layer in net['layers']:
for k in LAYER_SPACE.keys():
if random.random() < LAYER_SPACE[k][-1]:
layer[k] = random_value(LAYER_SPACE[k])
# mutate number of layers -- RANDOMLY ADD
if random.random() < NET_SPACE['nb_layers'][-1]:
if net['nb_layers']['val'] < NET_SPACE['nb_layers'][1]:
if random.random()< 0.5:
layer = dict()
for k in LAYER_SPACE.keys():
layer[k] = random_value(LAYER_SPACE[k])
net['layers'].append(layer)
# value & id update
net['nb_layers']['val'] = len(net['layers'])
net['nb_layers']['id'] +=1
else:
if net['nb_layers']['val'] > 1:
net['layers'].pop()
net['nb_layers']['val'] = len(net['layers'])
net['nb_layers']['id'] -=1
return net |
ÿһ¸öÍøÂçÔªËØ¶¼´æÔÚ±äÒìµÄ¿ÉÄÜÐÔ£¬Ã¿Ò»´Î±äÒì¶¼½«ÖØÐ²ÉÑù²ÎÊý¿Õ¼ä£¬½ø¶øÊ¹²ÎÊý·¢Éú±ä»¯¡£
½¨Á¢ÍøÂç
class
CustomModel():
def __init__(self, build_info, CUDA=True):
previous_units = 28 * 28
self.model = nn.Sequential()
self.model.add_module('flatten', Flatten())
for i, layer_info in enumerate(build_info['layers']):
i = str(i)
self.model.add_module(
'fc_' + i,
nn.Linear(previous_units, layer_info['nb_units']['val'])
)
self.model.add_module(
'dropout_' + i,
nn.Dropout(p=layer_info['dropout_rate']['val'])
)
if layer_info['activation']['val'] == 'tanh':
self.model.add_module(
'tanh_'+i,
nn.Tanh()
)
if layer_info['activation']['val'] == 'relu':
self.model.add_module(
'relu_'+i,
nn.ReLU()
)
if layer_info['activation']['val'] == 'sigmoid':
self.model.add_module(
'sigm_'+i,
nn.Sigmoid()
)
if layer_info['activation']['val'] == 'elu':
self.model.add_module(
'elu_'+i,
nn.ELU()
)
previous_units = layer_info['nb_units']['val']
self.model.add_module(
'classification_layer',
nn.Linear(previous_units, 10)
)
self.model.add_module('sofmax', nn.LogSoftmax())
self.model.cpu()
if build_info['optimizer']['val'] == 'adam':
optimizer = optim.Adam(self.model.parameters(),
lr=build_info['weight_decay']['val'],
weight_decay=build_info['weight_decay']['val'])
elif build_info['optimizer']['val'] == 'adadelta':
optimizer = optim.Adadelta(self.model.parameters(),
lr=build_info['weight_decay']['val'],
weight_decay=build_info['weight_decay']['val'])
elif build_info['optimizer']['val'] == 'rmsprop':
optimizer = optim.RMSprop(self.model.parameters(),
lr=build_info['weight_decay']['val'],
weight_decay=build_info['weight_decay']['val'])
else:
optimizer = optim.SGD(self.model.parameters(),
lr=build_info['weight_decay']['val'],
weight_decay=build_info['weight_decay']['val'],
momentum=0.9)
self.optimizer = optimizer
self.cuda = False
if CUDA:
self.model.cuda()
self.cuda = True |
ÉÏÃæµÄÀà±ð½«»áʵÀý»¯Ä£Ð͵ġ°»ùÒò×顱¡£
ÏÖÔÚ£¬ÎÒÃÇÒѾ¾ß±¸Á˽¨Á¢Ò»¸öÈÎÒâÍøÂç¡¢±ä¸üÆä¼Ü¹¹²¢¶ÔÆä½øÐÐѵÁ·µÄ»ù±¾¹¹¼þ£¬ÄÇô½ÓÏÂÀ´µÄ²½Öè¾ÍÊǽ¨Á¢¡°ÒÅ´«Ëã·¨¡±£¬¡°ÒÅ´«Ëã·¨¡±½«»á¶Ô×î¼Ñ¸öÌå½øÐÐÑ¡ÔñºÍ±äÒ졣ÿ¸öÄ£Ð͵ÄѵÁ·¶¼ÊǶÀÁ¢½øÐе쬲»ÐèÒªÆäËûÓлúÌåµÄÈκÎÐÅÏ¢¡£Õâ¾ÍʹµÃÓÅ»¯¹ý³Ì¿ÉÒÔËæ×Å¿ÉÓõĴ¦Àí½Úµã½øÐÐÏßÐÔÀ©Õ¹¡£
"""Genetic
programming algorithms."""
from __future__ import absolute_import
import random
import numpy as np
from operator import itemgetter
import torch.multiprocessing as mp
from net_builder import randomize_network
import copy
from worker import CustomWorker, Scheduler
class TournamentOptimizer:
"""Define a tournament play selection
process."""
def __init__(self, population_sz, init_fn, mutate_fn,
nb_workers=2, use_cuda=True):
"""
Initialize optimizer.
params::
init_fn: initialize a model
mutate_fn: mutate function - mutates a model
nb_workers: number of workers
"""
self.init_fn = init_fn
self.mutate_fn = mutate_fn
self.nb_workers = nb_workers
self.use_cuda = use_cuda
# population
self.population_sz = population_sz
self.population = [init_fn() for i in range(population_sz)]
self.evaluations = np.zeros(population_sz)
# book keeping
self.elite = []
self.stats = []
self.history = []
def step(self):
"""Tournament evolution step."""
print('\nPopulation sample:')
for i in range(0,self.population_sz,2):
print(self.population[i]['nb_layers'],
self.population[i]['layers'][0]['nb_units'])
self.evaluate()
children = []
print('\nPopulation mean:{} max:{}'.format(
np.mean(self.evaluations), np.max(self.evaluations)))
n_elite = 2
sorted_pop = np.argsort(self.evaluations)[::-1]
elite = sorted_pop[:n_elite]
# print top@n_elite scores
# elites always included in the next population
self.elite = []
print('\nTop performers:')
for i,e in enumerate(elite):
self.elite.append((self.evaluations[e], self.population[e]))
print("{}-score:{}".format( str(i),
self.evaluations[e]))
children.append(self.population[e])
# tournament probabilities:
# first p
# second p*(1-p)
# third p*((1-p)^2)
# etc...
p = 0.85 # winner probability
tournament_size = 3
probs = [p*((1-p)**i) for i in range(tournament_size-1)]
# a little trick to certify that probs is adding
up to 1.0
probs.append(1-np.sum(probs))
while len(children) < self.population_sz:
pop = range(len(self.population))
sel_k = random.sample(pop, k=tournament_size)
fitness_k = list(np.array(self.evaluations)[sel_k])
selected = zip(sel_k, fitness_k)
rank = sorted(selected, key=itemgetter(1), reverse=True)
pick = np.random.choice(tournament_size, size=1,
p=probs)[0]
best = rank[pick][0]
model = self.mutate_fn(self.population[best])
children.append(model)
self.population = children
# if we want to do a completely completely random
search per epoch
# self.population = [randomize_network(bounded=False)
for i in range(self.population_sz) ]
def evaluate(self):
"""evaluate the models."""
workerids = range(self.nb_workers)
workerpool = Scheduler(workerids, self.use_cuda
)
self.population, returns = workerpool.start(self.population)
self.evaluations = returns
self.stats.append(copy.deepcopy(returns))
self.history.append(copy.deepcopy(self.population))
|
GPÓÅ»¯Æ÷µÄ±àÂë
¡°½ø»¯Ëã·¨¡±¿´ÆðÀ´·Ç³£¼òµ¥£¬¶ÔÂð£¿Ã»´í£¡Õâ¸öËã·¨¿ÉÒԷdz£³É¹¦£¬ÓÈÆäÊǵ±ÄãΪ¸öÌ嶨ÒåÁ˺õıäÒì»ò¿ç½ç¹¦ÄÜʱ¡£
´æ´¢¿âÖл¹°üº¬ÁËһЩ¶îÍâµÄʹÓÃÀà±ð£¬±ÈÈ繤×÷Æ÷ÀàºÍµ÷¶ÈÆ÷À࣬ʹGPÓÅ»¯Æ÷Äܹ»¶ÀÁ¢Æ½ÐеØÍê³ÉÄ£ÐÍѵÁ·ºÍÆÀ¹À¡£
ÔËÐдúÂë
°´ÕÕÉÏÊö²½Öè²Ù×÷ÔËÐС£
"""Tournament
play experiment."""
from __future__ import absolute_import
import net_builder
import gp
import cPickle
# Use cuda ?
CUDA_ = True
if __name__=='__main__':
# setup a tournament!
nb_evolution_steps = 10
tournament = \
gp.TournamentOptimizer(
population_sz=50,
init_fn=net_builder.randomize_network,
mutate_fn=net_builder.mutate_net,
nb_workers=3,
use_cuda=True)
for i in range(nb_evolution_steps):
print('\nEvolution step:{}'.format(i))
print('================')
tournament.step()
# keep track of the experiment results &
corresponding architectures
name = "tourney_{}".format(i)
cPickle.dump(tournament.stats, open(name + '.stats','wb'))
cPickle.dump(tournament.history, open(name +'.pop','wb'))
|
½ÓÏÂÀ´£¬ÈÃÎÒÃÇÒ»ÆðÀ´¿´¿´ÔËÐеĽá¹û£¡
ÕâÊÇ50¸ö½â¾ö·½°¸µÄµÃ·Ö½á¹û£¬±ÈÈü¹æÄ£Îª3¡£ÕâЩģÐͽö½ÓÊÜÁË10000¸öÑù±¾µÄѵÁ·£¬È»ºó¾Í±»ÆÀ¹ÀÁË¡£Õ§Ò»¿´£¬½ø»¯Ëã·¨ËÆºõ²¢Ã»ÓÐÆðµ½Ì«´óµÄ×÷Óã¬ÒòΪ½â¾ö·½°¸ÔÚµÚÒ»´Î½ø»¯ÖоÍÒѾ½Ó½ü×î¼Ñ״̬ÁË£»¶øÔÚµÚÆß½×¶Î£¬½â¾ö·½°¸´ïµ½ÁËËüµÄ×î¼Ñ±íÏÖ¡£ÔÚÏÂͼÖУ¬ÎÒÃÇÓÃÁËÒ»¸öºÐʽͼÀ´ÒÀ´ÎÃèÊöÕâЩ½â¾ö·½°¸µÄËÄ·ÖÖ®Ò»¡£ÎÒÃÇ·¢ÏÖ£¬´ó¶àÊý·½°¸¶¼±íÏֵĺܺ㬵«ÔÚ·½°¸½ø»¯µÄͬʱ£¬Õâ¸öºÐÊ½Í¼Ò²ËæÖ®½ôËõÁË¡£
ͼÖеÄÕâ¸öºÐ×ÓչʾÁË·½°¸µÄËÄ·ÖÖ®Ò»£¬¶øÆäºÐÐëÔòÑÓÉìչʾÁËÊ£ÓàËÄ·ÖÖ®ÈýµÄ·½°¸·Ö²¼¡£ÆäÖеĺڵã´ú±í×Å·½°¸µÄƽ¾ùÖµ£¬´ÓͼÖÐÎÒÃǻᷢÏÖÆ½¾ùÖµµÄÉÏÉýÇ÷ÊÆ¡£
ΪÁ˽øÒ»²½Àí½âÕâÒ»·½·¨µÄÐÔÄܺͱíÏÖ£¬ÎÒÃÇ×îºÃ½«ÆäÓëÒ»¸öÍêÈ«Ëæ»úµÄÖÖȺËÑ×öÏà±È½Ï¡£Ã¿¸ö½×¶ÎÖ®¼ä¶¼²»ÐèÒª½ø»¯£¬Ã¿¸ö½â¾ö·½°¸¶¼Òª±»ÖØÐÂÉèÖÃΪһ¸öËæ»úµÄ״̬¡£
ÔÚÒ»¸öÏà¶Ô½ÏСµÄ£¨93.66% vs 93.22%£©Àï½ø»¯Ëã·¨µÄÐÔÄܽϺ᣶øËæ»úÖÖȺËÑË÷ËÆºõÉú³ÉÁËһЩºÃµÄ½â¾ö·½°¸£¬µ«Ä£Ð͵ķ½²îÈ´´ó´óÔö¼ÓÁË¡£Õâ¾ÍÒâζ×ÅÔÚËÑË÷´ÎÓżܹ¹µÄʱºò³öÏÖÁË×ÊÔ´ÀË·Ñ¡£½«Õâ¸öÓë½ø»¯Í¼Ïà±È½Ï£¬ÎÒÃǻᷢÏÖ½ø»¯È·ÊµÉú³ÉÁ˸ü¶àÓÐÓõĽâ¾ö·½°¸£¬Ëü³É¹¦µØÊ¹ÄÇЩ½á¹¹½ø»¯ÁË£¬½ø¶øÊ¹Ö®´ïµ½Á˸üºÃµÄÐÔÄܱíÏÖ¡£
1.MNISTÊÇÒ»¸öÏ൱¼òµ¥µÄÊý¾Ý¼¯£¬¼´Ê¹Êǵ¥²ãÍøÂçÒ²ÄÜ´ïµ½ºÜ¸ßµÄ׼ȷ¶È¡£
2.ÏñADAMÕâÑùµÄÓÅ»¯Æ÷¶ÔѧϰÂʵÄÃô¸Ð¶È±È½ÏµÍ£¬Ö»ÓÐÔÚËüÃǵÄÍøÂç¾ß±¸×ã¹»µÄ²ÎÊýʱ£¬ËüÃDzÅÄÜÕÒµ½±È½ÏºÃµÄ½â¾ö·½°¸¡£
3.ÔÚѵÁ·¹ý³ÌÖУ¬Ä£ÐÍÖ»»á²é¿´10000¸ö£¨ÑµÁ·×ÜÊý¾ÝµÄ1/5£©Ñù±¾Ê¾Àý¡£Èç¹ûÎÒÃÇѵÁ·µÃʱ¼äÔÙ³¤Ò»Ð©£¬ºÃµÄ¼Ü¹¹¿ÉÄÜ»á´ïµ½¸ü¸ßµÄ׼ȷ¶È¡£
4.ÏÞÖÆÑù±¾ÊýÁ¿¶ÔÓÚÎÒÃÇѧϰµÄ²ãµÄÊýÁ¿Í¬Ñù·Ç³£ÖØÒª£¬Ô½Éî²ãµÄÄ£ÐÍÐèÒªÔ½¶àÑù±¾¡£ÎªÁ˽â¾öÕâ¸öÎÊÌ⣬ÎÒÃÇ»¹Ôö¼ÓÁËÒ»¸öÒÆ³ýÍ»±ä²ã£¬Ê¹ÖÖȺµ÷½Ú²ãµÄÊýÁ¿¡£
Õâ¸öʵÑéµÄ¹æÄ£»¹²»×ãÒÔÍ»³öÕâÖÖ·½·¨µÄÓÅÊÆ£¬ÕâЩÎÄÕÂÖÐʹÓõÄʵÑ鹿ģ¸ü´ó£¬Êý¾Ý¼¯Ò²¸ü¸´ÔÓ¡£
ÎÒÃǸոÕÍê³ÉÁËÒ»¸ö¼òµ¥µÄ½ø»¯Ëã·¨£¬Õâ¸öËã·¨ºÜºÃµØÚ¹ÊÍÁË¡°ÎᄎÌìÔñ¡±µÄÖ÷Ìâ¡£ÎÒÃǵÄËã·¨Ö»»áÑ¡Ôñ×îÖÕʤÀûµÄ½â¾ö·½°¸£¬È»ºó½«Æä±äÒìÀ´²úÉú¸ü¶àµÄºó´ú¡£½ÓÏÂÀ´£¬ÎÒÃÇÐèÒª×öµÄ¾ÍÊÇʹÓøüÏȽøµÄ·½·¨£¬Éú³ÉºÍ·¢Õ¹·½°¸Èº¡£ÒÔÏÂÊÇһЩ¸Ä½øµÄ½¨Ò飺
1.ΪͨÓòãÖØÐÂʹÓÃÇ×±¾µÄÈ¨ÖØ
2.½«À´×ÔÁ½¸öDZÔÚÇ×±¾µÄ²ãºÏ²¢
3.¼Ü¹¹²»Ò»¶¨ÒªÁ¬ÐøµÄ£¬Äã¿ÉÒÔ̽Ë÷²ãÓë²ãÖ®¼ä¸ü¶à²»Ò»ÑùµÄÁªÏµ£¨·ÖÉ¢»òºÏ²¢µÈ£©
4.ÔÚ¶¥²¿Ôö¼Ó¶îÍâµÄ²ã£¬È»ºó½øÐÐ΢µ÷Õû¡£
ÒÔÉÏÄÚÈݶ¼ÊÇÈ˹¤ÖÇÄÜÑо¿ÁìÓòµÄÒ»¸ö¿ÎÌâ¡£ÆäÖÐÒ»¸ö±È½ÏÊÜ»¶ÓµÄ·½·¨¾ÍÊÇNEAT¼°ÆäÀ©Õ¹¡£EAT±äÁ¿Ê¹Óýø»¯Ëã·¨ÔÚ¿ª·¢ÍøÂçµÄͬʱ£¬»¹¶ÔÍøÂçµÄÈ¨ÖØ½øÐÐÁËÉèÖá£ÔÚÒ»¸öµäÐ͵ÄÇ¿»¯Ñ§Ï°³¡¾°Ï£¬´úÀíÈ¨ÖØµÄ½ø»¯ÊǷdz£ÓпÉÄÜʵÏֵġ£µ«ÊÇ£¬µ±(x,y)ÊäÈë¶Ô¿ÉÓÃʱ£¬ÌݶÈϽµµÄ·½·¨Ôò±íÏֵøüºÃ¡£
|