ÔÚÀûÓÃÉî¶ÈÑ§Ï°ÍøÂç½øÐÐÔ¤²âÐÔ·ÖÎö֮ǰ£¬ÎÒÃÇÊ×ÏÈÐèÒª¶ÔÆä¼ÓÒÔѵÁ·¡£Ä¿Ç°ÊÐÃæÉÏ´æÔÚ×Å´óÁ¿Äܹ»ÓÃÓÚÉñ¾ÍøÂçѵÁ·µÄ¹¤¾ß£¬µ«TensorFlowÎÞÒÉÊÇÆäÖм«ÎªÖØÒªµÄÊ×Ñ¡·½°¸Ö®Ò»¡£

´ó¼Ò¿ÉÒÔÀûÓÃTensorFlowѵÁ·×Ô¼ºµÄ»úÆ÷ѧϰģÐÍ£¬²¢ÀûÓÃÕâЩģÐÍÍê³ÉÔ¤²âÐÔ·ÖÎö¡£ÑµÁ·Í¨³£ÓÉһ̨¼«ÎªÇ¿´óµÄÉ豸»òÕßÔÆ¶Ë×ÊÔ´Íê³É£¬µ«Äú¿ÉÄÜÏëÏó²»µ½µÄÊÇ£¬TensorFlowÒà¿ÉÒÔÔÚiOSÖ®ÉÏ˳ÀûÆðЧ¡ª¡ªÖ»ÊÇ´æÔÚÒ»¶¨¾ÖÏÞÐÔ¡£
ÔÚ½ñÌìµÄ²©ÎÄÖУ¬ÎÒÃǽ«¹²Í¬Á˽âTensorFlow±³ºóµÄÉè¼ÆË¼Â·¡¢ÈçºÎÀûÓÃÆäѵÁ·Ò»Ì×¼òµ¥µÄ·ÖÀàÆ÷£¬ÒÔ¼°ÈçºÎ½«ÉÏÊö³É¹ûÒýÈëÄúµÄiOSÓ¦Óá£
ÔÚ±¾Ê¾ÀýÖУ¬ÎÒÃǽ«Ê¹Óá°¸ù¾ÝÓïÒôÓë¶Ô»°·ÖÎöÅжÏÐÔ±ð¡±Êý¾Ý¼¯ÒÔÁ˽âÈçºÎ¸ù¾ÝÒôƵ¼Ç¼ÅжÏÓïÒôΪÄÐÉùÒÖ»òÅ®Éù¡£
»ñÈ¡Ïà¹Ø´úÂ룺´ó¼Ò¿ÉÒÔͨ¹ýGitHubÉϵĶÔÓ¦ÏîÄ¿»ñÈ¡±¾Ê¾ÀýµÄÔ´´úÂë¡£
TensorFlowÊÇʲô£¬ÎÒÃÇΪºÎÐèÒª¼ÓÒÔʹÓã¿
TensorFlowÊÇÒ»Ì×ÓÃÓÚ¹¹½¨¼ÆËãÐÔͼÐΣ¬´Ó¶øÊµÏÖ»úÆ÷ѧϰµÄÈí¼þ×ÊÔ´¿â¡£
ÆäËüһЩ¹¤¾ßÍùÍù×÷ÓÃÓÚ¸ü¸ß¼¶±ðµÄ³éÏó²ã¼¶¡£ÒÔCaffeΪÀý£¬´ó¼ÒÐèÒª½«²»Í¬ÀàÐ͵ġ°²ã¡±½øÐб˴˻¥Á¬£¬´Ó¶øÉè¼Æ³öÒ»Ì×Éñ¾ÍøÂç¡£¶øiOSƽ̨ÉϵÄBNNSÓëMPSCNNÒà¿ÉʵÏÖÀàËÆµÄ¹¦ÄÜ¡£
ÔÚTensorFlowµ±ÖУ¬´ó¼ÒÒà¿É´¦ÀíÕâЩ²ã£¬µ«¾ßÌå´¦ÀíÉî¶È½«¸üΪÉîÈ롪¡ªÉõÖÁÖ±´ïÄúËã·¨Öеĸ÷Ïî¼ÆËãÁ÷³Ì¡£
´ó¼Ò¿ÉÒÔ½«TensorFlowÊÓΪһÌ×ÓÃÓÚʵÏÖÐÂÐÍ»úÆ÷ѧϰËã·¨µÄ¹¤¾ß¼¯£¬¶øÆäËüÉî¶Èѧϰ¹¤¾ßÔòÓÃÓÚ°ïÖúÓû§Ê¹ÓÃÕâЩËã·¨¡£
µ±È»£¬Õâ²¢²»ÊÇ˵Óû§ÐèÒªÔÚTensorFlowµ±ÖдÓÁ㿪ʼ¹¹½¨Ò»ÇС£TensorFlowÓµÓÐÒ»ÕûÌ׿ɸ´ÓõĹ¹½¨×é¼þ£¬Í¬Ê±ÄÒÀ¨ÁËKerasµÈ¸ºÔðΪTensorFlowÓû§Ìṩ´óÁ¿±ã½ÝÄ£¿éµÄ×ÊÔ´¿â¡£
Òò´ËTensorFlowÔÚʹÓõ±Öв¢²»Ç¿ÖÆÒªÇó´ó¼Ò¾«Í¨Ïà¹ØÊýѧרҵ֪ʶ£¬µ±È»Èç¹û¸÷λԸÒâ×ÔÐй¹½¨£¬TensorFlowÒ²Äܹ»ÌṩÏàÓ¦µÄ¹¤¾ß¡£
ÀûÓÃÂß¼»Ø¹éʵÏÖ¶þÔª·ÖÀà
ÔÚ½ñÌìµÄ²©Îĵ±ÖУ¬ÎÒÃǽ«ÀûÓÃÂß¼»Ø¹é£¨logistic regression£©Ëã·¨´´½¨Ò»Ì×·ÖÀàÆ÷¡£Ã»´í£¬ÎÒÃǽ«´ÓÁ㿪ʼ½øÐй¹½¨£¬Òò´ËÇë´ó¼Ò×öºÃ×¼±¸¡ª¡ªÕâ¿ÉÊÇÏîÓе㸴ÔÓµÄÈÎÎñ¡£Ëùν·ÖÀàÆ÷£¬Æä»ù±¾¹¤×÷ÔÀíÊÇ»ñÈ¡ÊäÈëÊý¾Ý£¬¶øºó¸æÖªÓû§¸ÃÊý¾ÝËù¹éÊôµÄÀà±ð¡ª¡ª»òÕßÖÖÀà¡£ÔÚ±¾ÏîÄ¿µ±ÖУ¬ÎÒÃÇÖ»É趨Á½¸öÖÖÀࣺÄÐÉùÓëÅ®Éù¡ª¡ªÒ²¾ÍÊÇ˵£¬ÎÒÃÇÐèÒª¹¹½¨µÄÊÇÒ»Ì×¶þÔª·ÖÀàÆ÷£¨binary
classifier£©¡£
±¸×¢£º¶þÔª·ÖÀàÆ÷ÊôÓÚ×î¼òµ¥µÄÒ»ÖÖ·ÖÀàÆ÷£¬µ«Æä»ù±¾¸ÅÄîÓëÉè¼ÆË¼Â·Í¬ÓÃÓÚÇø·Ö³É°ÙÉÏǧÖÖ²»Í¬Àà±ðµÄ·ÖÀàÆ÷ÍêȫһÖ¡£Òò´Ë£¬¾¡¹ÜÎÒÃÇÔÚ±¾·Ý½Ì³ÌÖв»»áÌ«¹ýÉîÈ룬µ«ÏàÐÅ´ó¼ÒÈÔÈ»Äܹ»´ÓÖÐÒ»¿ú·ÖÀàÆ÷Éè¼ÆµÄÞ¶¡£
ÔÚÊäÈëÊý¾Ý·½Ã棬ÎÒÃǽ«Ê¹Óðüº¬20¸öÊý×ÖÀʶÁÓïÒô¡¢ÄÒÀ¨¶àÖÖÉùÑ§ÌØÐԵĸø¶¨Â¼Òô¡£ÎÒ½«ÔÚºóÎÄÖжԴ˽øÐÐÏ꾡½âÊÍ£¬°üÀ¨ÒôƵƵÂʼ°ÆäËüÏà¹ØÐÅÏ¢¡£
ÔÚÒÔÏÂʾÒâͼµ±ÖУ¬´ó¼Ò¿ÉÒÔ¿´µ½Õâ20¸öÊý×ÖÈ«²¿½ÓÈëÒ»¸öÃûΪsumµÄС¿ò¡£ÕâЩÁ¬½ÓÓµÓв»Í¬µÄweights£¨È¨ÖØ£©£¬¶ÔÓÚ·ÖÀàÆ÷¶øÑÔ´ú±í×ÅÕâ20¸öÊý×Ö¸÷×Ô²»Í¬µÄÖØÒª³Ì¶È¡£
ÒÔÏ¿òͼչʾÁËÕâÌ×Âß¼·ÖÀàÆ÷µÄÆðЧÔÀí£º

ÔÚsum¿òµ±ÖУ¬ÊäÈëÊý¾ÝÇø¼äΪx0µ½x19£¬ÇÒÆä¶ÔÓ¦Á¬½ÓµÄÈ¨ÖØw0µ½w19½øÐÐÖ±½ÓÏà¼Ó¡£ÒÔÏÂΪһÏî³£¼ûµÄµã»ý£º
sum = x[0]*w[0] + x[1]*w[1] + x[2]*w[2] + ...
+ x[19]*w[19] + b |
ÎÒÃÇ»¹ÔÚËùνbias£¨Æ«À룩ÏîµÄĩβ¼ÓÉÏÁËb¡£Æä½ö½ö´ú±íÁíÒ»¸öÊý×Ö¡£
Êý×éwÖеÄÈ¨ÖØÓëÖµb´ú±í×Å´Ë·ÖÀàÆ÷Ëùѧϰµ½µÄ¾Ñé¡£¶Ô¸Ã·ÖÀàÆ÷½øÐÐѵÁ·µÄ¹ý³Ì£¬Êµ¼ÊÉÏÊÇΪÁ˰ïÖúÆäÕÒµ½Óëw¼°bÕýÈ·Æ¥ÅäµÄÊý×Ö¡£×î³õ£¬ÎÒÃǽ«Ê×ÏȽ«È«²¿wÓëbÉèÖÃΪ0¡£ÔÚÊýÂÖѵÁ·Ö®ºó£¬wÓëbÔò½«°üº¬Ò»×éÊý×Ö£¬·ÖÀàÆ÷½«ÀûÓÃÕâЩÊý×Ö½«ÊäÈëÓïÒôÖеÄÄÐÉùÓëÅ®ÉùÇø·Ö¿ªÀ´¡£ÎªÁËÄܹ»½«sumת»¯ÎªÒ»Ìõ¸ÅÂÊÖµ¡ª¡ªÆäȡֵÔÚ0Óë1Ö®¼ä¡ª¡ªÎÒÃÇÔÚÕâÀïʹÓÃlogistic
sigmoidº¯Êý£º
y_pred = 1 / (1 + exp(-sum)) |
ÕâÌõ·½³Ìʽ¿´ÆðÀ´ºÜ¿ÉÅ£¬µ«×ö·¨È´·Ç³£¼òµ¥£ºÈç¹ûsumÊÇÒ»¸ö½Ï´óÕýÊý£¬Ôòsigmoidº¯Êý·µ»Ø1»òÕ߸ÅÂÊΪ100%;
Èç¹ûsumÊÇÒ»¸ö½Ï´ó¸ºÊý£¬Ôòsigmoidº¯Êý·µ»Ø0¡£Òò´Ë¶ÔÓڽϴóµÄÕý»òÕ߸ºÊý£¬ÎÒÃǼ´¿ÉµÃ³ö½ÏΪ¿Ï¶¨µÄ¡°ÊÇ¡±»òÕß¡°·ñ¡±Ô¤²â½áÂÛ¡£
È»¶ø£¬Èç¹ûsumÇ÷½üÓÚ0£¬Ôòsigmoidº¯Êý»á¸ø³öÒ»¸ö½Ó½üÓÚ50%µÄ¸ÅÂÊ£¬ÒòΪÆäÎÞ·¨È·¶¨Ô¤²â½á¹û¡£µ±ÎÒÃÇ×î³õ¶Ô·ÖÀàÆ÷½øÐÐѵÁ·Ê±£¬Æä³õʼԤÆÚ½á¹û»áÒò·ÖÀàÆ÷±¾ÉíѵÁ·Éв»³ä·Ö¶øÏÔʾΪ50%£¬¼´¶ÔÅжϽá¹û²¢ÎÞÐÅÐÄ¡£µ«Ëæ×ÅѵÁ·¹¤×÷µÄÉîÈ룬Æä¸ø³öµÄ¸ÅÂÊ¿ªÊ¼¸üÇ÷½üÓÚ1¼°0£¬¼´·ÖÀàÆ÷¶ÔÓÚ½á¹û¸üΪ¿Ï¶¨¡£
ÏÖÔÚy_predÖаüº¬µÄÔ¤²â½á¹ûÏÔʾ£¬¸ÃÓïÒôΪÄÐÉùµÄ¿ÉÄÜÐÔ¸ü¸ß¡£Èç¹ûÆä¸ÅÂʸßÓÚ0.5£¨»òÕß50%£©£¬ÔòÎÒÃÇÈÏΪÓïÒôΪÄÐÉù;
Ïà·´ÔòΪŮÉù¡£
Õâ¼´ÊÇÎÒÃÇÕâÌ×ÀûÓÃÂß¼»Ø¹éʵÏֵĶþÔª·ÖÀàÆ÷µÄ»ù±¾Éè¼ÆÔÀí¡£ÊäÈëÖÁ¸Ã·ÖÀàÆ÷µÄÊý¾ÝΪһ¶Î¶Ô20¸öÊý×Ö½øÐÐÀʶÁµÄÒôƵ¼Ç¼£¬ÎÒÃÇ»á¼ÆËã³öÒ»ÌõÈ¨ÖØsum²¢Ó¦ÓÃsigmoidº¯Êý£¬¶øÎÒÃÇ»ñµÃµÄÊä³ö¸ÅÂÊָʾÀʶÁÕßӦΪÄÐÐÔ¡£
È»¶ø£¬ÎÒÃÇÈÔÈ»ÐèÒª½¨Á¢ÓÃÓÚѵÁ·¸Ã·ÖÀàÆ÷µÄ»úÖÆ£¬¶øÕâʱ¾ÍÐèÒªÇë³ö½ñÌìµÄÖ÷½Ç¡ª¡ªTensorFlowÁË¡£
ÔÚTensorFlowÖÐʵÏÖ´Ë·ÖÀàÆ÷
ÒªÔÚTensorFlowµ±ÖÐʹÓô˷ÖÀàÆ÷£¬ÎÒÃÇÐèÒªÊ×ÏȽ«ÆäÉè¼Æ×ª»¯ÎªÒ»Ì×¼ÆËãͼ£¨computational
graph£©¡£Ò»Ïî¼ÆËãͼÓɶà¸ö¸ºÔðÖ´ÐмÆËãµÄ½Úµã×é³É£¬ÇÒÊäÈëÊý¾Ý»áÔÚ¸÷½ÚµãÖ®¼äÍùÀ´Á÷ͨ¡£
ÎÒÃÇÕâÌ×Âß¼»Ø¹éËã·¨µÄ¼ÆËãͼÈçÏÂËùʾ£º

¿´ÆðÀ´Óë֮ǰ¸ø³öµÄʾÒâͼ´æÔÚÒ»¶¨Çø±ð£¬µ«ÕâÖ÷ÒªÊÇÓÉÓÚ´Ë´¦µÄÊäÈëÄÚÈÝx²»ÔÙÊÇ20¸ö¶ÀÁ¢µÄÊý×Ö£¬¶øÊÇÒ»¸ö°üº¬ÓÐ20¸öÔªËØµÄÏòÁ¿¡£ÔÚÕâÀï£¬È¨ÖØÓɾØÕóW±íʾ¡£Òò´Ë£¬Ö®Ç°µÃ³öµÄµã»ýÒ²ÔÚÕâÀï±»Ìæ»»³ÉÁËÒ»Ïî¾ØÕó³Ë·¨¡£
ÁíÍ⣬±¾Ê¾ÒâͼÖл¹°üº¬Ò»ÏîÊäÈëÄÚÈÝy¡£ÆäÓÃÓÚ¶Ô·ÖÀàÆ÷½øÐÐѵÁ·²¢ÑéÖ¤ÆäÔËÐÐЧ¹û¡£ÎÒÃÇÔÚÕâÀïʹÓõÄÊý¾Ý¼¯ÎªÒ»Ì×°üº¬3168ÌõexampleÓïÒô¼Ç¼µÄ¼¯ºÏ£¬ÆäÖÐÿÌõʾÀý¼Ç¼½Ô±»Ã÷È·±ê¼ÇΪÄÐÉù»òÅ®Éù¡£ÕâЩÒÑÖªÄÐÉù»òÅ®Éù½á¹ûÒà±»³ÆÎª¸ÃÊý¾Ý¼¯µÄlabel£¨±êÇ©£©£¬²¢×÷ΪÎÒÃǽ»¸¶ÖÁyµÄÊäÈëÄÚÈÝ¡£
ΪÁËѵÁ·ÎÒÃǵķÖÀàÆ÷£¬ÕâÀïÐèÒª½«Ò»ÌõʾÀý¼ÓÔØÖÁxµ±Öв¢ÔÊÐí¸Ã¼ÆËãͼ½øÐÐÔ¤²â£º¼´ÓïÒôµ½µ×ΪÄÐÉùÒÖ»òÊÇÅ®Éù£¿ÓÉÓÚ³õÊ¼È¨ÖØÖµÈ«²¿Îª0£¬Òò´Ë¸Ã·ÖÀàÆ÷ºÜ¿ÉÄܸø³ö´íÎóµÄÔ¤²â¡£ÎÒÃÇÐèÒªÒ»ÖÖ·½·¨ÒÔ¼ÆËãÆä´íÎóµÄ¡°¾ßÌå³Ì¶È¡±£¬¶øÕâһĿ±êÐèҪͨ¹ýlossº¯ÊýʵÏÖ¡£Lossº¯Êý»á½«Ô¤²â½á¹ûy_predÓëÕýÈ·Êä³ö½á¹ûy½øÐбȽϡ£
ÔÚ½«lossº¯ÊýÌṩ¸øÑµÁ·Ê¾Àýºó£¬ÎÒÃÇÀûÓÃÒ»Ïî±»³ÆÎªbackpropagation£¨·´Ïò´«²¥£©µÄ¼¼Êõͨ¹ý¸Ã¼ÆËãͼ½øÐлØËÝ£¬Ö¼ÔÚ¸ù¾ÝÕýÈ··½Ïò¶ÔWÓëbµÄÈ¨ÖØ½øÐÐС·ùµ÷Õû¡£Èç¹ûÔ¤²â½á¹ûΪÄÐÉùµ«Êµ¼Ê½á¹ûΪŮÉù£¬ÔòÈ¨ÖØÖµ¼´»áÉÔ΢½øÐÐÉϵ÷»òÕßϵ÷£¬´Ó¶øÔÚÏÂÒ»´ÎÃæ¶ÔͬÑùµÄÊäÈëÄÚÈÝʱÔö¼Ó½«ÆäÅжÏΪ¡°Å®Éù¡±µÄ¸ÅÂÊ¡£
ÕâһѵÁ·¹æ³Ì»áÀûÓøÃÊý¾Ý¼¯ÖеÄÈ«²¿Ê¾Àý½øÐв»¶ÏÖØ¸´ÔÙÖØ¸´£¬Ö±µ½¼ÆËãͼ±¾ÉíÒѾ»ñµÃÁË×îÓÅÈ¨ÖØ¼¯ºÏ¡£¶ø¸ºÔðºâÁ¿Ô¤²â½á¹û´íÎó³Ì¶ÈµÄlossº¯ÊýÔòÒò´ËËæÊ±¼äÍÆÒÆ¶ø±äµÍ¡£
·´Ïò´«²¥ÔÚ¼ÆËãͼµÄѵÁ·µ±ÖаçÑÝ׿«ÎªÖØÒªµÄ½ÇÉ«£¬µ«ÎÒÃÇ»¹ÐèÒª¼ÓÈëÒ»µãÊýѧÊÖ¶ÎÈýá¹û¸üΪ׼ȷ¡£¶øÕâÒ²ÕýÊÇTensorFlowµÄר³¤ËùÔÚ£ºÎÒÃÇÖ»Òª½«È«²¿¡°Ç°½ø¡±²Ù×÷±í´ïΪ¼ÆËãͼµ±ÖеĽڵ㣬Æä¼´¿É×Ô¶¯Òâʶµ½¡°ºóÍË¡±²Ù×÷´ú±íµÄÊÇ·´Ïò´«²¥¡ª¡ªÎÒÃÇÍêÈ«ÎÞÐèÇ××Ô½øÐÐÈκÎÊýѧÔËË㡣̫°ôÁË£¡
Tensorflowµ½µ×ÊÇʲô£¿
ÔÚÒÔÉϼÆËãͼµ±ÖУ¬Êý¾ÝÁ÷ÏòΪ´Ó×óÖÁÓÒ£¬¼´´ú±íÓÉÊäÈëµ½Êä³ö¡£¶øÕâÕýÊÇTensorFlowÖС°Á÷£¨flow£©¡±µÄÓÉÀ´¡£²»¹ýTensorÓÖÊÇʲô£¿
TensorÒ»´Ê±¾ÒåΪÕÅÁ¿£¬¶ø´Ë¼ÆËãͼÖÐÈ«²¿Êý¾ÝÁ÷½ÔÒÔÕÅÁ¿ÐÎʽ´æÔÚ¡£ËùνÕÅÁ¿£¬Æäʵ¼Ê´ú±íµÄ¾ÍÊÇÒ»¸önάÊý×é¡£ÎÒÔø¾Ìáµ½WÊÇÒ»ÏîÈ¨ÖØ¾ØÕ󣬵«´ÓTensorFlowµÄ½Ç¶ÈÀ´¿´£¬Æäʵ¼ÊÉÏÊôÓÚÒ»Ïî¶þ½×ÕÅÁ¿¡ª¡ª»»ÑÔÖ®£¬Ò»¸ö¶þ×éÊý×é¡£
Ò»¸ö±êÁ¿´ú±íÒ»¸öÁã½×ÕÅÁ¿¡£
Ò»¸öÏòÁ¿´ú±íÒ»¸öÒ»½×ÕÅÁ¿¡£
Ò»¸ö¾ØÕó´ú±íÒ»¸ö¶þ½×ÕÅÁ¿¡£
Ò»¸öÈýάÊý×é´ú±íÒ»¸öÈý½×ÕÅÁ¿¡£
Ö®ºóÒÔ´ËÀàÍÆ¡¡
Õâ¾ÍÊÇTensorµÄÈ«²¿º¬Òå¡£ÔÚ¾í»ýÉñ¾ÍøÂçµÈÉî¶Èѧϰ·½°¸µ±ÖУ¬´ó¼Ò»áÐèÒªÓëËÄάÕÅÁ¿´ò½»µÀ¡£µ«±¾Ê¾ÀýÖÐÌáµ½µÄÂß¼·ÖÀàÆ÷Òª¸üΪ¼òµ¥£¬Òò´ËÎÒÃÇÔÚÕâÀï×î¶àֻɿ¼°µ½¶þ½×ÕÅÁ¿¡ª¡ª¼´¾ØÕó¡£
ÎÒ֮ǰ»¹Ìáµ½¹ý£¬x´ú±íÒ»¸öÏòÁ¿¡ª¡ª»òÕß˵һ¸öÒ»½×ÕÅÁ¿¡ª¡ªµ«½ÓÏÂÀ´ÎÒÃÇͬÑù½«ÆäÊÓΪһ¸ö¾ØÕó¡£yÒà²ÉÓÃÕâÑùµÄ´¦Àí·½Ê½¡£Èç´ËÒ»À´£¬ÎÒÃǼ´¿É½«Êý¾Ý¿â×éÊÓΪÕûÌå¶ÔÆäloss½øÐмÆËã¡£
Ò»Ìõ¼òµ¥µÄʾÀý£¨example£©ÓïÒôÄÚ°üº¬20¸öÊý¾ÝÔªËØ¡£Èç¹û´ó¼Ò½«È«²¿3168ÌõʾÀý¼ÓÔØÖÁxµ±ÖУ¬Ôòx»á³ÉΪһ¸ö3168
x 20µÄ¾ØÕó¡£ÔÙ½«xÓëWÏà³Ë£¬ÔòµÃ³öµÄ½á¹ûy_predΪһ¸ö3168 x 1µÄ¾ØÕó¡£¾ßÌåÀ´½²£¬y_pred´ú±íµÄÊÇΪÊý¾Ý¼¯ÖеÄÿÌõÓïÒôʾÀýÌṩһÏîÔ¤²â½áÂÛ¡£
ͨ¹ý½«ÎÒÃǵļÆËãͼÒÔ¾ØÕó/ÕÅÁ¿µÄÐÎʽ½øÐбí´ï£¬ÎÒÃÇ¿ÉÒÔÒ»´ÎÐÔ¶Ô¶à¸öʾÀý½øÐÐÔ¤²â¡£
°²×°TensorFlow
ºÃµÄ£¬ÒÔÉÏÊDZ¾´Î½Ì³ÌµÄÀíÂÛ»ù´¡£¬½ÓÏÂÀ´½øÈëʵ¼Ê²Ù×÷½×¶Î¡£
ÎÒÃǽ«Í¨¹ýPythonʹÓÃTensorFlow¡£´ó¼ÒµÄMacÉ豸¿ÉÄÜÒѾ°²×°ÓÐijһPython°æ±¾£¬µ«Æä°æ±¾¿ÉÄܽÏΪ³Â¾É¡£ÔÚ±¾½Ì³ÌÖУ¬ÎÒʹÓõÄÊÇPython
3.6£¬Òò´Ë´ó¼Ò×îºÃÒ²Äܰ²×°Í¬Ò»°æ±¾¡£
°²×°Python 3.6·Ç³£¼òµ¥£¬´ó¼ÒÖ»ÐèҪʹÓÃHomebrewÈí¼þ°ü¹ÜÀíÆ÷¼´¿É¡£Èç¹û´ó¼Ò»¹Ã»Óа²×°homebrew£¬Çëµã»÷´Ë´¦²ÎÔÄÏà¹ØÖ¸ÄÏ¡£
½ÓÏÂÀ´´ò¿ªÖն˲¢ÊäÈëÒÔÏÂÃüÁÒÔ°²×°PythonµÄ×îа汾£º
PythonÒ²ÓµÓÐ×Ô¼ºµÄÈí¼þ°ü¹ÜÀíÆ÷£¬¼´pip£¬ÎÒÃǽ«ÀûÓÃËü°²×°ÎÒÃÇËùÐèÒªµÄÆäËüÈí¼þ°ü¡£ÔÚÖÕ¶ËÖÐÊäÈëÒÔÏÂÃüÁ
pip3 install numpy
pip3 install scipy
pip3 install scikit-learn
pip3 install pandas
pip3 install tensorflow |
³ýÁËTensorFlowÖ®Í⣬ÎÒÃÇ»¹ÐèÒª°²×°NumPy¡¢SciPy¡¢pandasÒÔ¼°scikit-learn£º
NumPyÊÇÒ»Ì×ÓÃÓÚͬn¼¶Êý×éÐ×÷µÄ¿â¡£ÌýÆðÀ´¶úÊìÂð£¿NumPy²¢·Ç½«Æä³ÆÎªÕÅÁ¿£¬µ«Ö®Ç°Ìáµ½ÁËÊý×é±¾Éí¾ÍÊÇÒ»ÖÖÕÅÁ¿¡£TensorFlow
Python API¾Í½¨Á¢ÔÚNumPy»ù´¡Ö®ÉÏ¡£SciPyÊÇÒ»Ì×ÓÃÓÚÊýÖµ¼ÆËãµÄ¿â¡£ÆäËüһЩÈí¼þ°üµÄÆðЧÐèÒªÒÔ֮Ϊ»ù´¡¡£
pandas¸ºÔðÊý¾Ý¼¯µÄ¼ÓÔØÓëÇåÀí¹¤×÷¡£
scikit-learnÔÚijÖÖÒâÒåÉÏ¿ÉÒÔËã×÷TensorFlowµÄ¾ºÕù¶ÔÊÖ£¬ÒòΪÆäͬÑùÊÇÒ»Ì×ÓÃÓÚ»úÆ÷ѧϰµÄ¿â¡£ÎÒÃÇÖ®ËùÒÔÔÚ±¾ÏîÄ¿ÖмÓÒÔʹÓã¬ÊÇÒòΪËü¾ß±¸¶àÏî±ãÀûµÄ¹¦ÄÜ¡£ÓÉÓÚTensorFlowÓëscikit-learn½ÔʹÓÃNumPyÊý×飬ÒòΪ¶þÕßÄܹ»Ë³³©ÊµÏÖÐ×÷¡£
ʵ¼ÊÉÏ£¬´ó¼ÒÎÞÐèpandasÓëscikit-learnÒ²Äܹ»Ê¹ÓÃTensorFlow£¬µ«¶þÕßȷʵÄܹ»Ìṩ±ã½Ý¹¦ÄÜ£¬¶øÇÒÿһλÊý¾Ý¿ÆÑ§¼ÒÒ²¶¼ÀÖÓÚ¼ÓÒÔʹÓá£
Èç´ó¼ÒËùÖª£¬ÕâЩÈí¼þ°ü½«±»°²×°ÔÚ/usr/local/lib/python3.6/site-packagesµ±ÖС£Èç¹û´ó¼ÒÐèÒª²é¿´²¿·Öδ±»¹«²¼ÔÚÆä¹Ù·½ÍøÕ¾µ±ÖеÄTensorFlowÔ´´úÂ룬Ôò¿ÉÒÔÔÚÕâÀïÕÒµ½¡£
±¸×¢£ºpipÓ¦»áΪÄúµÄϵͳ×Ô¶¯°²×°TensorFlowµÄ×î¼Ñ°æ±¾¡£Èç¹û´ó¼ÒÏ£Íû°²×°ÆäËü°æ±¾£¬ÔòÇëµã»÷´Ë´¦²ÎÔĹٷ½°²È«Ö¸ÄÏ¡£ÁíÍ⣬´ó¼ÒÒ²¿ÉÒÔÀûÓÃÔ´´úÂë×ÔÐй¹½¨TensorFlow£¬ÕâÒ»µãÎÒÃÇÉÔºó»áÔÚÃæÏòiOS¹¹½¨TensorFlow²¿·ÖÖнøÐÐ˵Ã÷¡£
ÏÂÃæÎÒÃǽøÐÐÒ»Ïî¿ìËÙ²âÊÔ£¬Ö¼ÔÚÈ·±£Ò»ÇÐÒªËØ¶¼ÒѾ°²×°¾ÍÐ÷¡£ÀûÓÃÒÔÏÂÄÚÈÝ´´½¨Ò»¸öеÄtryit.pyÎļþ£º
import tensorflow as tf
a = tf.constant([1, 2, 3])
b = tf.constant([4, 5, 6])
sess = tf.Session (config=tf.ConfigProto(log_device_placement=True))
print(sess.run(a + b)) |
¶øºóͨ¹ýÖÕ¶ËÔËÐÐÕâÌ׽ű¾£º
Æä»áÏÔʾһЩÓëTensorFlowÔËÐÐËùÔÚÉ豸Ïà¹ØµÄµ÷ÊÔÐÅÏ¢£¨´ó¶àΪCPUÐÅÏ¢£¬µ«Èç¹ûÄúËùʹÓõÄMacÉ豸Å䱸ÓÐӢΰ´ïGPU£¬Òà¿ÉÄÜÌṩGPUÐÅÏ¢£©¡£×îÖÕ½á¹ûÏÔʾΪ£º
ÕâÀï´ú±íµÄÊÇÁ½¸öÏòÁ¿aÓëbµÄ¼ÓºÍ¡£ÁíÍ⣬´ó¼Ò¿ÉÄÜ»¹»á¿´µ½ÒÔÏÂÐÅÏ¢£º
W tensorflow/core/platform/cpu_feature_guard.cc:45]
The TensorFlow library wasn't compiled to use
SSE4.1 instructions, but these are available on
your machine and could speed up CPU computations. |
Èç¹û³öÏÖÉÏÊöÄÚÈÝ£¬Ôò´ú±íÄúÔÚϵͳµ±Öа²×°µÄTensorFlow²¢·Çµ±Ç°CPUµÄ×îÓÅÊÊÅä°æ±¾¡£ÐÞ¸´·½·¨Ö®Ò»ÊÇÀûÓÃÔ´´úÂë×ÔÐй¹½¨TensorFlow£¬ÒòΪÕâÔÊÐí´ó¼Ò¶ÔÈ«²¿Ñ¡Ïî¼ÓÒÔÅäÖᣵ«ÔÚ±¾Ê¾Àýµ±ÖУ¬ÓÉÓÚÆä²»»áÔì³ÉʲôӰÏ죬Òò´ËÖ±½ÓºöÂÔ¼´¿É¡£
ÉîÈë¹Û²ìѵÁ·Êý¾Ý¼¯
ҪѵÁ··ÖÀàÆ÷£¬ÎÒÃÇ×ÔÈ»ÐèÒªÊý¾Ý¡£
ÔÚ±¾ÏîÄ¿µ±ÖУ¬ÎÒÃÇʹÓÃÀ´×ÔKory BeckerµÄ¡°¸ù¾ÝÓïÒôÅжÏÐÔ±ð¡±Êý¾Ý¼¯¡£ÎªÁËÄܹ»ÈÃÕâ·Ý½Ì³ÌÄܹ»ÓëTensorFlowÖ¸ÄÏÉϵÄMNISTÊý×Ö»¯Ê¶±ðÓÐËù²»Í¬£¬ÕâÀïÎÒ¾ö¶¨ÔÚKaggle.comÉÏѰÕÒÊý¾Ý¼¯£¬²¢×îÖÕÑ¡¶¨ÁËÕâÒ»Ìס£
ÄÇôÎÒÃǵ½µ×¸ÃÈçºÎÁ¢×ãÒôƵʵÏÖÐÔ±ðÅжϣ¿ÏÂÔØ¸ÃÊý¾Ý¼¯²¢´ò¿ªvoice.csvÎļþÖ®ºó£¬´ó¼Ò»á¿´µ½ÆäÖаüº¬×ÅÒ»ÅÅÅÅÊý×Ö£º

ÎÒÃÇÊ×ÏÈÐèҪǿµ÷ÕâÒ»µã£¬ÕâÀïÁгöµÄ²¢·Çʵ¼ÊÒôƵÊý¾Ý£¡Ïà·´£¬ÕâЩÊý×Ö´ú±í×ÅÓïÒô¼Ç¼µ±ÖеIJ»Í¬ÉùÑ§ÌØÕ÷¡£ÕâЩÊôÐÔ»òÕßÌØÕ÷ÓÉÒ»Ì׽ű¾×ÔÒôƵ¼Ç¼ÖÐÌáÈ¡µÃ³ö£¬²¢±»×ª»¯ÎªÕâ¸öCSVÎļþ¡£¾ßÌåÌáÈ¡·½Ê½²¢²»ÊôÓÚ±¾ÆªÎÄÕÂÏ£ÍûÌÖÂ۵ķ¶³ë£¬µ«Èç¹û´ó¼Ò¸ÐÐËȤ£¬Ôò¿Éµã»÷´Ë´¦²éÔÄÆäÔʼRÔ´´úÂë¡£
ÕâÌ×Êý¾Ý¼¯Öаüº¬3168ÏîʾÀý£¨Ã¿ÏîʾÀýÔÚÒÔÉϱí¸ñÖÐ×÷ΪһÐУ©£¬ÇÒ»ù±¾°ëÊýΪÄÐÉùÂ¼ÖÆ¡¢°ëÊýΪŮÉùÂ¼ÖÆ¡£Ã¿Ò»ÏîʾÀýÖдæÔÚ20ÏîÉùÑ§ÌØÕ÷£¬ÀýÈ磺
ÒÔkHzΪµ¥Î»µÄƽ¾ùƵÂÊ
ƵÂʵıê×¼²î
ƵÆ×ƽ̹¶È
ƵÆ×ìØ
·å¶È
ÉùѧÐźÅÖвâµÃµÄ×î´ó»ùƵ
µ÷ÖÆÖ¸Êý
µÈµÈ¡¡
±ðµ£ÐÄ£¬ËäÈ»ÎÒÃDz¢²»Á˽âÆäÖдó¶àÊýÌõÄ¿µÄʵ¼ÊÒâÒ壬µ«Õâ²»»áÓ°Ïìµ½±¾´Î½Ì³Ì¡£ÎÒÃÇÕæÕýÐèÒª ¹ØÐĵÄÊÇÈçºÎÀûÓÃÕâЩÊý¾ÝѵÁ·×Ô¼ºµÄ·ÖÀàÆ÷£¬´Ó¶øÁ¢×ãÓÚÉÏÊöÌØÕ÷È·±£ÆäÓÐÄÜÁ¦Çø·ÖÄÐÐÔÓëÅ®ÐÔµÄÓïÒô¡£
Èç¹û´ó¼ÒÏ£ÍûÔÚÒ»¿îÓ¦ÓóÌÐòµ±ÖÐʹÓô˷ÖÀàÆ÷£¬´Ó¶øÍ¨¹ý¼Òô»òÕßÀ´×ÔÂó¿Ë·çµÄÒôƵÐÅÏ¢¼ì²âÓïÒôÐÔ±ð£¬ÔòÊ×ÏÈÐèÒª´Ó´ËÀàÒôƵÊý¾ÝÖÐÌáÈ¡ÉùÑ§ÌØÕ÷¡£ÔÚÓµÓÐÁËÕâ20¸öÊý×ÖÖ®ºó£¬´ó¼Ò¼´¿É¶ÔÆä·ÖÀàÆ÷¼ÓÒÔѵÁ·£¬²¢ÀûÓÃÆäÅжÏÓïÒôÄÚÈÝΪÄÐÉù»¹ÊÇÅ®Éù¡£
Òò´Ë£¬ÎÒÃǵķÖÀàÆ÷²¢²»»áÖ±½Ó´¦ÀíÒôƵ¼Ç¼£¬¶øÊÇ´¦Àí´Ó¼Ç¼ÖÐÌáÈ¡µ½µÄÉùÑ§ÌØÕ÷¡£
±¸×¢£ºÎÒÃÇ¿ÉÒÔÒÔ´ËΪÆðµãÁ˽âÉî¶ÈѧϰÓëÂß¼»Ø¹éµÈ´«Í³Ëã·¨Ö®¼äµÄ²îÒì¡£ÎÒÃÇËùѵÁ·µÄ·ÖÀàÆ÷ÎÞ·¨Ñ§Ï°·Ç³£¸´ÔÓµÄÄÚÈÝ£¬´ó¼ÒÐèÒªÔÚÔ¤´¦Àí½×¶ÎÌáÈ¡¸ü¶àÊý¾ÝÌØÕ÷¶ÔÆä½øÐаïÖú¡£ÔÚ±¾Ê¾ÀýµÄÌØ¶¨Êý¾Ý¼¯µ±ÖУ¬ÎÒÃÇÖ»ÐèÒª¿¼ÂÇÌáÈ¡ÒôƵ¼Ç¼ÖеÄÒôƵÊý¾Ý¡£
Éî¶Èѧϰ×î¿áµÄÄÜÁ¦ÔÚÓÚ£¬´ó¼ÒÍêÈ«¿ÉÒÔѵÁ·Ò»Ì×Éñ¾ÍøÂçÀ´Ñ§Ï°ÈçºÎ×ÔÐÐÌáÈ¡ÕâЩÉùÑ§ÌØÕ÷¡£Èç´ËÒ»À´£¬´ó¼Ò²»±Ø½øÐÐÈκÎÔ¤´¦Àí¼´¿ÉÀûÓÃÉî¶Èѧϰϵͳ²ÉÈ¡ÔʼÒôƵ×÷ΪÊäÈëÄÚÈÝ£¬²¢´ÓÖÐÌáÈ¡ÈÎºÎÆäÈÏÎªÖØÒªµÄÉùÑ§ÌØÕ÷£¬¶øºó¼ÓÒÔ·ÖÀà¡£
Õ⵱ȻҲÊÇÒ»ÖÖÓÐȤµÄÉî¶Èѧϰ̽Ë÷·½Ïò£¬µ«²¢²»ÊôÓÚÎÒÃǽñÌìÌÖÂ۵ķ¶³ë£¬Òò´ËÒ²ÐíÈÕºóÎÒÃǽ«Áí¿ªÒ»ÆªÎÄÕµ¥¶À½éÉÜ¡£
½¨Á¢Ò»Ì×ѵÁ·¼¯Óë²âÊÔ¼¯
ÔÚǰÎĵ±ÖУ¬ÎÒÌáµ½¹ýÎÒÃÇÐèÒªÒÔÈçϲ½Öè¶Ô·ÖÀàÆ÷½øÐÐѵÁ·£º
ÏòÆä½»¸¶À´×ÔÊý¾Ý¼¯µÄÈ«²¿Ê¾Àý¡£
ºâÁ¿Ô¤²â½á¹ûµÄ´íÎó³Ì¶È¡£
¸ù¾Ýlossµ÷ÕûÈ¨ÖØ¡£
ÊÂʵ֤Ã÷£¬ÎÒÃDz»Ó¦ÀûÓÃÈ«²¿Êý¾Ý½øÐÐѵÁ·¡£ÎÒÃÇÖ»ÐèÒªÆäÖеÄÌØ¶¨Ò»²¿·ÖÊý¾Ý¡ª¡ª¼´²âÊÔ¼¯¡ª¡ª´Ó¶øÆÀ¹À·ÖÀàÆ÷µÄʵ¼Ê¹¤×÷Ч¹û¡£Òò´Ë£¬ÎÒÃǽ«°ÑÕûÌåÊý¾Ý¼¯²ð·ÖΪÁ½´ó²¿·Ö£ºÑµÁ·¼¯£¬ÓÃÓÚ¶Ô·ÖÀàÆ÷½øÐÐѵÁ·;
²âÊÔ¼¯£¬ÓÃÓÚÁ˽â¸Ã·ÖÀàÆ÷µÄÔ¤²â׼ȷ¶È¡£
ΪÁ˽«Êý¾Ý²ð·ÖΪѵÁ·¼¯Óë²âÊÔ¼¯£¬ÎÒ´´½¨ÁËÒ»Ì×ÃûΪsplit_data.pyµÄPython½Å±¾£¬ÆäÄÚÈÝÈçÏÂËùʾ£º
import numpy as np # 1
import pandas as pd df = pd.read_csv("voice.csv",
header=0) #
2 labels = (df["label"] == "male").values
* 1 # 3
labels = labels.reshape(-1, 1) # 4
del df["label"] # 5
data = df.values # 6
from sklearn.model_selection import train_test_split
X_train,
X_test, y_train, y_test = train_test_split(data,
labels, test_size=0.3, random_state=123456)
np.save("X_train.npy", X_train) # 7
np.save("X_test.npy", X_test)
np.save("y_train.npy", y_train)
np.save("y_test.npy", y_test) |
ÏÂÃæÎÒÃǽ«·Ö²½ÖèÁ˽âÕâÌ׽ű¾µÄ¹¤×÷·½Ê½£º
Ê×Ïȵ¼ÈëNumPyÓëpandasÈí¼þ°ü¡£PandasÄܹ»ÇáËÉʵÏÖCSVÎļþµÄ¼ÓÔØ£¬²¢¶ÔÊý¾Ý½øÐÐÔ¤´¦Àí¡£
ÀûÓÃpandas´Óvoice.csv¼ÓÔØÊý¾Ý¼¯²¢½«Æä×÷Ϊdataframe¡£´Ë¶ÔÏóÔںܴó³Ì¶ÈÉÏÀàËÆÓÚµç×Ó±í¸ñ»òÕßSQL±í¡£
ÕâÀïµÄlabelÁаüº¬ÓиÃÊý¾Ý¼¯µÄ¸÷Ïî±êÇ©£º¼´¸ÃʾÀýΪÄÐÉù»òÕßÅ®Éù¡£ÔÚÕâÀÎÒÃǽ«ÕâЩ±êÇ©ÌáÈ¡½øÒ»¸öеÄNumPyÊý×éµ±ÖС£¸÷Ôʼ±êǩΪÎı¾ÐÎʽ£¬µ«ÎÒÃǽ«Æäת»¯ÎªÊý×ÖÐÎʽ£¬ÆäÖÐ1=ÄÐÉù£¬0=Å®Éù¡££¨ÕâÀïµÄÊý×Ö¸³Öµ·½Ê½¿ÉÈÎÒâÑ¡Ôñ£¬ÔÚ¶þÔª·ÖÀàÆ÷ÖУ¬ÎÒÃÇͨ³£Ê¹ÓÃ1±íʾ¡®Õý¡¯À࣬»òÕß˵ÎÒÃÇÊÔͼ¼ì²âµÄÀà¡££©
ÕâÀï´´½¨µÄÐÂlabelsÊý×éÊÇÒ»Ì×һάÊý×飬µ«ÎÒÃǵÄTensorFlow½Å±¾ÔòÐèÒªÒ»Ì×¶þάÕÅÁ¿£¬ÆäÖÐ3168ÐÐÖÐÿһÐнԶÔÓ¦Ò»ÁС£Òò´ËÎÒÃÇÐèÒªÔÚÕâÀï¶ÔÊý×é½øÐС°ÖØËÜ¡±£¬Ö¼ÔÚ½«Æäת»¯Îª¶þάÐÎʽ¡£Õâ²»»á¶ÔÄÚ´æÖеÄÊý¾Ý²úÉúÓ°Ï죬¶ø½ö±ä»¯NumPy¶ÔÊý¾ÝµÄ½âÊÍ·½Ê½¡£
ÔÚÍê³ÉlabelÁÐÖ®ºó£¬ÎÒÃǽ«Æä´Ódataframeµ±ÖÐÒÆ³ý£¬ÕâÑùÎÒÃǾÍֻʣÏÂ20ÏîÓÃÓÚÃèÊöÊäÈëÄÚÈݵÄÌØÕ÷¡£ÎÒÃÇ»¹½«°Ñ¸Ãdataframeת»»ÎªÒ»Ì׳£¹æNumPyÊý×é¡£
ÕâÀÎÒÃÇÀûÓÃÀ´×Ôscikit-learnµÄÒ»Ïîhelperº¯Êý½«dataÓëlabelsÊý×é²ð·ÖΪÁ½¸ö²¿·Ö¡£ÕâÖÖ¶ÔÊý¾Ý¼¯ÄÚ¸÷ʾÀý½øÐÐËæ»úÏ´ÅÆµÄ²Ù×÷»ùÓÚrandom_state£¬¼´Ò»ÀàËæ»úÉú³ÉÆ÷¡£ÎÞÂÛ¾ßÌåÄÚÈÝΪºÎ£¬µ«Ö»ÒªÇà½îÏàͬÄÚÈÝ£¬ÎÒÃǼ´´´Ôì³öÁËÒ»Ïî¿ÉÖØ¸´½øÐеÄʵÑé¡£
×îºó£¬½«ËÄÏîеÄÊý×é±£´æÎªNumPyµÄ¶þ½øÖÆÎļþ¸ñʽ¡£ÏÖÔÚÎÒÃÇÒѾӵÓÐÁËÒ»Ì×ѵÁ·¼¯ÓëÒ»ÌײâÊÔ¼¯£¡
´ó¼ÒÒ²¿ÉÒÔ½øÐжîÍâµÄһЩԤ´¦Àí¶Ô½Å±¾ÖеÄÊý¾Ý½øÐе÷Õû£¬ÀýÈç¶ÔÌØÕ÷½øÐÐÀ©Õ¹£¬´Ó¶øÊ¹ÆäÓµÓÐ0¾ùÖµ¼°ÏàµÈµÄ·½²î£¬µ«ÓÉÓÚ±¾´ÎʾÀýÏîÄ¿±È½Ï¼òµ¥£¬ËùÒÔ²¢ÎÞÉîÈëµ÷ÕûµÄ±ØÒª¡£
ÀûÓÃÒÔÏÂÃüÁîÔÚÖÕ¶ËÖÐÔËÐÐÕâÌ׽ű¾£º
Õ⽫¸øÎÒÃÇ´øÀ´4¸öÐÂÎļþ£¬ÆäÖаüº¬ÓÐѵÁ·¾ÈÃü£¨X_train.npy£©¡¢ÕâЩʾÀýµÄ¶ÔÓ¦±êÇ©£¨y_train.npy£©¡¢²âÊÔʾÀý£¨X_test.npy£©¼°Æä¶ÔÓ¦±êÇ©£¨y_test.npy£©¡£
±¸×¢£º´ó¼Ò¿ÉÄÜÏëÁ˽âΪʲôÕâЩ±äÁ¿Ãû³ÆÎªºÎÓÐЩÊÇ´óд£¬ÓÐЩÊÇСд¡£ÔÚÊýѧ²ãÃæÀ´¿´£¬¾ØÕóͨ³£ÒÔ´óд±íʾ¶øÏòÁ¿ÔòÒÔСд±íʾ¡£ÔÚÎÒÃǵĽű¾ÖУ¬X´ú±íÒ»¸ö¾ØÕó£¬y´ú±íÒ»¸öÏòÁ¿¡£ÕâÊÇÒ»ÖÖ¹ßÀý£¬´ó²¿·Ö»úÆ÷ѧϰ´úÂëÖнÔÕմ˰ìÀí¡£
½¨Á¢¼ÆËãͼ
ÏÖÔÚÎÒÃÇÒѾ¶ÔÊý¾Ý½øÐÐÁËÊáÀí£¬¶øºó¼´¿É±àдһÌ׽ű¾ÒÔÀûÓÃTensorFlow¶ÔÕâÌ×Âß¼·ÖÀàÆ÷½øÐÐѵÁ·¡£ÕâÌ׽ű¾ÃûΪtrain.py¡£ÎªÁ˽Úʡƪ·ù£¬ÕâÀï¾Í²»ÔÙÁгö½Å±¾µÄ¾ßÌåÄÚÈÝÁË£¬´ó¼Ò¿ÉÒÔµã»÷´Ë´¦ÔÚGitHubÉϽøÐв鿴¡£
ÓëÍù³£Ò»Ñù£¬ÎÒÃÇÊ×ÏÈÐèÒªµ¼ÈëÐèÒªµÄÈí¼þ°ü¡£ÔÚ´ËÖ®ºó£¬ÎÒÃǽ«ÑµÁ·Êý¾Ý¼ÓÔØÖÁÁ½¸öNumPyÊý×éµ±ÖУ¬¼´X_trainÓëy_train¡££¨ÎÒÃÇÔÚ±¾½Å±¾Öв»»áʹÓòâÊÔÊý¾Ý¡££©
import numpy as np
import tensorflow as tf
X_train = np.load("X_train.npy")
y_train = np.load("y_train.npy") |
ÏÖÔÚÎÒÃÇ¿ÉÒÔ½¨Á¢×Ô¼ºµÄ¼ÆËãͼ¡£Ê×ÏÈ£¬ÎÒÃÇΪÎÒÃǵÄÊäÈëÄÚÈÝxÓëy¶¨ÒåËùνplaceholders£¨Õ¼Î»·û£©£º
num_inputs = 20
num_classes = 1
with tf.name_scope("inputs"):
x = tf.placeholder(tf.float32, [None, num_inputs],
name="x-input")
y = tf.placeholder(tf.float32, [None, num_classes],
name="y-input") |
ÆäÖÐtf.name_scope("...")¿ÉÓÃÓڶԸüÆËãͼÖеIJ»Í¬²¿·Ö°´²»Í¬·¶Î§½øÐзÖ×飬´Ó¶ø¼ò»¯¶Ô¼ÆËãͼÄÚÈݵÄÀí½â¡£ÎÒÃǽ«xÓëyÌí¼ÓÖÁ¡°inputs¡±·¶Î§Ö®ÄÚ¡£ÎÒÃÇ»¹½«ÎªÆäÃüÃû£¬·Ö±ðΪ¡°x-input¡±Óë¡°y-input¡±£¬ÕâÑù¼´¿ÉÔÚËæºóÇáËɼÓÒÔÒýÓá£
´ó¼ÒÓ¦¸Ã»¹¼ÇµÃ£¬Ã¿ÌõÊäÈëʾÀý¶¼ÊÇÒ»¸ö°üº¬20ÏîÔªËØµÄÏòÁ¿¡£Ã¿ÌõʾÀýÒàÓµÓÐÒ»¸ö±êÇ©£¨1´ú±íÄÐÉù£¬0´ú±íÅ®Éù£©¡£ÎÒ֮ǰ»¹Ìáµ½¹ý£¬ÎÒÃÇ¿ÉÒÔ½«È«²¿Ê¾ÀýÕûºÏΪһ¸ö¾ØÕ󣬴ӶøÒ»´ÎÐÔ¶ÔÆä½øÐÐÈ«Ãæ¼ÆËã¡£ÕýÒòΪÈç´Ë£¬ÎÒÃÇÕâÀォxÓëy¶¨ÒåΪ¶þάÕÅÁ¿£ºxÓµÓÐ[None,
20]ά¶È£¬¶øyÓµÓÐ[None, 1]ά¶È¡£
ÆäÖеÄNone´ú±íµÚÒ»Ïîά¶ÈΪÁé»î¿É±äÇÒĿǰδ֪¡£ÔÚѵÁ·¼¯µ±ÖУ¬ÎÒÃǽ«2217ÌõʾÀýµ¼ÈëxÓëy; ¶øÔÚ²âÊÔ¼¯ÖУ¬ÎÒÃÇÒýÈë951ÌõʾÀý¡£ÏÖÔÚ£¬TensorFlowÒѾÁ˽âÁËÎÒÃǵÄÊäÈëÄÚÈÝ£¬½ÓÏÂÀ´¶Ô·ÖÀàÆ÷µÄparameters£¨²ÎÊý£©½øÐж¨Ò壺
with tf.name_scope("model"):
W = tf.Variable(tf.zeros ([num_inputs, num_classes]),
name="W")
b = tf.Variable(tf.zeros ([num_classes]), name="b") |
ÆäÖеÄÕÅÁ¿W°üº¬ÓзÖÀàÆ÷½«ÒªÑ§Ï°µÄÈ¨ÖØ£¨ÕâÊÇÒ»¸ö20 x 1¾ØÕó£¬ÒòΪÆäÖаüº¬20ÌõÊäÈëÌØÕ÷Óë1ÌõÊä³ö½á¹û£©£¬¶øbÔò°üº¬Æ«ÀëÖµ¡£Õâ¶þÕß±»ÉùÃ÷ΪTensorFlow±äÁ¿£¬Òâζ×ŶþÕß¿ÉÔÚ·´Ïò´«²¥¹ý³Ìµ±ÖÐʵÏÖ¸üС£
ÔÚÒ»ÇÐ×¼±¸¾ÍÐ÷Ö®ºó£¬ÎÒÃÇ¿ÉÒÔ¶Ô×÷ΪÂß¼»Ø¹é·ÖÀàÆ÷ºËÐĵļÆËãÁ÷³Ì½øÐÐÉùÃ÷ÁË£º
y_pred = tf.sigmoid(tf.matmul(x, W) + b) |
ÕâÀォxÓëW½øÐÐÏà³Ë£¬Í¬Ê±¼ÓÉÏÆ«ÀëÖµb£¬¶øºóÈ¡ÆäÂß¼Ðͳɳ¤ÇúÏߣ¨logistic
sigmoid£©¡£Èç´ËÒ»À´£¬y_predÖеĽá¹û¼´¸ù¾ÝxÄÚÒôƵÊý¾ÝµÄÃèÊöÌØÐÔ¶ø±»ÅжÏΪÄÐÉùµÄ¸ÅÂÊ¡£
±¸×¢£ºÒÔÉÏ´úÂëĿǰʵ¼Ê»¹²»»á×ö³öÈκμÆË㡪¡ª½ØÖÁĿǰ£¬ÎÒÃÇ»¹Ö»Êǹ¹½¨ÆðÁ˱ØÒªµÄ¼ÆËãͼ¡£ÕâÒ»Ðе¥´¿Êǽ«¸÷½ÚµãÌí¼ÓÖÁ¼ÆËãͼµ±ÖÐÒÔ×÷Ϊ¾ØÕó³Ë·¨£¨tf.matmul£©¡¢¼Ó·¨£¨+£©ÒÔ¼°sigmoidº¯Êý£¨tf.sigmoid£©¡£ÔÚÍê³ÉÕûÌ弯ËãͼµÄ¹¹½¨Ö®ºó£¬ÎÒÃÇ·½¿É´´½¨TensorFlow»á»°²¢ÀûÓÃʵ¼ÊÊý¾Ý¼ÓÒÔÔËÐС£
µ½ÕâÀïÈÎÎñ»¹Î´Íê³É¡£ÎªÁËѵÁ·ÕâÌ×Ä£ÐÍ£¬ÎÒÃÇÐèÒª¶¨ÒåÒ»Ïîlossº¯Êý¡£¶ÔÓÚÒ»Ì×¶þÔªÂß¼»Ø¹é·ÖÀàÆ÷£¬ÎÒÃÇÐèҪʹÓÃlog
loss£¬ÐÒÔ˵ÄÊÇTensorFlow±¾ÉíÄÚÖÃÓÐÒ»Ïîlog_loss()º¯Êý¿É¹©Ö±½ÓʹÓãº
with tf.name_scope("loss-function"):
loss = tf.losses.log_loss(labels=y, predictions=y_pred)
loss += regularization * tf.nn.l2_loss(W) |
ÆäÖеÄlog_loss¼ÆËãͼ½Úµã×÷ΪÊäÈëÄÚÈÝy£¬ÎÒÃÇ»á»ñÈ¡ÓëÖ®Ïà¹ØµÄʾÀý±êÇ©²¢½«ÆäÓëÎÒÃǵÄÔ¤²â½á¹ûy_pred½øÐбȽϡ£ÒÔÊý×ÖÏÔʾµÄ½á¹û¼´ÎªlossÖµ¡£
ÔÚ¸Õ¿ªÊ¼½øÐÐѵÁ·Ê±£¬ËùÓÐʾÀýµÄÔ¤²â½á¹ûy_pred½Ô½«Îª0.5£¨»òÕß50%ÄÐÉù£©£¬ÕâÊÇÒòΪ·ÖÀàÆ÷±¾ÉíÉв»Çå³þÈçºÎ»ñµÃÕýÈ·´ð°¸¡£Æä³õʼlossÔÚ¾-1n(0.5)¼ÆËãºóµÃ³öΪ0.693146¡£¶øÔÚѵÁ·µÄÍÆ½øµ±ÖУ¬ÆälossÖµ½«±äµÃÔ½À´Ô½Ð¡¡£
µÚ¶þÐÐÓÃÓÚ¼ÆËãlossÖµÓëËùνL2 regularization£¨ÕýÔò»¯£©µÄ¼ÓÖµ¡£ÕâÊÇΪÁË·ÀÖ¹¹ý¶ÈÄâºÏ×è°·ÖÀàÆ÷¶ÔѵÁ·Êý¾ÝµÄ׼ȷ¼ÇÒä¡£ÕâÒ»¹ý³Ì±È½Ï¼òµ¥£¬ÒòΪÎÒÃǵķÖÀàÆ÷¡°Äڴ桱ֻ°üº¬20ÏîÈ¨ÖØÖµÓëÆ«ÀëÖµ¡£²»¹ýÕýÔò»¯±¾ÉíÊÇÒ»ÖÖ³£¼ûµÄ»úÆ÷ѧϰ¼¼Êõ£¬Òò´ËÔÚÕâÀï±ØÐëÒ»Ìá¡£
ÕâÀïµÄregularizationֵΪÁíÒ»Ïîռλ·û£º
with tf.name_scope("hyperparameters"):
regularization = tf.placeholder (tf.float32, name="regularization")
learning_rate = tf.placeholder (tf.float32, name="learning-rate") |
ÎÒÃÇ»¹½«ÀûÓÃռλ·û¶¨ÒåÎÒÃǵÄÊäÈëÄÚÈÝxÓëy£¬²»¹ý¶þÕßµÄ×÷ÓÃÊǶ¨Òåhyperparameters¡£
HyperparametersÔÊÐí´ó¼Ò¶ÔÕâÌ×Ä£Ðͼ°Æä¾ßÌåѵÁ··½Ê½½øÐÐÅäÖá£ÆäÖ®ËùÒÔ±»³ÆÎª¡°³¬¡±²ÎÊý£¬ÊÇÒòΪÓë³£¼ûµÄWÓëb²ÎÊý²»Í¬£¬Æä²¢·ÇÓÉÄ£ÐÍ×ÔÉíËùѧϰ¡ª¡ª´ó¼ÒÐèÒª×ÔÐн«ÆäÉèÖÃΪÊʵ±µÄÖµ¡£
ÆäÖеÄlearning_rate³¬²ÎÊý¸ºÔð¸æÖªÓÅ»¯Æ÷ËùÓ¦²ÉÈ¡µÄµ÷Õû·ù¶È¡£¸ÃÓÅ»¯Æ÷£¨optimizer£©¸ºÔðÖ´Ðз´Ïò´«²¥£ºÆä»áÌáÈ¡lossÖµ²¢½«Æä´«µÝ»Ø¼ÆËãͼÒÔÈ·¶¨ÐèÒª¶ÔÈ¨ÖØÖµÓëÆ«ÀëÖµ½øÐÐÔõÑùµÄµ÷Õû¡£ÕâÀï¿ÉÒÔÑ¡ÔñµÄÓÅ»¯Æ÷·½°¸¶àÖÖ¶àÑù£¬¶øÎÒÃÇʹÓõÄΪADAM£º
with tf.name_scope("train"):
optimizer = tf.train.AdamOptimizer(learning_rate)
train_op = optimizer.minimize(loss) |
ÆäÄܹ»ÔÚ¼ÆËãͼµ±Öд´½¨Ò»¸öÃûΪtrain_opµÄ½Úµã¡£ÎÒÃÇÉÔºó½«ÔËÐд˽ڵãÒÔѵÁ··ÖÀàÆ÷¡£ÎªÁËÈ·¶¨¸Ã·ÖÀàÆ÷µÄÔËÐÐЧ¹û£¬ÎÒÃÇ»¹ÐèÒªÔÚѵÁ·µ±ÖÐż¶û²¶×½¿ìÕÕ²¢¼ÆËãÆäÒѾÄܹ»ÔÚѵÁ·¼¯µ±ÖÐÕýÈ·Ô¤²â¶àÉÙÏîʾÀý¡£ÑµÁ·¼¯µÄ׼ȷÐÔ²¢·Ç·ÖÀàÆ÷ÔËÐÐЧ¹ûµÄ×îÖÕ¼ìÑé±ê×¼£¬µ«¶ÔÆä½øÐÐ×·×ÙÄܹ»°ïÖúÎÒÃÇÔÚÒ»¶¨³Ì¶ÈÉϰÑÎÕѵÁ·¹ý³ÌÓëÔ¤²â׼ȷÐÔÇ÷ÊÆ¡£¾ßÌåÀ´½²£¬Èç¹ûÔ½ÊÇѵÁ·½á¹ûÔ½²î£¬ÄÇôһ¶¨ÊdzöÁËʲôÎÊÌ⣡
ÏÂÃæÎÒÃÇΪһ¸ö¼ÆËãͼ½Úµã¶¨Ò弯Ë㾫¶È£º
with tf.name_scope("inference"):
inference = tf.to_float (y_pred > 0.5, name="inference")
|
ÎÒÃÇ¿ÉÒÔÔËÐÐÆäÖеÄaccuracy½ÚµãÒԲ鿴ÓжàÉÙ¸öʾÀýµÃµ½ÁËÕýÈ·Ô¤²â¡£´ó¼ÒÓ¦¸Ã»¹¼ÇµÃ£¬y_predÖаüº¬Ò»Ïî½éÓÚ0µ½1Ö®¼äµÄ¸ÅÂÊ¡£Í¨¹ý½øÐÐtf.to_float(y_pred
> 0.5)£¬ÈôÔ¤²â½á¹ûΪŮÉùÔò·µ»ØÖµÎª0£¬ÈôÔ¤²â½á¹ûΪÄÐÉùÔò·µ»ØÖµÎª1¡£ÎÒÃÇ¿ÉÒÔ½«ÆäÓëy½øÐбȽϣ¬yµ±Öаüº¬ÓÐÕýÈ·Öµ¡£¶ø¾«¶ÈÖµÔò´ú±í×ÅÕýÈ·Ô¤²âÊýÁ¿³ýÒÔÔ¤²â×ÜÊý¡£
ÔÚ´ËÖ®ºó£¬ÎÒÃǽ«ÀûÓÃͬÑùµÄaccuracy½Úµã´¦Àí²âÊÔ¼¯£¬´Ó¶øÁ˽âÕâÌ×·ÖÀàÆ÷µÄʵ¼Ê¹¤×÷Ч¹û¡£
ÁíÍ⣬ÎÒÃÇ»¹ÐèÒª¶¨ÒåÁíÍâÒ»¸ö½Úµã¡£´Ë½ÚµãÓÃÓÚ¶ÔÎÒÃÇÉÐÎÞ¶ÔÓ¦±êÇ©µÄÊý¾Ý½øÐÐÔ¤²â£º
with tf.name_scope("inference"):
inference = tf.to_float (y_pred > 0.5, name="inference")
|
ΪÁ˽«ÕâÌ×·ÖÀàÆ÷ÒýÈëÓ¦Óã¬ÎÒÃÇ»¹ÐèÒª¼Ç¼¼¸¸öÓïÒôÎı¾´Ê»ã£¬¶ÔÆä½øÐзÖÎöÒÔÌáÈ¡20ÏîÉùÑ§ÌØÕ÷£¬¶øºóÔÙ½«Æä½»¸¶ÖÁ·ÖÀàÆ÷¡£ÓÉÓÚ´¦ÀíÄÚÈÝÊôÓÚÈ«ÐÂÊý¾Ý£¬¶ø·ÇÀ´×ÔѵÁ·»òÕß²âÊÔ¼¯µÄÊý¾Ý£¬Òò´ËÎÒÃÇÏÔÈ»²»¾ß±¸ÓëÖ®Ïà¹ØµÄ±êÇ©¡£´ó¼ÒÖ»Äܽ«Êý¾ÝÖ±½Ó½»¸¶ÖÁ·ÖÀàÆ÷£¬²¢Ï£ÍûÆäÄܹ»¸ø³öÕýÈ·µÄÔ¤²â½á¹û¡£¶øinference½ÚµãµÄ×÷ÓÃÒ²ÕýÔÚÓÚ´Ë¡£
ºÃµÄ£¬ÎÒÃÇÒѾͶÈëÁË´óÁ¿¾«Á¦À´¹¹½¨ÕâÌ×¼ÆËãͼ¡£ÏÖÔÚÎÒÃÇÏ£ÍûÀûÓÃѵÁ·¼¯¶ÔÆä½øÐÐʵ¼ÊѵÁ·¡£
ѵÁ··ÖÀàÆ÷
ѵÁ·Í¨³£ÒÔÎÞÏÞÑ»·µÄ·½Ê½½øÐС£²»¹ý¶ÔÓÚÕâÌ×¼òµ¥µÄÂß¼·ÖÀàÆ÷£¬ÕâÖÖ×÷·¨ÏÔÈ»Óеã¿äÕÅ¡ª¡ªÒòΪÆä²»µ½Ò»·ÖÖÓ¼´¿ÉÍê³ÉѵÁ·¡£µ«¶ÔÓÚÉî²ãÉñ¾ÍøÂ磬ÎÒÃÇÍùÍùÐèÒªÊýСʱÉõÖÁÊýÌìʱ¼ä½øÐнű¾ÔËÐСª¡ªÖ±µ½Æä»ñµÃÁîÈËÂúÒâµÄ¾«¶È»òÕßÄú¿ªÊ¼Ê§È¥ÄÍÐÄ¡£
ÒÔÏÂΪtrain.pyµ±ÖÐѵÁ·Ñ»·µÄµÚÒ»²¿·Ö£º
with tf.Session() as sess:
tf.train.write_graph (sess.graph_def, checkpoint_dir,
"graph.pb", False)
sess.run(init)
step = 0
while True:
# here comes the training code/pre>
|
ÎÒÃÇÊ×ÏÈ´´½¨Ò»¸öеÄTensorFlow session£¨»á»°£©¶ÔÏó¡£ÒªÔËÐиüÆËãͼ£¬´ó¼ÒÐèÒª½¨Á¢Ò»Ì׻Ự¡£µ÷ÓÃsess.run(init)»á½«WÓëbÈ«²¿ÖØÉèΪ0¡£
ÎÒÃÇ»¹ÐèÒª½«¸Ã¼ÆËãͼдÈëÒ»¸öÎļþ¡£ÎÒÃǽ«Ö®Ç°´´½¨µÄÈ«²¿½ÚµãÐòÁÐÖÁ/tmp/voice/graph.pbÎļþµ±ÖС£ÎÒÃÇÖ®ºóÐèÒªÀûÓô˼ÆËãͼ¶¨ÒåÒÔÁ¢×ã²âÊÔ¼¯½øÐзÖÀàÆ÷ÔËÐУ¬²¢³¢ÊÔ½«¸ÃѵÁ·ºóµÄ·ÖÀàÆ÷ÒýÈëiOSÓ¦Óá£
ÔÚwhile True:Ñ»·µ±ÖУ¬ÎÒÃÇʹÓÃÒÔÏÂÄÚÈÝ£º
perm = np.arange(len(X_train))
np.random.shuffle(perm)
X_train = X_train[perm]
y_train = y_train[perm] |
Ê×ÏÈ£¬ÎÒÃǶÔѵÁ·Ê¾Àý½øÐÐËæ»úÏ´ÅÆ¡£ÕâÒ»µã·Ç³£ÖØÒª£¬ÒòΪ´ó¼Òµ±È»²»Ï£Íû·ÖÀàÆ÷¸ù¾ÝʾÀýµÄ¾ßÌå˳Ðò½øÐÐÅжϡª¡ª¶ø·Ç¸ù¾ÝÆäÉùÑ§ÌØÕ÷½øÐÐÅжϡ£
½ÓÏÂÀ´ÊÇ×îÖØÒªµÄ»·½Ú£ºÎÒÃÇÒªÇó¸Ã»á»°ÔËÐÐtrain_op½Úµã¡£Æä½«ÔÚ¼ÆËãͼ֮ÉÏÔËÐÐÒ»´ÎѵÁ·£º
feed = {x: X_train, y: y_train, learning_rate:
1e-2,
regularization: 1e-5}
sess.run(train_op, feed_dict=feed) |
ÔÚÔËÐÐsess.run()ʱ£¬´ó¼Ò»¹ÐèÒªÌṩһÌ×À¡Ëʹʵ䡣Æä½«¸ºÔð¸æÖªTensorFlowµ±Ç°Õ¼Î»·û½ÚµãµÄʵ¼ÊÖµ¡£
ÓÉÓÚÕâÖ»ÊÇÒ»Ì׷dz£¼òµ¥µÄ·ÖÀàÆ÷£¬Òò´ËÎÒÃǽ«Ê¼ÖÕÒ»´ÎÐÔ¶ÔÈ«²¿ÑµÁ·¼¯½øÐÐѵÁ·£¬ËùÒÔÕâÀïÎÒÃǽ«X_trainÊý×éÒýÈëռλ·ûx²¢½«y_trainÊý×éÒýÈëռλ·ûy¡££¨¶ÔÓÚ¹æÄ£¸ü´óµÄÊý¾Ý¼¯£¬´ó¼Ò¿ÉÒÔÏÈ´ÓСÅúÊý¾ÝÄÚÈÝ×ÅÊÖ£¬ÀýÈ罫ʾÀýÊýÁ¿É趨Ϊ100µ½1000Ö®¼ä¡££©
µ½ÕâÀÎÒÃǵIJÙ×÷¾Í½×¶ÎÐÔ½áÊøÁË¡£ÓÉÓÚÎÒÃÇʹÓÃÁËÎÞÏÞÑ»·£¬Òò´Ëtrain_op½Úµã»á·´¸´ÔÙ·´¸´¼ÓÒÔÖ´ÐС£¶øÔÚÿһ´Îµü´úʱ£¬ÆäÖеķ´Ïò´«²¥»úÖÆ¶¼»á¶ÔÈ¨ÖØÖµWÓëb×÷³öС·ùµ÷Õû¡£Ëæ×Åʱ¼äÍÆÒÆ£¬Õ⽫ÁîÈ¨ÖØÖµÖð²½Ç÷½üÓÚ×îÓÅÖµ¡£
ÎÒÃǵ±È»ÓбØÒªÁ˽âѵÁ·½ø¶È£¬Òò´ËÎÒÃÇÐèÒª¾³£ÐÔµØÊä³ö½ø¶È±¨¸æ£¨ÔÚ±¾Ê¾ÀýÏîÄ¿ÖУ¬Ã¿½øÐÐ1000´ÎѵÁ·¼´Êä³öÒ»´Î½á¹û£©£º
if step % print_every == 0:
train_accuracy, loss_value = <>sess.run([accuracy,
loss], feed_dict=feed)
print("step: %4d, loss: %.4f, training accuracy:
%.4f" % \
(step, loss_value, train_accuracy)) |
ÕâÒ»´ÎÎÒÃDz»ÔÙÔËÐÐtrain_op½Úµã£¬¶øÊÇÔËÐÐaccuracyÓëlossÁ½¸ö½Úµã¡£ÎÒÃÇʹÓÃͬÑùµÄÀ¡Ëʹʵ䣬ÕâÑùaccuracyÓëloss¶¼»á¸ù¾ÝѵÁ·¼¯½øÐмÆËã¡£ÕýÈç֮ǰËùÌáµ½£¬ÑµÁ·¼¯ÖеĽϸßÔ¤²â¾«¶È²¢²»´ú±í·ÖÀàÆ÷Äܹ»ÔÚ´¦Àí²âÊÔ¼¯Ê±Í¬ÑùÓµÓÐÁ¼ºÃ±íÏÖ£¬µ«´ó¼Òµ±È»Ï£ÍûËæ×ÅѵÁ·µÄ½øÐÐÆä¾«¶ÈÖµ²»¶ÏÌáÉý¡£Óë´Ëͬʱ£¬lossÖµÔòÓ¦²»¶ÏϽµ¡£
ÁíÍ⣬ÎÒÃÇ»¹ÐèҪʱ²»Ê±±£´æÒ»·Ýcheckpoint£º
if step % save_every == 0:
checkpoint_file = os.path.join (checkpoint_dir,
"model")
saver.save(sess, checkpoint_file)
print("*** SAVED MODEL ***") |
Æä»á»ñÈ¡·ÖÀàÆ÷µ±Ç°ÒѾѧϰµ½µÄWÓëbÖµ£¬²¢½«Æä±£´æÎªÒ»¸öcheckpointÎļþ¡£´Ëcheckpoint¿É¹©ÎÒÃDzÎÔÄ£¬²¢ÅжϷÖÀàÆ÷ÊÇ·ñÒѾ¿ÉÒÔת¶ø´¦Àí²âÊÔ¼¯¡£¸ÃcheckpoinitÎļþͬÑù±»±£´æÔÚ/tmp/voice/Ŀ¼µ±ÖС£
ʹÓÃÒÔÏÂÃüÁîÔÚÖÕ¶ËÖÐÔËÐиÃѵÁ·½Å±¾£º
python3 train.py Êä³ö½á¹ûÓ¦ÈçÏÂËùʾ£º
Training set size: (2217, 20)
Initial loss: 0.693146
step: 0, loss: 0.7432, training accuracy: 0.4754
step: 1000, loss: 0.4160, training accuracy: 0.8904
step: 2000, loss: 0.3259, training accuracy: 0.9170
step: 3000, loss: 0.2750, training accuracy: 0.9229
step: 4000, loss: 0.2408, training accuracy: 0.9337
step: 5000, loss: 0.2152, training accuracy: 0.9405
step: 6000, loss: 0.1957, training accuracy: 0.9553
step: 7000, loss: 0.1819, training accuracy: 0.9594
step: 8000, loss: 0.1717, training accuracy: 0.9635
step: 9000, loss: 0.1652, training accuracy: 0.9666
*** SAVED MODEL ***
step: 10000, loss: 0.1611, training accuracy:
0.9702
step: 11000, loss: 0.1589, training accuracy:
0.9707
. . . |
µ±·¢ÏÖlossÖµ²»ÔÙϽµÊ±£¬¾ÍÉÔµÈÒ»ÏÂÖ±µ½¿´µ½ÏÂÒ»Ìõ*** SAVED
MODEL ***ÐÅÏ¢£¬Õâʱ°´ÏÂCtrl+CÒÔֹͣѵÁ·¡£
ÔÚ³¬²ÎÊýÉèÖõ±ÖУ¬ÎÒÑ¡ÔñÁËÕý¹æ»¯ÓëѧϰËÙÂÊ£¬´ó¼ÒÓ¦¸Ã»á¿´µ½ÆäѵÁ·¼¯µÄ׼ȷÂÊÒѾ´ïµ½Ô¼97%£¬¶ølossÖµÔòԼΪ0.157¡££¨Èç¹û´ó¼ÒÔÚÀ¡ËʹʵäÖн«regularizationÉèÖÃΪ0£¬ÔòlossÉõÖÁ»¹Äܹ»½øÒ»²½½µµÍ¡££©
ʵ¼ÊЧ¹ûÈçºÎ£¿
ÔÚÍê³É¶Ô·ÖÀàÆ÷µÄѵÁ·Ö®ºó£¬½ÓÏÂÀ´¾ÍÊÇ¶ÔÆä½øÐвâÊÔÒÔÁ˽âËüÔÚʵ¼ùµ±ÖеÄÔËÐÐЧ¹û¡£´ó¼ÒÐèҪʹÓÃδÔÚѵÁ·ÖÐÉæ¼°¹ýµÄÊý¾ÝÍê³ÉÕâÏî²âÊÔ¡£ÕýÒòΪÈç´Ë£¬ÎÒÃDzÅÔÚ´Ëǰ½«Êý¾Ý¼¯²ð·ÖΪѵÁ·¼¯Óë²âÊÔ¼¯¡£
ÎÒÃǽ«´´½¨Ò»Ì×еÄtest.py½Å±¾£¬¸ºÔð¼ÓÔØ¼ÆËãͼ¶¨ÒåÒÔ¼°²âÊÔ¼¯£¬²¢¼ÆËãÆäÕýÈ·Ô¤²âµÄ²âÊÔʾÀýÊýÁ¿¡£ÕâÀïÎÒ½«Ö»Ìá¹©ÖØÒªµÄ²¿·Ö£¬´ó¼Ò¿ÉÒÔµã»÷´Ë´¦²é¿´ÍêÕû½Å±¾ÄÚÈÝ¡£
±¸×¢£º²âÊÔ¼¯µÄ½á¹û¾«È·¶È½«Ê¼ÖÕµÍÓÚѵÁ·¼¯µÄ½á¹û¾«È·¶È£¨ºóÕßΪ97%£©¡£²»¹ýÈç¹ûǰÕßÔ¶µÍÓÚºóÕߣ¬Ôò´ó¼ÒÓ¦¶Ô·ÖÀàÆ÷½øÐмì²é²¢¶ÔѵÁ·Á÷³Ì½øÐе÷Õû¡£ÎÒÃÇÔ¤¼Æ²âÊÔ¼¯µÄʵ¼Ê½á¹ûÓ¦¸ÃÔÚ95%×óÓÒ¡£ÈκεÍÓÚ90%µÄ¾«¶È½á¹û¶¼Ó¦ÒýÆðÖØÊÓ¡£
Óë֮ǰһÑù£¬ÕâÌ׽ű¾»áÊ×Ïȵ¼Èë±ØÒªÈí¼þ°ü£¬°üÀ¨À´×Ôscikit-learnµÄÖ¸±ê°üÒÔÊä³ö¸÷ÀàÆäËü±¨¸æ¡£µ±È»£¬ÕâÒ»´ÎÎÒÃÇÑ¡Ôñ¼ÓÔØ²âÊÔ¼¯¶ø²»ÔÙÊÇѵÁ·¼¯¡£
import numpy as np
import tensorflow as tf from sklearn
import metrics
X_test = np.load("X_test.npy")
y_test = np.load("y_test.npy") |
ΪÁ˼ÆËã²âÊÔ¼¯µÄ½á¹û¾«È·¶È£¬ÎÒÃÇÈÔÈ»ÐèÒª¼ÆËãͼ¡£²»¹ýÕâÒ»´Î²»ÔÙÐèÒªÍêÕûµÄ¼ÆËãͼ£¬ÒòΪtrain_opÓëlossÁ½¸öÓÃÓÚѵÁ·µÄ½ÚµãÕâÀï²»»á±»Óõ½¡£´ó¼Òµ±È»¿ÉÒÔÔÙ´ÎÊÖ¶¯½¨Á¢¼ÆËãͼ£¬µ«ÓÉÓÚ´ËǰÎÒÃÇÒѾ½«Æä±£´æÔÚgraph.pbÎļþµ±ÖУ¬Òò´ËÕâÀïÖ±½Ó¼ÓÔØ¼´¿É¡£ÒÔÏÂΪÏà¹Ø´úÂ룺
with tf.Session() as sess:
graph_file = os.path.join(checkpoint_dir, "graph.pb")
with tf.gfile.FastGFile(graph_file, "rb")
as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
tf.import_graph_def(graph_def, name="")
|
TensorFlow¿ÉÄܻὫÆäÊý¾Ý±£´æÎªÐÒ黺³åÎļþ£¨À©Õ¹ÃûΪ.pb£©£¬Òò´ËÎÒÃÇ¿ÉÒÔʹÓò¿·Öhelper´úÂëÒÔ¼ÓÔØ´ËÎļþ²¢½«Æä×÷Ϊ¼ÆËãͼµ¼ÈëÖÁ»á»°µ±ÖС£
½ÓÏÂÀ´£¬ÎÒÃÇÐèÒª´ÓcheckpointÎļþ´¦¼ÓÔØWÓëbµÄÖµ£º
W = sess.graph.get_tensor_by_name("model/W:0")
b = sess.graph.get_tensor_by_name("model/b:0")
checkpoint_file = os.path.join(checkpoint_dir,
"model")
saver = tf.train.Saver([W, b])
saver.restore(sess, checkpoint_file) |
ÕýÒòΪÈç´Ë£¬ÎÒÃÇÐèÒª½«½ÚµãÒýÈ뷶Χ²¢ÎªÆäÃüÃû£¬´Ó¶øÀûÓÃget_tensor_by_name()ÇáËÉÔٴν«ÆäÕÒµ½¡£Èç¹û´ó¼ÒûÓÐΪ½ÚµãÌṩÃ÷È·µÄÃû³Æ£¬Ôò¿ÉÄÜÐèÒªÈÏÕæ²éÔļÆËãͼ¶¨Òå²ÅÄÜÕÒµ½TensorFlowΪÆäĬÈÏ·ÖÅäµÄÃû³Æ¡£
ÎÒÃÇ»¹ÐèÒªÒýÓÃÆäËü¼¸¸ö½Úµã£¬ÌرðÊÇ×÷ΪÊäÈëÄÚÈݵÄxÓëyÒÔ¼°ÆäËü¸ºÔð½øÐÐÔ¤²âµÄ½Úµã£º
x = sess.graph.get_tensor_by_name ("inputs/x-input:0")
y = sess.graph.get_tensor_by_name ("inputs/y-input:0")
accuracy = sess.graph.get_tensor_by_name ("score/accuracy:0")
inference = sess.graph.get_tensor_by_name ("inference/inference:0")
|
ºÃµÄ£¬µ½ÕâÀïÎÒÃÇÒѾ½«¼ÆËãÍ¼ÖØÐ¼ÓÔØÖÁÄÚ´æµ±ÖС£ÎÒÃÇ»¹ÐèÒªÔٴν«·ÖÀàÆ÷ѧϰµ½µÄÄÚÈݼÓÔØÖÁWÓëbµ±ÖС£ÏÖÔÚÎÒÃÇÖÕÓÚ¿ÉÒÔ²âÊÔ·ÖÀàÆ÷ÔÚ´¦ÀíÆä֮ǰ´Óδ¼û¹ýµÄÊý¾Ýʱ±íÏÖ³öµÄ¾«È·¶ÈÁË£º
feed = {x: X_test, y: y_test}
print("Test set accuracy:", sess.run(accuracy,
feed_dict=feed)) |
ÉÏÊö´úÂë»áÔËÐÐaccuracy½Úµã²¢ÀûÓÃÀ´×ÔX_testÊý×éµÄÉùÑ§ÌØÕ÷×÷ΪÊäÈëÄÚÈÝ£¬Í¬Ê±Ê¹ÓÃÀ´×Ôy_testµÄ±êÇ©½øÐнá¹ûÑéÖ¤¡£
±¸×¢£ºÕâÒ»´Î£¬À¡Ëʹʵ䲻ÔÙÐèҪΪlearning_rateÓëregularizationռλ·ûÖ¸¶¨ÈκÎÖµ¡£ÎÒÃÇÖ»ÐèÒªÔÚaccuracy½ÚµãÉÏÔËÐмÆËãͼµÄÒ»²¿·Ö£¬ÇҴ˲¿·ÖÖв¢²»°üÀ¨ÕâЩռλ·û¡£
ÎÒÃÇ»¹¿ÉÒÔ½èÖúscikit-learnµÄ°ïÖúÏÔʾÆäËüһЩ±¨¸æ£º
predictions = sess.run (inference, feed_dict={x:
X_test})
print("Classification report:")
print(metrics.classification_report (y_test.ravel(),
predictions))
print("Confusion matrix:")
print(metrics.confusion_matrix (y_test.ravel(),
predictions)) |
ÕâÒ»´Î£¬ÎÒÃÇʹÓÃinference½ÚµãÒÔ»ñȡԤ²â½á¹û¡£ÓÉÓÚinferenceÖ»»á¼ÆËãÔ¤²â½á¹û¶ø²»»á¼ì²éÆä¾«È·¶È£¬Òò´ËÀ¡ËʹʵäÖнöÐèÒª°üº¬ÊäÈëÄÚÈÝx¶ø²»ÔÙÐèÒªy¡£
ÔËÐд˽ű¾Ö®ºó£¬´ó¼ÒÓ¦¸Ã»á¿´µ½ÀàËÆÓÚÒÔÏÂÄÚÈݵÄÊä³ö½á¹û£º
$ python3 test.py
Test set accuracy: 0.958991
Classification report:
precision recall f1-score support
0 0.98 0.94 0.96 474
1 0.94 0.98 0.96 477
avg / total 0.96 0.96 0.96 951
Confusion matrix:
[[446 28]
[ 11 466]] |
²âÊÔ¼¯µÄÔ¤²â¾«È·¶È½Ó½ü96%¡ª¡ªÓëÔ¤ÆÚÒ»Ñù£¬ÂÔµÍÓÚѵÁ·¼¯µÄ¾«È·¶È£¬µ«Ò²ÒѾÏ൱½Ó½ü¡£ÕâÒâζ×ÅÎÒÃǵÄѵÁ·ÒѾ»ñµÃ³É¹¦£¬ÇÒÎÒÃÇÒ²Ö¤Ã÷ÁËÕâÌ×·ÖÀàÆ÷Äܹ»ÓÐЧ´¦ÀíÆä´Óδ¼û¹ýµÄÊý¾Ý¡£Æäµ±È»»¹²»¹»ÍêÃÀ¡ª¡ªÃ¿25´Î³¢ÊÔÖм´ÓÐ1´ÎÊôÓÚ·ÖÀà´íÎ󣬵«¶ÔÓÚ±¾½Ì³ÌÀ´ËµÕâÒ»½á¹ûÒѾÍêÈ«ÁîÈËÂúÒâ¡£
·ÖÀ౨¸æÓë»ìÏý¾ØÕóÏÔʾÁËÓë´íÎóÔ¤²âÏà¹ØµÄʾÀýͳ¼ÆÐÅÏ¢¡£Í¨¹ý»ìÏý¾ØÕó£¬ÎÒÃÇ¿ÉÒÔ¿´µ½¹²ÓÐ446ÏîµÃµ½ÕýÈ·Ô¤²âµÄÅ®ÉùʾÀý£¬¶øÁíÍâ28ÏîÅ®ÉùʾÀýÔò±»´íÎóµØÅжÏΪÄÐÉù¡£ÔÚ466ÏîÄÐÉùʾÀýÖзÖÀàÆ÷¸ø³öÁËÕýÈ·½áÂÛ£¬µ«ÓÐ11ÏîÔò±»´íÎóÅжÏΪŮÉù¡£
ÕâÑù¿´À´£¬ÎÒÃǵķÖÀàÆ÷ËÆºõ²»Ì«Éó¤·Ö±æÅ®ÐÔµÄÓïÒô£¬ÒòΪÆäÅ®Éùʶ±ð´íÎóÂʸü¸ß¡£·ÖÀ౨¸æ/»Øµ÷Êý×ÖÒà¸ø³öÁËÏàͬµÄ½áÂÛ¡£
ÔÚiOSÉÏʹÓÃTensorFlow
ÏÖÔÚÎÒÃÇÒѾӵÓÐÁËÒ»Ì×¾¹ýѵÁ·µÄÄ£ÐÍ£¬ÆäÓµÓбȽÏÀíÏëµÄ²âÊÔ¼¯Ô¤²â¾«È·¶È¡£ÏÂÃæÎÒÃǽ«¹¹½¨Ò»¿î¼òµ¥µÄiOSÓ¦Ó㬲¢ÀûÓÃÕâÌ×Ä£ÐÍÔÚÆäÖÐʵÏÖÔ¤²âÄÜÁ¦¡£Ê×ÏÈ£¬ÎÒÃÇÀûÓÃTensorFlow
C++¿â¹¹½¨Ò»¿îÓ¦Óá£ÔÚÏÂÒ»Õ½ÚÖУ¬ÎÒÃǽ«°ÑÄ£ÐÍÒýÈëMetalÒÔ½øÐбȽϡ£
ÕâÀïÎÒÃǼÈÓкÃÏûÏ¢Ò²ÓлµÏûÏ¢¡£»µÏûÏ¢ÊÇ´ó¼ÒÐèÒªÀûÓÃÔ´´úÂë×ÔÐй¹½¨TensorFlow¡£ÊÂʵÉÏ£¬Çé¿öÏ൱Ôã¸â£º´ó¼ÒÐèÒª°²×°Java·½¿ÉʵÏÖÕâÏîÄ¿±ê¡£¶øºÃÏûÏ¢ÊÇÕû¸öÁ÷³ÌÆäʵ²¢²»¸´ÔÓ¡£¸ÐÐËȤµÄÅóÓÑ¿ÉÒÔµã»÷´Ë´¦²é¿´ÍêÕûÖ¸ÄÏ£¬µ«ÒÔϲ½ÖèÒ²»ù±¾Äܹ»°ïÖú´ó¼Ò½â¾öÎÊÌ⣨ÔÚTensorFlow
1.0ÉÏʵ²âÓÐЧ£©¡£
ÕâÀïÐèҪעÒâµÄÊÇ£¬´ó¼ÒÓ¦µ±°²×°Xcode 8£¬²¢È·±£»î¶¯¿ª·¢ÕßĿ¼ָÏòÄúXcodeµÄ°²×°Î»Öã¨Èç¹û´ó¼ÒÏȰ²×°ÁËHomebrew£¬Ëæºó²Å°²×°Xcode£¬ÔòÆä¿ÉÄÜÖ¸Ïò´íÎóλÖã¬Òâζ×ÅTensorFlow½«ÎÞ·¨Íê³É¹¹½¨£©£º
sudo xcode-select -s /Applications /Xcode.app/Contents/Developer
|
TensorFlowÀûÓÃÒ»¿îÃûΪbazelµÄ¹¤¾ß½øÐй¹½¨£¬bazelÔòÒªÇóÅäºÏJava
JDK 8¡£´ó¼Ò¿ÉÒÔÀûÓÃHomebrewÇáËɰ²×°±ØÒªµÄÈí¼þ°ü£º
brew cask install java brew install bazel brew
install automake brew install libtool |
ÔÚÍê³ÉÖ®ºó£¬´ó¼ÒÐèÒª¿Ë¡TensorFlow GitHub¿â¡£ÐèҪעÒâµÄÊÇ£ºÇëÈ·±£ÄúÖ¸¶¨µÄ·¾¶²»¾ß±¸³ä×ãµÄ¿Õ¼ä£¬·ñÔòbazel»á¾Ü¾ø½øÐй¹½¨£¨Ã»´í£¬ÕâÊÇÕæµÄ£¡£©¡£ÎÒÖ±½Ó½«Æä¿Ë¡µ½ÁË×Ô¼ºµÄÖ÷Ŀ¼µ±ÖУº
cd /Users/matthijs git clone https://github.com/tensorflow/tensorflow
-b r1.0 |
ÆäÖеÄ-b r1.0±ê¼Ç¸æÖªgit¿Ë¡r1.0·ÖÖ§¡£´ó¼Ò¿ÉÒÔËæÒâʹÓÃÆäËü¸üеķÖÖ§£¬»òÕßÑ¡ÔñʹÓÃmaster·ÖÖ§¡£
±¸×¢£ºÔÚMacOS SierraÉÏ£¬½ÓÏÂÀ´¼´½«ÔËÐеÄconfigure½Å±¾»áÌáʾ¶àÏî´íÎó¡£ÎªÁ˽â¾öÎÊÌ⣬ÎÒ²»µÃ²»Ñ¡Ôñ¿Ë¡master·ÖÖ§¡£ÔÚOS
X El CapitanÉÏ£¬Ê¹ÓÃr1.0·ÖÖ§Ôò²»»áÒý·¢ÈκδíÎó¡£
ÔÚ´úÂë¿â¿Ë¡Íê³Éºó£¬´ó¼ÒÐèÒªÔËÐÐconfigure½Å±¾¡£
cd tensorflow ./configure |
Æä»áÌá³ö¼¸¸öÎÊÌ⣬ÒÔÏÂΪÎÒ¸ø³öµÄ»Ø´ð£º
Please specify the location of python. [Default
is /usr/bin/python]: |
ÎҵĻشðÊÇ/usr/local/bin/python3£¬ÒòΪÎÒÏ£ÍûʹÓÃPython
3.6ÅäºÏTensorFlow¡£Èç¹û´ó¼ÒÑ¡ÔñĬÈÏÑ¡ÏÔòTensorFlow½«ÀûÓÃPython 2.7½øÐй¹½¨¡£
Please specify optimization flags to use during
compilation [Default is -march=native]: |
ÔÚÕâÀïÖ±½Ó°´Ï»سµ¼ü£¬½ÓÏÂÀ´µÄ¼¸¸öÎÊÌâÔòÈ«²¿°´nÑ¡Ôñ·ñ¡£
ÔÚÆäÎʼ°ÒªÊ¹ÓÃÄÄÌ×Python¿âʱ£¬°´Ï»سµÒÔÑ¡ÔñĬÈÏÑ¡Ï¼´Python 3.6¿â£©¡£
½ÓÏÂÀ´µÄÎÊÌâÈ«²¿°´nÑ¡Ôñ·ñ¡£ÏÖÔڸýű¾½«ÏÂÔØ¼¸ÏîÒÀÀµÐÔÏîÄ¿²¢Îª¹¹½¨TensorFlow×öºÃ×¼±¸¡£
¹¹½¨¾²Ì¬¿â
ÎÒÃÇ¿ÉÒÔͨ¹ýÒÔÏÂÁ½ÖÖ·½Ê½¹¹½¨TensorFlow£º
ÔÚMacϵͳÉÏ£¬Ê¹ÓÃbazel¹¹½¨¹¤¾ß¡£ÔÚiOSÉÏʹÓÃMakefile¡£
ÓÉÓÚÎÒÃÇÐèÒªÃæÏòiOS½øÐй¹½¨£¬Òò´ËÑ¡ÔñÑ¡Ïî¶þ¡£È»¶ø£¬ÎÒÃÇ»¹ÐèÒª¹¹½¨ÆäËüһЩ¹¤¾ß£¬Òò´ËÒ²µÃÉæ¼°Ñ¡ÏîÒ»µÄÄÚÈÝ¡£
ÔÚtensorflowĿ¼ÏÂÖ´ÐÐÒÔϽű¾£º
tensorflow/contrib/makefile/build_all_ios.sh |
Æä»áÊ×ÏÈÏÂÔØÒ»Ð©ÒÀÀµÐÔÑ¡Ï¶øºó¿ªÊ¼½øÐй¹½¨Á÷³Ì¡£Èç¹ûÒ»ÇÐ˳Àû£¬Æä½«´´½¨³öÈýÌ×½ÓÈëÓ¦ÓÃËù±ØÐèµÄ¾²Ì¬¿â£¬·Ö±ðΪ:
libtensorflow-core.a¡¢libprotobuf.a¡¢libprotobuf-lite.a¡£
¾¯¸æ£º¹¹½¨ÕâЩ¿âÐèÒªÒ»¶Îʱ¼ä¡ª¡ªÎÒµÄiMacÐèÒª25·ÖÖÓ£¬»úÐͽϾɵÄMacBook ProÔòÐèÒª3¸öСʱ£¬¶øÇÒÕû¸ö¹ý³ÌÖзçÉÈÒ»Ö±ÔÚÈ«Á¦ÔËת£¡´ó¼Ò¿ÉÄÜ»áÔÚ¹ý³ÌÖп´µ½Ò»Ð©±àÒëÆ÷¾¯¸æÉõÖÁ´íÎóÌáʾÐÅÏ¢Ò»Ïжø¹ý¡£µ±×÷û¿´¼û¾ÍºÃ£¬Ê±¼äÒ»µ½¹¤×÷×ÔÈ»¾ÍÐ÷£¡
µ½ÕâÀ﹤×÷»¹Ã»½áÊø¡£ÎÒÃÇ»¹ÐèÒª¹¹½¨ÆäËüÁ½¿îhelper¹¤¾ß¡£ÔÚÖն˵±ÖÐÔËÐÐÒÔÏÂÁ½ÌõÃüÁ
bazel build tensorflow/python/tools:freeze_graph
bazel build tensorflow/python/tools:optimize_for_inference
|
×¢Ò⣺ÕâÒ»¹ý³Ì´óÔ¼ÐèÒª20·ÖÖÓ×óÓÒ£¬ÒòΪÆäÐèÒªÔٴδÓÁ㿪ʼ¹¹½¨TensorFLow£¨ÕâÒ»´ÎʹÓÃbazel£©¡£
±¸×¢£ºÈç¹û´ó¼ÒÔÚ¹ý³ÌÖÐÓöµ½ÁËÎÊÌ⣬Çëµã»÷´Ë´¦²ÎÔĹٷ½Ö¸ÄÏ¡£
ΪMacÉ豸¹¹½¨TensorFlow
Õⲿ·ÖÄÚÈÝΪ¿ÉÑ¡ÏîÄ¿£¬µ«ÓÉÓÚ´ó¼ÒÒѾ°²×°ÁËÈ«²¿±ØÒªÈí¼þ°ü£¬Òò´ËΪMacϵͳ¹¹½¨TensorFlow²¢²»À§ÄÑ¡£Æä»á´´½¨Ò»¸öеÄpipÈí¼þ°ü£¬´ó¼Ò¿É½øÐа²×°ÒÔÈ¡´ú¹Ù·½TensorFlowÈí¼þ°ü¡£
Ϊʲô²»Ê¹Óùٷ½Èí¼þ°ü£¿ÒòΪÕâÑùÎÒÃDzÅÄÜ´´½¨Ò»Ì×°üº¬×Ô¶¨ÒåÑ¡ÏîµÄTensorFlow°æ±¾¡£¾ÙÀýÀ´Ëµ£¬Èç¹û´ó¼ÒÔÚÔËÐÐtrain.py½Å±¾Ê±Óöµ½ÁË¡°´ËTensorFlow¿âÎÞ·¨ÀûÓÃSSE4.1Ö¸Áî½øÐбàÒ롱µÄ¾¯¸æÌáʾ£¬Ôò¿É±àÒëÒ»Ì×ÌØÊâµÄTensorFLow°æ±¾ÒÔÆôÓÃÕâЩָÁî¡£
ҪΪMacϵͳ¹¹½¨TensorFlow£¬ÇëÔÚÖÕ¶ËÖÐÔËÐÐÒÔÏÂÃüÁ
bazel build --copt=-march=native -c opt //tensorflow/tools/pip_package:build_pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package
/tmp/tensorflow_pkg |
ÆäÖеÄ-march=nativeÑ¡ÏîÓÃÓÚÔÚÄúµÄCPUÄܹ»Ö§³ÖµÄǰÌáÏ£¬Ìí¼Ó¶ÔSSE¡¢AVX¡¢AVX2ÒÔ¼°FMAµÈµÄÖ§³Ö¡£
Ëæºó°²×°¸ÃÈí¼þ°ü£º
pip3 uninstall tensorflow sudo -H pip3 install
/tmp/tensorflow_pkg/tensorflow-1.0.0-XXXXXX.whl
|
ÓûÁ˽â¸ü¶àϸ½ÚÐÅÏ¢£¬Çëµã»÷´Ë´¦²ÎÔÄTensorFlow¹Ù·½ÍøÕ¾¡£
¡°¶³½á¡±¼ÆËãͼ
ÎÒÃǽ«Òª´´½¨µÄiOSÓ¦Óý«ÀûÓÃPython½Å±¾¼ÓÔØÖ®Ç°ÑµÁ·Íê³ÉµÄÄ£ÐÍ£¬²¢ÀûÓÃÆä×÷³öһϵÁÐÔ¤²â¡£
´ó¼ÒÓ¦¸Ã»¹¼ÇµÃ£¬train.py½«¼ÆËãͼ¶¨Òå±£´æÔÚÁË/tmp/voice/graph.pbÎļþµ±ÖС£Òź¶µÄÊÇ£¬´ó¼ÒÎÞ·¨Ö±½Ó½«¸Ã¼ÆËãͼ¼ÓÔØÖÁiOSÓ¦Óõ±ÖС£ÍêÕûµÄ¼ÆËãͼÖаüº¬µÄ²Ù×÷Ŀǰ»¹²»ÊÜTensorFlow
C++ APIµÄÖ§³Ö¡£ÕýÒòΪÈç´Ë£¬ÎÒÃDzÅÐèҪʹÓøոչ¹½¨Íê³ÉµÄÆäËüÁ½¿î¹¤¾ß¡£ÆäÖÐfreeze_graph¸ºÔð»ñÈ¡graph.pbÒÔ¼°°üº¬ÓÐWÓëbѵÁ·½á¹ûÖµµÄcheckpointÎļþ¡£Æä»¹»áÒÆ³ýÒ»ÇÐÔÚiOSÖ®Éϲ»ÊÜÖ§³ÖµÄ²Ù×÷¡£
ÔÚÖն˵±ÖÐÁ¢×ãtensorflowĿ¼ÔËÐиù¤¾ß£º
bazel-bin/tensorflow/python/tools/freeze_graph
\
--input_graph=/tmp/voice/graph.pb --input_checkpoint=/tmp/voice/model
\
--output_node_names=model/y_pred,inference/inference
--input_binary \
--output_graph=/tmp/voice/frozen.pb |
ÒÔÉÏÃüÁÔÚ/tmp/voice/frozen.pbµ±Öд´½¨Ò»Ì×¾¹ý¼ò»¯µÄ¼ÆËãͼ£¬Æä½ö¾ß±¸y_predÓëinferenceÁ½¸ö½Úµã¡£Æä²¢²»°üº¬ÈκÎÓÃÓÚѵÁ·µÄ¼ÆËãͼ½Úµã¡£
ʹÓÃfreeze_graphµÄºÃ´¦ÔÚÓÚ£¬Æä»¹½«¹Ì¶¨¸ÃÎļþÖеÄÈ¨ÖØÖµ£¬ÕâÑù´ó¼Ò¾ÍÎÞÐè·Ö±ð½øÐÐÈ¨ÖØÖµ¼ÓÔØÁË£ºfrozen.pbÖÐÒѾ°üº¬ÎÒÃÇÐèÒªµÄÒ»ÇС£¶øoptimize_for_inference¹¤¾ßÔò¸ºÔð¶Ô¼ÆËãͼ½øÐнøÒ»²½¼ò»¯¡£Æä½«×÷Ϊgrozen.pbÎļþµÄÊäÈëÄÚÈÝ£¬²¢Ð´Èë/tmp/voice/inference.pb×÷ΪÊä³ö½á¹û¡£ÎÒÃÇËæºó»á½«´ËÎļþǶÈëÖÁiOSÓ¦Óõ±ÖС£Ê¹ÓÃÒÔÏÂÃüÁîÔËÐиù¤¾ß£º
bazel-bin/tensorflow/python/tools/optimize_for_inference
\
--input=/tmp/voice/frozen.pb --output=/tmp/voice/inference.pb
\ --input_names=inputs/x --output_names=model/y_pred,inference/inference
\ --frozen_graph=True |
iOSÓ¦ÓÃ
´ó¼Ò¿ÉÒÔÔÚgithub.com/hollance/TensorFlow-iOS-ExampleÖеÄVoiceTensorFlowÎļþ¼ÐÄÚÕÒµ½ÎÒÃÇ´Ë´ÎʹÓõÄiOSÓ¦Óá£
ÔÚXcodeµ±Öдò¿ª¸ÃÏîÄ¿£¬ÆäÖаüº¬ÒÔϼ¸Ìõ×¢ÒâÊÂÏ
´ËÓ¦ÓÃÀûÓÃObjective-C++±àд£¨ÆäÔ´ÎļþÀ©Õ¹ÃûΪ.mm£©¡£ÔÚ±àдʱÉв»´æÔÚÃæÏòTensorFlowµÄSwift
API£¬Òò´ËÖ»ÄÜʹÓÃC++¡£
ÆäÖеÄinference.pbÎļþÒѾ°üº¬ÔÚÏîÄ¿µ±ÖС£Èç¹ûÐèÒª£¬´ó¼ÒÒ²¿ÉÒÔÖ±½Ó½«×ÔÓа汾µÄinference.pb¸´ÖƵ½´ËÏîÄ¿µÄÎļþ¼ÐÖ®ÄÚ¡£
´ËÓ¦ÓÃÓëAccelerate.frameworkÏàÁ´½Ó¡£
´ËÓ¦ÓÃÓëÎÒÃÇ´ËǰÒѾ±àÒëÍê³ÉµÄ¼¸Ì×¾²Ì¬¿âÏàÁ´½Ó¡£
ǰÍùProject Settings£¨ÏîÄ¿ÉèÖã©ÆÁÄ»²¢Çл»ÖÁBuild Settings£¨¹¹½¨ÉèÖ㩱êÇ©¡£ÔÚOther
Linker Flags£¨ÆäËüÁ´½Ó±ê¼Ç£©Ï£¬´ó¼Ò»á¿´µ½ÒÔÏÂÄÚÈÝ£º
/Users/matthijs/tensorflow/tensorflow/contrib /makefile/gen/protobuf_ios/lib/
libprotobuf-lite.a /Users/matthijs/tensorflow/tensorflow/contrib /makefile/gen/protobuf_ios/lib/
libprotobuf.a -force_load /Users/matthijs/tensorflow/tensorflow/contrib /makefile/gen/lib/
libtensorflow-core.a |
³ý·ÇÄúµÄÃû³ÆÍ¬ÑùΪ¡°matthijs¡±£¬·ñÔò´ó¼ÒÐèÒª½«ÆäÌæ»»ÎªÄúTensorFlow¿âµÄʵ¼Ê¿Ë¡·¾¶¡££¨Çë×¢Ò⣬ÕâÀïtensorflow³öÏÖÁËÁ½´Î£¬ËùÒÔÎļþ¼ÐÃû³ÆÓ¦Îªtensorflow/tensorflow/...£©
±¸×¢£º´ó¼ÒÒ²¿ÉÒÔ½«ÕâÈý¸ö.aÎļþ¸´ÖƵ½ÏîÄ¿Îļþ¼ÐÖ®ÄÚ£¬Èç´Ë¼´²»±Øµ£ÐÄ·¾¶¿ÉÄܳöÏÖÎÊÌâ¡£ÎÒ¸öÈ˲¢²»´òËãÔÚÕâһʾÀýÏîÄ¿ÖвÉÈ¡ÕâÖÖ·½Ê½£¬ÒòΪlibtensorflow-core.aÎļþÊÇÒ»Ì×Ìå»ý´ï440
MBµÄ¿â¡£
ÁíÍâÇë×¢Òâ¼ì²éHeader Search Paths£¨±êÌâËÑË÷·¾¶£©¡£ÒÔÏÂΪĿǰµÄÉèÖãº
~/tensorflow ~/tensorflow/tensorflow /contrib/makefile/downloads
~/tensorflow /tensorflow/contrib/makefile/downloads/eigen
~/tensorflow/tensorflow/contrib/makefile /downloads/protobuf/src
~/tensorflow /tensorflow/contrib/makefile/gen/proto
|
ÁíÍ⣬´ó¼Ò»¹ÐèÒª½«Æä¸üÐÂÖÁÄúµÄ¿Ë¡Ŀ¼µ±ÖС£
ÒÔÏÂΪÎÒÔÚ¹¹½¨ÉèÖõ±ÖнøÐÐÁËÐÞ¸ÄµÄÆäËüÌõÄ¿£º
Enable Bitcode: No
Warnings / Documentation Comments: No
Warnings / Deprecated Functions: No |
ĿǰÉв»ÊÜTensorFLowµÄÖ§³Ö£¬ËùÒÔÎÒ¾ö¶¨½«Æä½ûÓá£ÎÒ»¹¹Ø±ÕÁ˾¯¸æÑ¡Ï·ñÔòÔÚ±àÒëÓ¦ÓÃʱ»á³öÏÖÒ»´óƱÎÊÌâÌáʾ¡££¨½ûÓÃÖ®ºó£¬´ó¼ÒÈÔÈ»»áÓöµ½¼¸Ïî¹ØÓÚֵת»»ÎÊÌâµÄ¾¯¸æ¡£´ó¼Òµ±È»Ò²¿ÉÒÔ½«ÆäÒ»²¢½ûÓ㬵«ÎÒ¸öÈË»¹ÊÇÏ£Íû¶àÉÙÁ˽âÒ»µãÆäÖеĴíÎó¡££©
ÔÚÍê³ÉÁ˶ÔOther Linker FlagsÓëHeader Search PathsµÄ±ä¸üÖ®ºó£¬´ó¼Ò¼´¿É¹¹½¨²¢ÔËÐÐÎÒÃǵÄiOSÓ¦Óá£
ºÜºÃ£¬ÏÖÔÚ´ó¼ÒÒѾӵÓÐÁËÒ»¿îÄܹ»Ê¹ÓÃTensorFlowµÄiOSÓ¦ÓÃÁË£¡ÏÂÃæÈÃÎÒÃÇ¿´¿´ËüµÄʵ¼ÊÔËÐÐЧ¹û¡£
ʹÓà TensorFlow C++ API
TensorFlow for iOSÓÉC++±àд¶ø³É£¬µ«ÆäÖÐÐèÒª±àдµÄC++´úÂëÁ¿Æäʵ¡ª¡ªÐÒÔ˵ÄÊÇ¡ª¡ª²¢²»¶à¡£Ò»°ãÀ´½²£¬´ó¼ÒÖ»ÐèÒªÍê³ÉÒÔϹ¤×÷£º
´Ó.pbÎļþÖмÓÔØ¼ÆËãͼÓëÈ¨ÖØÖµ¡£
ÀûÓô˼ÆËãͼ´´½¨Ò»Ïî»á»°¡£
½«ÄúµÄÊý¾Ý·ÅÖÃÔÚÒ»¸öÊäÈëÕÅÁ¿ÄÚ¡£
ÔÚÒ»¸ö»òÕß¶à¸ö½ÚµãÉÏÔËÐмÆËãͼ¡£
´ÓÊä³ö½á¹ûÕÅÁ¿ÖлñÈ¡½á¹û¡£
ÔÚ±¾Ê¾ÀýÓ¦Óõ±ÖУ¬ÕâÒ»ÇнԷ¢ÉúÔÚViewController.mmÖ®ÄÚ¡£Ê×ÏÈ£¬ÎÒÃǼÓÔØ¼ÆËãͼ£º
- (BOOL)loadGraphFromPath:(NSString *)path
{
auto status = ReadBinaryProto (tensorflow::Env::Default(),
path.fileSystemRepresentation, &graph);
if (!status.ok()) {
NSLog(@"Error reading graph: %s", status.error_message().c_str());
return NO;
}
return YES;
} |
´ËXcodeÏîÄ¿µ±ÖÐÒѾ°üº¬ÎÒÃÇͨ¹ýÔÚgraph.pbÉÏÔËÐÐfreeze_graphÓëoptimize_for_inference¹¤¾ßËù¹¹½¨µÄinference.pb¼ÆËãͼ¡£Èç¹û´ó¼ÒÏ£ÍûÖ±½Ó¼ÓÔØgraph.pb£¬Ôò»áµÃµ½ÒÔÏ´íÎóÐÅÏ¢£º
Error adding graph to session: No OpKernel was
registered to support Op 'L2Loss' with these attrs.
Registered devices: [CPU], Registered kernels:
<no registered kernels> [[Node: loss-function/L2Loss
= L2Loss[T=DT_FLOAT](model/W/read)]] |
ÕâÊÇÒòΪC++ APIËùÄÜÖ§³ÖµÄ²Ù×÷ÒªÔ¶ÉÙÓÚPython API¡£ÕâÀïÌáµ½ÎÒÃÇÔÚlossº¯Êý½ÚµãÖÐËùʹÓõÄL2Loss²Ù×÷ÔÚiOSÉϲ¢²»ÊÊÓá£ÕýÒòΪÈç´Ë£¬ÎÒÃDzÅÐèÒªÀûÓÃfreeze_graphÒÔ¼ò»¯×Ô¼ºµÄ¼ÆËãͼ¡£
ÔÚ¼ÆËãͼ¼ÓÔØÍê³ÉÖ®ºó£¬ÎÒÃÇʹÓÃÒÔÏÂÃüÁî´´½¨Ò»Ïî»á»°£º
- (BOOL)createSession
{
tensorflow::SessionOptions options;
auto status = tensorflow::NewSession(options,
&session);
if (!status.ok()) {
NSLog(@"Error creating session: %s",
status.error_message().c_str());
return NO;
}
status = session->Create(graph);
if (!status.ok()) {
NSLog(@"Error adding graph to session:
%s",
status.error_message().c_str());
return NO;
}
return YES;
} |
»á»°´´½¨Íê³Éºó£¬ÎÒÃÇ¿ÉÒÔÀûÓÃÆäÖ´ÐÐÔ¤²â²Ù×÷¡£ÆäÖеÄpredict:method»áÌṩһ¸ö°üº¬20ÏµãÊýÖµµÄÊý×顪¡ª¼´ÉùÑ§ÌØÕ÷¡ª¡ª²¢½«ÕâЩÊý×ÖÀ¡ËÍÖÁ¼ÆËãµÃÒâÑóÑó·¢ÖС£
ÏÂÃæÎÒÃÇÒ»ÆðÀ´¿´´Ë·½·¨µÄ¹¤×÷·½Ê½£º
- (void)predict:(float *)example {
tensorflow::Tensor x(tensorflow::DT_FLOAT,
tensorflow::TensorShape({ 1, 20 }));
auto input = x.tensor<float, 2>();
for (int i = 0; i < 20; ++i) {
input(0, i) = example[i];
} |
ÆäÊ×ÏȽ«ÕÅÁ¿x¶¨ÒåΪÎÒÃÇÐèҪʹÓõÄÊäÈëÊý¾Ý¡£´ËÕÅÁ¿Îª{1£¬20}£¬ÒòΪÆäÒ»´ÎÌáȡһÏîʾÀýÇÒ¸ÃʾÀýÖаüº¬20ÏîÌØÕ÷¡£ÔÚ´ËÖ®ºó£¬ÎÒÃǽ«Êý¾ÝÓÉfloat
*Êý×鏴֯ÖÁ¸ÃÕÅÁ¿µ±ÖС£
½ÓÏÂÀ´£¬ÎÒÃÇÔËÐиÃÏî»á»°£º
std::vector<std::pair<std::string, tensorflow::Tensor>>
inputs = {
{"inputs/x-input", x}
};
std::vector<std::string> nodes = {
{"model/y_pred"},
{"inference/inference"}
};
std::vector<tensorflow::Tensor> outputs;
auto status = session->Run(inputs, nodes,
{}, &outputs);
if (!status.ok()) {
NSLog(@"Error running model: %s",
status.error_message().c_str());
return;
} |
ÕâÀïµÃ³öÁËÀàËÆÓÚPython´úÂëµÄÄÚÈÝ£º
pred, inf = sess.run([y_pred, inference], feed_dict={x:
example}) |
Ö»ÊDz»ÄÇô¼ò½à¡£ÎÒÃÇÐèÒª´´½¨À¡Ëʹʵ䡢ÓÃÓÚÁгöÐèÒªÔËÐеÄÈ«²¿½ÚµãµÄÏòÁ¿£¬Íâ¼ÓÒ»¸ö¸ºÔðÈÝÄɶÔÓ¦½á¹ûµÄÏòÁ¿¡£×îºó£¬ÎÒÃǸæÖª¸Ã»á»°Íê³ÉÉÏÊöÈÎÎñ¡£
ÔڻỰÔËÐÐÁËÈ«²¿±ØÒª½Úµãºó£¬ÎÒÃǼ´¿ÉÊä³öÒÔϽá¹û£º
auto y_pred = outputs[0].tensor<float, 2>();
NSLog(@"Probability spoken by a male: %f%%",
y_pred(0, 0));
auto isMale = outputs[1].tensor<float,
2>();
if (isMale(0, 0)) {
NSLog(@"Prediction: male");
} else {
NSLog(@"Prediction: female");
}
} |
³öÓÚÑÝʾÐèÇó£¬Ö»ÐèÒªÔËÐÐinference½Úµã¼´¿ÉÍê³É¶ÔÒôƵÊý¾ÝµÄÄÐÉù/Å®ÉùÅжϡ£²»¹ýÎÒ»¹Ï£Íû²é¿´¼ÆËãµÃ³öµÄ¸ÅÂÊ£¬Òò´ËÕâÀïÎÒÒ²ÔËÐÐÁËy_pred½Úµã¡£
ÔËÐÐiOSÓ¦ÓÃ
´ó¼Ò¿ÉÒÔÔÚiPhoneÄ£ÄâÆ÷»òÕßʵ»úÖ®ÉÏÔËÐÐÕâ¿îÓ¦Óá£ÔÚÄ£ÄâÆ÷ÉÏ£¬´ó¼ÒÈÔÈ»»á¿´µ½¡°´ËTensorFlow¿âÎÞ·¨ÀûÓÃSSE4.1Ö¸Áî½øÐбàÒ롱µÄÌáʾ£¬µ«ÔÚʵ»úÉÏÔò²»»á³öÏÖÕâÑùµÄÎÊÌâ¡£
³öÓÚ²âÊÔµÄÄ¿µÄ£¬Õâ¿îÓ¦ÓÃÖ»»á½øÐÐÁ½ÏîÔ¤²â£ºÒ»´ÎΪÄÐÉùʾÀýÔ¤²â£¬Ò»´ÎΪŮÉùʾÀýÔ¤²â¡££¨ÎÒÖ±½Ó´Ó²âÊÔ¼¯ÖÐÌáÈ¡Á˶ÔӦʾÀý¡£´ó¼ÒÒ²¿ÉÒÔÅäºÏÆäËüʾÀý²¢ÐÞ¸ÄmaleExample»òÕßemaleExampleÊý×éµ±ÖеÄÊý×Ö¡££©
ÔËÐÐÕâ¿îÓ¦Ó㬴ó¼ÒÓ¦¸Ã»á¿´µ½ÒÔÏÂÊä³ö½á¹û¡£¸ÃÓ¦ÓÃÊ×Ïȸø³öÁ˼ÆËãͼµ±Öеĸ÷½Úµã£º
Node count: 9
Node 0: Placeholder 'inputs/x-input'
Node 1: Const 'model/W'
Node 2: Const 'model/b'
Node 3: MatMul 'model/MatMul'
Node 4: Add 'model/add'
Node 5: Sigmoid 'model/y_pred'
Node 6: Const 'inference/Greater/y'
Node 7: Greater 'inference/Greater'
Node 8: Cast 'inference/inference' |
ÐèҪעÒâµÄÊÇ£¬´Ë¼ÆËãͼÖнö°üº¬ÊµÊ©Ô¤²âËù±ØÐèµÄ²Ù×÷£¬¶ø²»°üÀ¨ÈκÎÓëѵÁ·Ïà¹ØµÄÄÚÈÝ¡£
´Ëºó£¬Æä»áÊä³öÔ¤²â½á¹û£º
Probability spoken by a male: 0.970405% Prediction:
male Probability spoken by a male: 0.005632% Prediction:
female |
Èç¹û´ó¼ÒÀûÓÃPython½Å±¾³¢ÊÔʹÓÃͬÑùµÄʾÀý£¬ÄÇô½á¹ûÒ²½«ÍêȫһÖ¡£ÈÎÎñÍê³É£¡
±¸×¢£ºÕâÀïÒªÌáÐÑ´ó¼Ò£¬´ËÏîÑÝʾÏîÄ¿ÖÐÎÒÃǶÔÊý¾Ý½øÐÐÁË¡°Î±Ô족£¨¼´Ê¹ÓÃÁËÌáÈ¡×Ô²âÊÔ¼¯ÖеÄʾÀý£©¡£Èç¹û´ó¼ÒÏ£ÍûÀûÓÃÕâÌ×Ä£ÐÍ´¦ÀíÕæÕýµÄÒôƵ£¬ÔòÊ×ÏÈÐèÒª½«¶ÔÓ¦ÒôƵת»¯Îª20ÏîÉùÑ§ÌØÕ÷¡£
iOSƽ̨ÉÏTensorFlowµÄÓÅÊÆÓëȱµã
TensorFlowÊÇÒ»¿î³öÉ«µÄ»úÆ÷ѧϰģÐÍѵÁ·¹¤¾ß£¬ÌرðÊǶÔÓÚÄÇЩ²»Î·Êýѧ¼ÆËã²¢ÀÖÓÚ´´½¨ÐÂÐÍËã·¨µÄÅóÓÑ¡£Òª¶Ô¹æÄ£¸ü´óµÄÄ£ÐͽøÐÐѵÁ·£¬´ó¼ÒÉõÖÁ¿ÉÒÔÔÚÔÆ»·¾³ÏÂʹÓÃTensorFLow¡£
³ýÁËѵÁ·Ö®Í⣬±¾Æª²©ÎÄ»¹½éÉÜÁËÈçºÎ½«TensorFLowÌí¼ÓÖÁÄúµÄiOSÓ¦Óõ±ÖС£¶ÔÓÚÕâÒ»²¿·Ö£¬ÎÒÏ£Íû¸ÅÀ¨ÕâÖÖ×÷·¨µÄÓÅÊÆÓëȱµã¡£
ÔÚiOSÖ®ÉÏʹÓÃTensorFlowµÄÓÅÊÆ£º
ʹÓÃÒ»¿î¹¤¾ß¼´¿ÉʵÏÖÈ«²¿Ô¤ÆÚ¡£´ó¼Ò¿ÉÒÔͬʱÀûÓÃTensorFlowѵÁ·Ä£ÐͲ¢½«ÆäÒýÓÃÓÚÉ豸֮ÉÏ¡£ÎÒÃDz»ÔÙÐèÒª½«×Ô¼ºµÄ¼ÆËãÍ¼ÒÆÖ²ÖÁBNNS»òÕßMetalµÈÆäËüAPI´¦¡£ÔÚÁíÒ»·½Ã棬´ó¼ÒÔò±ØÐëÖÁÉÙ½«²¿·ÖPython´úÂë¡°ÒÆÖ²¡±ÎªC++ÐÎʽ¡£
TensorFlowÓµÓÐÖڶ೬ԽBNNS»òMetalµÄ³öÉ«¹¦ÄÜÌØÐÔ¡£
´ó¼Ò¿ÉÒÔÔÚÄ£ÄâÆ÷ÉÏ¶ÔÆä½øÐвâÊÔ¡££¨MetalÒªÇóÓû§Ê¼ÖÕÀûÓÃʵ»ú½øÐвâÊÔ¡££©
ÔÚiOSÉÏʹÓÃTensorFLowµÄȱµã£º
ĿǰÆäÉв»Ö§³ÖGPU¡£TensorFlowȷʵÄܹ»ÀûÓÃAcclerate¿ò¼ÜÒÔ·¢»ÓCPUµÄÏòÁ¿Ö¸ÁîÓÅÊÆ£¬µ«ÔÚÔʼ´¦ÀíËÙ¶ÈÉÏÈÔÎÞ·¨ÓëMetalÏàÌá²¢ÂÛ¡£
TensorFLow APIΪC++£¬Òò´Ë´ó¼ÒÐèҪʹÓÃObjective-C++×ÔÐбàд´úÂë¡£
´ó¼ÒÎÞ·¨Ö±½ÓÀûÓÃSwiftʹÓÃTensorFLow¡£C++ APIÏà½ÏÓÚPython API´æÔÚ¸ü¶à¾ÖÏÞÐÔ¡£ÕâÒâζ×Å´ó¼ÒÎÞ·¨ÔÚÉ豸֮ÉϽøÐÐÊý¾ÝѵÁ·£¬ÒòΪ·´Ïò´«²¥ËùÐèÒªµÄ×Ô¶¯ÌݶȼÆËãÉв»ÊÜÉ豸֧³Ö¡£µ«Õâ²¢²»ÊÇʲô´óÎÊÌ⣬±Ï¾¹Òƶ¯É豸µÄÓ²¼þ±¾Éí¾Í²»ÊʺϽøÐдó¹æÄ£Êý¾Ý¼¯ÑµÁ·¡£
TensorFlow¾²Ì¬¿âµÄ¼ÓÈë»áÁîÓ¦ÓÃÌå»ýÔö¼ÓÔ¼40 MB¡£´ó¼Ò¿ÉÒÔͨ¹ý¼õÉÙÊÜÖ§³Ö²Ù×÷µÄÊýÁ¿¶ÔÆä½øÐÐÊÝÉí£¬µ«¾ßÌå¹ý³ÌÏ൱Âé·³¡£ÁíÍâÕ⻹²»°üº¬ÄúÄ£Ðͱ¾ÌåµÄÌå»ý£¬Õâ¿ÉÄÜ»áÈÃÓ¦ÓÃ³ß´ç½øÒ»²½ÅòÕÍ¡£
¾Í¸öÈËÀ´½²£¬ÎÒÈÏΪÔÚiOSÉÏʹÓÃTensorFlow²¢Ã»ÓÐʲôÐԼ۱ȿÉÑÔ¡ª¡ªÖÁÉÙ¾ÍĿǰ¶øÑÔÊÇÈç´Ë¡£ÆäÓÅÊÆ¸ù±¾ÎÞ·¨µÖÏûÖÂÃüµÄȱµã¡£²»¹ý×÷Ϊһ¿îÄêÇáµÄ²úÆ·£¬ÎÒÏàÐÅTensorFLowδÀ´»áµÃµ½½øÒ»²½¸ÄÉÆ¡¡
±¸×¢£ºÈç¹û´ó¼Ò¾ö¶¨ÔÚ×Ô¼ºµÄiOSÓ¦Óõ±ÖÐʹÓÃTensorFlow£¬ÔòÓ¦Òâʶµ½ÈËÃÇÍêÈ«¿ÉÒÔÖ±½Ó´ÓÓ¦ÓðüÖи´ÖƼÆËãͼµÄ.pbÎļþÒÔÇÔÈ¡ÄúµÄÄ£ÐÍ¡£ËäÈ»Õâ¸öÎÊÌâ²»½ö´æÔÚÓÚTensorFlowµ±ÖУ¬µ«ÓÉÓÚ¡°¶³½á¡±¼ÆËãͼÎļþÖÐͬʱ°üº¬Ä£ÐͲÎÊýÓë¼ÆËãͼ¶¨Ò壬Òò´Ë¶Ô·½Äܹ»ÇáËÉÍê³ÉÄæÏò¹¤³Ì¡£Èç¹ûÄúµÄÄ£Ðͽ«×÷ΪӦÓñ¾ÉíµÄºËÐľºÕùÓÅÊÆ´æÔÚ£¬ÄÇôÇëÎñ±ØÏë°ì·¨¶ÔÆä¼ÓÒÔ±£»¤ÒÔ±ÜÃâÊܵ½¶ñÒâ¿ú̽¡£
ÔÚGPUÉÏÔËÐУºÊ¹ÓÃMetal
ÔÚiOSÖ®ÉÏʹÓÃTensorFLowµÄÒ»´óȱµãÔÚÓÚ£¬ÆäÔËÐÐÔÚCPUÖ®ÉÏ¡£ËäÈ»¶ÔÓÚÊý¾ÝÓëÄ£Ð͹æÄ£½ÏСµÄTensorFlowÏîÄ¿¶øÑÔ£¬CPUµÄ´¦ÀíÄÜÁ¦ÒѾÍêÈ«×ã¹»£¬µ«¶ÔÓڽϴóµÄÄ£ÐÍ¡¢ÌرðÊÇÉî¶ÈѧϰÏîÄ¿¶øÑÔ£¬´ó¼ÒÎÞÒÉÐèÒªÀûÓÃGPU½øÐÐÏà¹ØÔËËã¡£¶øÔÚiOSϵͳÉÏ£¬ÕâÒâζ×ÅÎÒÃDZØÐëÑ¡ÔñMetal¡£
´ó¼ÒÈÔÈ»ÐèÒªÔÚ×Ô¼ºµÄMacÉ豸ÉÏÀûÓÃTensorFlow½øÐÐѵÁ·¡ª¡ª»òÕßʹÓÃÆäËüÓµÓÐÇ¿´óGPUµÄLinuxÉ豸ÉõÖÁÔÆ×ÊÔ´¡ª¡ª²»¹ýÔËÐÐÔÚiOSÉϵÄÒýÓôúÂëÔò¿ÉʹÓÃMetal¶ø·ÇTensorFlow¿â¡£
ÔÚ¶Ô±ØÐèµÄѧϰ²ÎÊý½øÐÐѵÁ·Ö®ºó¡ª¡ª¼´WÓëbÖµ¡ª¡ªÎÒÃÇÐèÒª½«Æäµ¼³öΪMetal¿ÉÒÔ¶ÁÈ¡µÄ¸ñʽ¡£ÐÒÔ˵ÄÊÇ£¬ÎÒÃÇÖ»ÐèÒª½«Æä×÷Ϊ¶þ½øÖƸñʽ±£´æÎªÒ»·Ý¸¡µãÊýÖµÁÐ±í¼´¿É¡£
ÏÖÔÚÎÒÃÇÐèÒª±àдÁíÒ»Ì×Python½Å±¾£ºexport_weights.py£¨µã»÷´Ë´¦²é¿´ÍêÕû°æ±¾£©¡£ÆäÄÚÈÝÓëÎÒÃÇ֮ǰÓÃÓÚ¼ÓÔØ¼ÆËãͼ¶¨Òå¼°checkpointÎļþµÄtest.py·Ç³£ÏàËÆ¡£²»¹ýÕâÒ»´Î£¬ÎÒÃÇʹÓÃÒÔÏÂÄÚÈÝ£º
W.eval().tofile("W.bin") b.eval().tofile("b.bin")
|
¸ºÔð¼ÆËãWµÄµ±Ç°Öµ²¢½«Æä·µ»ØÎªÒ»¸öNumPyÊý×飨¹ý³ÌÓëÖ´ÐÐsess.run(W)ÍêȫһÖ£©¡£´Ëºó£¬ÎÒÃÇʹÓÃtofile()½«¸ÃNumPyÊý¾Ý±£´æÎªÒ»¸ö¶þ½øÖÆÎļþ¡£ºÃÁË£¬¾ÍÊÇÕâô¼òµ¥£º-£©
±¸×¢£º¶ÔÓÚÎÒÃǵÄʾÀý·ÖÀàÆ÷£¬WÊÇÒ»¸ö20 x 1µÄ¾ØÕ󣬼´Ò»·Ý¼òµ¥µÄ20ÏµãÊýÖµÁÐ±í¡£¶ÔÓÚ¸üΪ¸´ÔÓµÄÄ£ÐÍ£¬´ó¼ÒµÄѧϰ²ÎÊý¿ÉÄÜÊôÓÚËÄάÕÅÁ¿¡£ÔÚÕâÖÖÇé¿öÏ£¬´ó¼Ò¿ÉÄÜÐèÒª¶ÔÆäÖеIJ¿·Öά¶È½øÐÐ˳Ðòµ÷Õû£¬ÒòΪTensorFlow´æ´¢Êý¾ÝµÄ˳ÐòÓëMetalµÄÔ¤ÆÚ´æÔÚ²îÒì¡£´ó¼Ò¿ÉÒÔÖ±½ÓʹÓÃtf.transpose()ÃüÁîʵÏÖÕâһĿ±ê£¬µ«ÔÙ´ÎÖØÉ꣬ÎÒÃǵÄÕâһʾÀýÏîÄ¿²¢²»ÐèÒªÕâЩ¹ý³Ì¡£
ÏÂÃæÀ´¿´ÎÒÃÇÕâÌ×Âß¼·ÖÀàÆ÷µÄMetal°æ±¾¡£´ó¼Ò¿ÉÒÔµã»÷´Ë´¦ÔÚÆäÔ´´úÂëµÄVoiceMetalÎļþ¼ÐÖÐÕÒµ½¶ÔÓ¦µÄXcodeÏîÄ¿¡£´ËÏîÄ¿ÒÔSwiftÓïÑÔ±àд¶ø³É¡£
´ó¼ÒÓ¦¸Ã»¹¼ÇµÃ£¬ÕâÀïµÄÂß¼»Ø¹éËã·¨²ÉÓÃÁËÒÔÏ·½³Ìʽ½øÐмÆË㣺
y_pred = sigmoid((W * x) + b) |
Æä¼ÆËã¹ý³ÌÓëÉñ¾ÍøÂçµ±ÖÐÍêÈ«Á¬½Ó²ãµÄÖ´Ðйý³ÌÏàͬ¡£Òò´ËΪÁËÀûÓÃMetalʵÏÖÎÒÃǵķÖÀàÆ÷£¬Ö»ÐèҪʹÓÃÒ»¸öMPSCNNFullyConnected²ã¡£Ê×ÏÈ£¬ÎÒÃǽ«W.binÓëb.bin¼ÓÔØÖÁData¶ÔÏóµ±ÖУº
let W_url = Bundle.main.url (forResource: "W",
withExtension: "bin"
let b_url = Bundle.main.url (forResource: "b",
withExtension: "bin"
let W_data = try! Data(contentsOf: W_url!)
let b_data = try! Data(contentsOf: b_url!) |
´Ëºó£¬ÎÒÃÇ´´½¨¸ÃÍêÈ«Á¬½Ó²ã£º
let sigmoid = MPSCNNNeuronSigmoid(device: device)
let layerDesc = MPSCNNConvolutionDescriptor(
kernelWidth: 1, kernelHeight: 1,
inputFeatureChannels: 20, outputFeatureChannels:
1,
neuronFilter: sigmoid)
W_data.withUnsafeBytes { W in
b_data.withUnsafeBytes { b in
layer = MPSCNNFullyConnected(device: device,
convolutionDescriptor: layerDesc,
kernelWeights: W, biasTerms: b, flags: .none)
}
} |
ÓÉÓÚÊäÈëÄÚÈÝΪ20¸öÊý×Ö£¬ÎÒ¾ö¶¨½«ÍêÈ«Á¬½Ó²ãµÄÉ趨ΪһÌ×1 x 1ÇÒ°üº¬20ÌõÊäÈëͨµÀµÄά¶È¡°Í¼Ïñ¡±¡£¶ø½á¹ûy_pred½öΪµ¥Ò»Êý×Ö£¬ÕâÑù¸ÃÍêÈ«Á¬½Ó²ã½«½öÓµÓÐÒ»ÌõÊä³öͨµÀ¡£×÷ΪÊäÈëÓëÊä³öÊý¾ÝפÁôËùÔڵĶÔÏó£¬MPSImageͬÑùÓµÓÐÕâЩά¶È£º
let inputImgDesc = MPSImageDescriptor (channelFormat:
.float16,
width: 1, height: 1, featureChannels: 20) let outputImgDesc
= MPSImageDescriptor (channelFormat: .float16,
width: 1, height: 1, featureChannels: 1)
inputImage = MPSImage (device: device, imageDescriptor:
inputImgDesc)
outputImage = MPSImage (device: device, imageDescriptor:
outputImgDesc) |
ÓÉÓÚʹÓõÄÊÇÓ¦ÓÃÖеÄTensorFlow°æ±¾£¬Òò´ËÆäÖеÄpredict·½·¨½«»ñÈ¡ÓÃÒÔ¹¹½¨µ¥Ò»Ê¾ÀýµÄ20Ìõ¸¡µãÊýÖµ¡£ÒÔÏÂΪÍêÕûµÄ·½·¨ÄÚÈÝ£º
func predict(example: [Float]) {
convert(example: example, to: inputImage)
let commandBuffer = commandQueue.makeCommandBuffer()
layer.encode(commandBuffer: commandBuffer, sourceImage:
inputImage,
destinationImage: outputImage)
commandBuffer.commit()
commandBuffer.waitUntilCompleted()
let y_pred = outputImage.toFloatArray()
print("Probability spoken by a male: \(y_pred[0])%")
if y_pred[0] > 0.5 {
print("Prediction: male")
} else {
print("Prediction: female")
}
} |
Õ⼴ΪMetalµ±ÖеÄÔËÐлỰ°æ±¾¡£ÆäÖÐconvert(example:to:)ÓëtoFloatArray()·½·¨ÊôÓÚhelper£¬¸ºÔð½«Êý¾Ý¼ÓÔØ½ø/³öMPSImage¶ÔÏó¡£¾ÍÊÇÕâô¼òµ¥£¬ÎÒÃÇÒѾ³É¹¦Íê³ÉÁËMetal°æ±¾µÄÓ¦Óóɹû£¡´ó¼ÒÐèÒªÔÚʵ»úÖ®ÉÏÔËÐдËÓ¦Óã¬ÒòΪMetal²¢²»Ö§³ÖÄ£ÄâÆ÷ÔËÐлúÖÆ¡£
Probability spoken by a male: 0.970215% Prediction:
male Probability spoken by a male: 0.00568771%
Prediction: female |
ÐèҪעÒâµÄÊÇ£¬ÕâЩ¸ÅÂÊÓëTensorFlowÌṩµÄÔ¤²â½á¹û²¢²»ÍêȫһÖ¡£ÕâÊÇÒòΪMetal»áÔÚÄÚ²¿Ê¹ÓÃ16λ¸¡µãÊýÖµ£¬µ«¶þÕߵĽá¹ûÈÔÈ»Ï൱½Ó½ü£¡
|