Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Éî¶ÈѧϰָÄÏ£ºÔÚiOSƽ̨ÉÏʹÓÃTensorFlow
 
×÷Õß Matthijs Hollemans À´Ô´£ºInfoQ ·¢²¼ÓÚ£º 2017-5-10
  1909  次浏览      27
 

ÔÚÀûÓÃÉî¶ÈÑ§Ï°ÍøÂç½øÐÐÔ¤²âÐÔ·ÖÎö֮ǰ£¬ÎÒÃÇÊ×ÏÈÐèÒª¶ÔÆä¼ÓÒÔѵÁ·¡£Ä¿Ç°ÊÐÃæÉÏ´æÔÚ×Å´óÁ¿Äܹ»ÓÃÓÚÉñ¾­ÍøÂçѵÁ·µÄ¹¤¾ß£¬µ«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µÄ×îа汾£º

brew install python3

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))

¶øºóͨ¹ýÖÕ¶ËÔËÐÐÕâÌ׽ű¾£º

python3 tryit.py

Æä»áÏÔʾһЩÓëTensorFlowÔËÐÐËùÔÚÉ豸Ïà¹ØµÄµ÷ÊÔÐÅÏ¢£¨´ó¶àΪCPUÐÅÏ¢£¬µ«Èç¹ûÄúËùʹÓõÄMacÉ豸Å䱸ÓÐӢΰ´ïGPU£¬Òà¿ÉÄÜÌṩGPUÐÅÏ¢£©¡£×îÖÕ½á¹ûÏÔʾΪ£º

[5 7 9]

ÕâÀï´ú±íµÄÊÇÁ½¸öÏòÁ¿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¾ùÖµ¼°ÏàµÈµÄ·½²î£¬µ«ÓÉÓÚ±¾´ÎʾÀýÏîÄ¿±È½Ï¼òµ¥£¬ËùÒÔ²¢ÎÞÉîÈëµ÷ÕûµÄ±ØÒª¡£

ÀûÓÃÒÔÏÂÃüÁîÔÚÖÕ¶ËÖÐÔËÐÐÕâÌ׽ű¾£º

python3 split_data.py

Õ⽫¸øÎÒÃÇ´øÀ´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

 

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λ¸¡µãÊýÖµ£¬µ«¶þÕߵĽá¹ûÈÔÈ»Ï൱½Ó½ü£¡

   
1909 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ