ÏàÐÅÉçÇøÖкܶàС»ï°éºÍÎÒÒ»ÑùʹÓÃÁ˺ܳ¤Ê±¼äµÄCaffeÉî¶Èѧϰ¿ò¼Ü£¬Ò²·Ç³£Ï£Íû´Ó´úÂë²ã´ÎÀí½âCaffeµÄʵÏÖ´Ó¶øÊµÏÖй¦Ä͍ܵ֯¡£±¾ÎĽ«´ÓÕûÌå¼Ü¹¹ºÍµ×²ãʵÏÖµÄÊӽǣ¬¶ÔCaffeÔ´Âë½øÐнâÎö¡£
Caffe×ÜÌå¼Ü¹¹
Caffe¿ò¼ÜÖ÷ÒªÓÐÎå¸ö×é¼þ£¬Blob£¬Solver£¬Net£¬Layer£¬Proto£¬Æä½á¹¹Í¼ÈçÏÂͼ1Ëùʾ¡£Solver¸ºÔðÉî¶ÈÍøÂçµÄѵÁ·£¬Ã¿¸öSolverÖаüº¬Ò»¸öѵÁ·ÍøÂç¶ÔÏóºÍÒ»¸ö²âÊÔÍøÂç¶ÔÏó¡£Ã¿¸öÍøÂçÔòÓÉÈô¸É¸öLayer¹¹³É¡£Ã¿¸öLayerµÄÊäÈëºÍÊä³öFeature
map±íʾΪInput BlobºÍOutput Blob¡£BlobÊÇCaffeʵ¼Ê´æ´¢Êý¾ÝµÄ½á¹¹£¬ÊÇÒ»¸ö²»¶¨Î¬µÄ¾ØÕó£¬ÔÚCaffeÖÐÒ»°ãÓÃÀ´±íʾһ¸öÀÖ±µÄËÄά¾ØÕó£¬Ëĸöά¶È·Ö±ð¶ÔÓ¦Batch
Size(N)£¬Feature MapµÄͨµÀÊý(C),Feature Map¸ß¶È(H)ºÍ¿í¶È(W)¡£ProtoÔò»ùÓÚGoogleµÄProtobuf¿ªÔ´ÏîÄ¿£¬ÊÇÒ»ÖÖÀàËÆXMLµÄÊý¾Ý½»»»¸ñʽ£¬Óû§Ö»ÐèÒª°´¸ñʽ¶¨Òå¶ÔÏóµÄÊý¾Ý³ÉÔ±£¬¿ÉÒÔÔÚ¶àÖÖÓïÑÔÖÐʵÏÖ¶ÔÏóµÄÐòÁл¯Óë·´ÐòÁл¯£¬ÔÚCaffeÖÐÓÃÓÚÍøÂçÄ£Ð͵Ľṹ¶¨Òå¡¢´æ´¢ºÍ¶ÁÈ¡¡£

ͼ1 CaffeÔ´Âë×ÜÌå¼Ü¹¹Í¼
Blob½âÎö
ÏÂÃæ½éÉÜCaffeÖеĻù±¾Êý¾Ý´æ´¢ÀàBlob¡£BlobʹÓÃSyncedMemoryÀà½øÐÐÊý¾Ý´æ´¢£¬Êý¾Ý³ÉÔ±
data_Ö¸Ïòʵ¼Ê´æ´¢Êý¾ÝµÄÄÚ´æ»òÏÔ´æ¿é£¬shape_´æ´¢Á˵±Ç°blobµÄά¶ÈÐÅÏ¢£¬diff_Õâ¸ö±£´æÁË·´Ïò´«µÝʱºòµÄÌݶÈÐÅÏ¢¡£ÔÚBlobÖÐÆäʵ²»ÊÇÖ»ÓÐnum£¬channel£¬height£¬widthÕâÖÖËÄάÐÎʽ£¬ËüÊÇÒ»¸ö²»¶¨Î¬¶ÈµÄÊý¾Ý½á¹¹£¬½«Êý¾ÝÕ¹¿ª´æ´¢£¬¶øÎ¬¶Èµ¥¶À´æÔÚÒ»¸övector
ÀàÐ͵Äshape_±äÁ¿ÖУ¬ÕâÑùÿ¸öά¶È¶¼¿ÉÒÔÈÎÒâ±ä»¯¡£
À´Ò»Æð¿´¿´BlobµÄ¹Ø¼üº¯Êý£¬data_atÕâ¸öº¯Êý¿ÉÒÔ¶ÁÈ¡µÄ´æ´¢ÔÚ´ËÀàÖеÄÊý¾Ý£¬diff_at¿ÉÒÔÓÃÀ´¶ÁÈ¡·´Ïò´«»ØÀ´µÄÎó²î¡£Ë³±ã¸ø¸öÌáʾ£¬¾¡Á¿Ê¹ÓÃdata_at(const
vector& index)À´²éÕÒÊý¾Ý¡£Reshapeº¯Êý¿ÉÒÔÐÞ¸ÄblobµÄ´æ´¢´óС£¬countÓÃÀ´·µ»Ø´æ´¢Êý¾ÝµÄÊýÁ¿¡£BlobProtoÀฺÔðÁ˽«BlobÊý¾Ý½øÐдò°üÐòÁл¯µ½CaffeµÄÄ£ÐÍÖС£
¹¤³§Ä£Ê½ËµÃ÷
½ÓÏÂÀ´½éÉÜÒ»ÖÖÉè¼ÆÄ£Ê½Factory Pattern£¬Caffe ÖÐSolverºÍLayer¶ÔÏóµÄ´´½¨¾ùʹÓÃÁË´Ëģʽ£¬Ê×ÏÈ¿´¹¤³§Ä£Ê½µÄUMLµÄÀàͼ£º

ͼ2 ¹¤³§Ä£Ê½UMLÀàͼ
ÈçͬFactoryÉú³Éͬһ¹¦Äܵ«ÊDz»Í¬ÐͺŲúÆ·Ò»Ñù£¬ÕâЩ²úƷʵÏÖÁËͬÑùOperation£¬ºÜ¶àÈË¿´Á˹¤³§Ä£Ê½µÄ´úÂ룬»á²úÉúÕâÑùµÄÒÉÎÊΪºÎ²»newÒ»¸ö³öÀ´ÄØ£¬ÕâÑùnewÒ»¸ö³öÀ´ËƺõҲûʲôÎÊÌâ°É¡£ÊÔÏëÈçÏÂÇé¿ö£¬ÓÉÓÚ´úÂëÖØ¹¹ÀàµÄÃû³Æ¸ÄÁË£¬»òÕß¹¹Ô캯Êý²ÎÊý±ä»¯(Ôö¼Ó»ò¼õÉÙ²ÎÊý)¡£¶øÄã´úÂëÖÐÓÖÓÐN´¦newÁËÕâ¸öÀà¡£Èç¹ûÄãÓÖûÓù¤³§£¬¾ÍÖ»ÄÜÒ»¸öÒ»¸öÕÒÀ´¸Ä¡£¹¤³§Ä£Ê½µÄ×÷ÓþÍÊÇÈÃʹÓÃÕß¼õÉÙ¶Ô²úÆ·±¾ÉíµÄÁ˽⣬½µµÍʹÓÃÄѶȡ£Èç¹ûÓù¤³§£¬Ö»ÐèÒªÐ޸Ť³§ÀàµÄ´´½¨¾ßÌå¶ÔÏó·½·¨µÄʵÏÖ£¬¶øÆäËû´úÂë²»»áÊܵ½Ó°Ïì¡£
¾Ù¸öÀý×Ó£¬Ð´´úÂëÉÙ²»µÃ¶öÁËÒª¼Ó°àÈ¥³ÔÒ¹Ïü£¬Âóµ±À͵靈áºÍ¿ÏµÂ»ùµÄ¼¦³á¶¼ÊÇMM°®³ÔµÄ¶«Î÷£¬ËäÈ»¿ÚζÓÐËù²»Í¬£¬µ«²»¹ÜÄã´øMMÈ¥Âóµ±ÀÍ»ò¿ÏµÂ»ù£¬Ö»¹ÜÏò·þÎñԱ˵¡°À´Ëĸö¼¦³á¡±¾ÍÐÐÁË¡£Âóµ±ÀͺͿϵ»ù¾ÍÊÇÉú²ú¼¦³áµÄFactory¡£
Solver½âÎö
½ÓÏÂÀ´ÇлØÕýÌ⣬ÎÒÃÇ¿´¿´SolverÕâ¸öÓÅ»¯¶ÔÏóÔÚCaffeÖÐÊÇÈçºÎʵÏֵġ£SolverRegistryÕâ¸öÀà¾ÍÊÇÎÒÃÇ¿´µ½µÄÉÏÃæµÄfactoryÀ࣬¸ºÔð¸øÎÒÃÇÒ»¸öÓÅ»¯Ëã·¨µÄ²úÆ·£¬ÍⲿֻÐèÒª°ÑÊý¾ÝºÍÍøÂç½á¹¹¶¨ÒåºÃ£¬Ëü¾Í¿ÉÒÔ×Ô¼ºÓÅ»¯ÁË¡£
Solver* CreateSolver(const SolverParameter& param)Õâ¸öº¯Êý¾ÍÊǹ¤³§Ä£Ê½ÏµÄCreateProductµÄ²Ù×÷£¬
CaffeÖÐÕâ¸öSolverRegistry¹¤³§Àà¿ÉÒÔÌṩ¸øÎÒÃÇ6ÖÖ²úÆ·(ÓÅ»¯Ëã·¨)£º

ÕâÁùÖÖ²úÆ·µÄ¹¦Äܶ¼ÊÇʵÏÖÍøÂçµÄ²ÎÊý¸üУ¬Ö»ÊÇʵÏÖ·½Ê½²»Ò»Ñù¡£ÄÇÎÒÃÇÀ´¿´¿´ËûÃǵÄʹÓÃÁ÷³Ì°É¡£µ±È»ÕâЩ²úÆ·ÀàËÆÉÏÃæProductÀàÖеÄOperation£¬Ã¿Ò»¸öSolver¶¼»á¼Ì³ÐSolveºÍStepº¯Êý£¬¶øÃ¿¸öSolverÖжÀÓеĽö½öÊÇApplyUpdateÕâ¸öº¯ÊýÀïÃæÖ´ÐеÄÄÚÈݲ»Ò»Ñù£¬½Ó¿ÚÊÇÒ»Öµģ¬ÕâÒ²ºÍÎÒÃÇ֮ǰ˵µÄ¹¤³§Éú²ú³öÀ´µÄ²úÆ·Ò»Ñù¹¦ÄÜÒ»Ñù£¬Ï¸½ÚÉÏÓвîÒ죬±ÈÈç´ó¶àÊýµç·¹ìÒ¶¼ÓÐÖ󷹵ŦÄÜ£¬µ«ÊÇÿһÖֵ緹ìÒÖ󷹵ļÓÈÈ·½Ê½¿ÉÄܲ»Í¬£¬Óе×Å̼ÓÈȵϹÓÐÁ¢Ìå¼ÓÈȵĵȡ£½ÓÏÂÀïÎÒÃÇ¿´¿´SolverÖеĹؼüº¯Êý¡£
SolverÖÐSolveº¯ÊýµÄÁ÷³ÌͼÈçÏ£º

ͼ3 SolverÀàSolve·½·¨Á÷³Ìͼ
SolverÀàÖÐStepº¯ÊýÁ÷³Ìͼ£º

ͼ4 SolverÀàStep·½·¨Á÷³Ìͼ
SolverÖйؼüµÄ¾ÍÊǵ÷ÓÃSovleº¯ÊýºÍStepº¯ÊýµÄÁ÷³Ì£¬ÄãÖ»ÐèÒª¶ÔÕÕSolverÀàÖÐÁ½¸öº¯ÊýµÄ¾ßÌåʵÏÖ£¬¿´¶®ÉÏÃæÁ½¸öÁ÷³Ìͼ¾Í¿ÉÒÔÀí½âCaffeѵÁ·Ö´ÐеĹý³ÌÁË¡£
NetÀà½âÎö
·ÖÎö¹ýSolverÖ®ºóÎÒÃÇÀ´·ÖÎöÏÂNetÀàµÄһЩ¹Ø¼ü²Ù×÷¡£Õâ¸öÊÇÎÒÃÇʹÓÃProto´´½¨³öÀ´µÄÉî¶ÈÍøÂç¶ÔÏó£¬Õâ¸öÀฺÔðÁËÉî¶ÈÍøÂçµÄǰÏòºÍ·´Ïò´«µÝ¡£ÒÔÏÂÊÇNetÀàµÄ³õʼ»¯·½·¨NetInitº¯Êýµ÷ÓÃÁ÷³Ì£º

ͼ5 NetÀàNetInit·½·¨Á÷³Ìͼ
NetµÄÀàÖеĹؼüº¯Êý¼òµ¥ÆÊÎö
ForwardBackward£º°´Ë³Ðòµ÷ÓÃÁËForwardºÍBackward¡£
ForwardFromTo(int start, int end)£ºÖ´ÐдÓstart²ãµ½end²ãµÄǰÏò´«µÝ£¬²ÉÓüòµ¥µÄforÑ»·µ÷Óá£
BackwardFromTo(int start, int end)£ººÍÇ°ÃæµÄForwardFromToº¯ÊýÀàËÆ£¬µ÷ÓôÓstart²ãµ½end²ãµÄ·´Ïò´«µÝ¡£
ToProtoº¯ÊýÍê³ÉÍøÂçµÄÐòÁл¯µ½Îļþ£¬Ñ»·µ÷ÓÃÁËÿ¸ö²ãµÄToProtoº¯Êý¡£
Layer½âÎö
LayerÊÇNetµÄ»ù±¾×é³Éµ¥Ôª£¬ÀýÈçÒ»¸ö¾í»ý²ã»òÒ»¸öPooling²ã¡£±¾Ð¡½Ú½«½éÉÜLayerÀàµÄʵÏÖ¡£
LayerµÄ¼Ì³Ð½á¹¹

ͼ6 Layer²ãµÄ¼Ì³Ð½á¹¹
LayerµÄ´´½¨
ÓëSolverµÄ´´½¨·½Ê½ºÜÏñ£¬LayerµÄ´´½¨Ê¹ÓõÄÒ²Êǹ¤³§Ä£Ê½£¬ÕâÀï¼òµ¥ËµÃ÷ϼ¸¸öºêº¯Êý£º
REGISTER_LAYER_CREATOR¸ºÔ𽫴´½¨²ãµÄº¯Êý·ÅÈëLayerRegistry¡£

ÎÒÃÇÀ´¿´¿´´ó¶àÊý²ã´´½¨µÄº¯ÊýµÄÉú³ÉºêREGISTER_LAYER_CLASS£¬¿ÉÒÔ¿´µ½ºêº¯Êý±È½Ï¼òµ¥µÄ£¬½«ÀàÐÍ×÷Ϊº¯ÊýÃû³ÆµÄÒ»²¿·Ö£¬ÕâÑù¾Í¿ÉÒÔ²úÉú³öÒ»¸ö´´½¨º¯Êý£¬²¢½«´´½¨º¯Êý·ÅÈëLayerRegistry¡£

REGISTER_LAYER_CREATOR(type, Creator_##type##Layer)
Õâ¶Î´úÂëÔÚsplit_layer.cppÎļþÖÐ

REGISTER_LAYER_CLASS(Split)¡£
ÕâÑùÎÒÃǽ«typeÌæ»»¹ýÒÔºó¸ø´ó¼Ò×ö¸ö·¶Àý£¬²Î¿¼ÏÂÃæµÄ´úÂë¡£

µ±È»ÕâÀïµÄ´´½¨º¯ÊýºÃÏñÊÇÖ±½Óµ÷Óã¬Ã»ÓÐÉæ¼°µ½ÎÒÃÇ֮ǰ¹¤³§Ä£Ê½µÄһЩÎÊÌâ¡£ËùÓеIJãµÄÀà¶¼ÊÇÕâÑùÂð?µ±È»²»ÊÇ£¬ÎÒÃÇ×Ðϸ¹Û²ì¾í»ýÀà¡£

¾í»ý²ãÔõôûÓд´½¨º¯ÊýÄØ£¬µ±È»²»ÊÇ£¬¾í»ýµÄ²ãµÄ´´½¨º¯ÊýÔÚLayerFactory.cppÖУ¬½ØÍ¼¸ø´ó¼Ò¿´Ï£¬¾ßÌå´úÂëÈçÏ£º

ÕâÑùÁ½ÖÖÀàÐ͵ÄLayerµÄ´´½¨º¯Êý¶¼ÓÐÁ˶ÔÓ¦µÄÉùÃ÷¡£ÕâÀïÖ±½Ó˵Ã÷³ýÁËÓÐcudnnʵÏֵIJ㣬ÆäËû²ã¶¼ÊDzÉÓõÚÒ»ÖÖ·½Ê½ÊµÏֵĴ´½¨º¯Êý£¬¶ø´øÓÐcudnnʵÏֵIJ㶼²ÉÓõĵڶþÖÖ·½Ê½ÊµÏֵĴ´½¨º¯Êý¡£
LayerµÄ³õʼ»¯
½éÉÜÍê´´½¨ÎÒÃÇ¿´¿´²ãÀïÃæµÄ¼¸¸öº¯Êý¶¼ÊÇʲôʱºò±»µ÷Óõġ£
¹Ø¼üº¯ÊýSetup´Ëº¯ÊýÔÚ֮ǰµÄÁ÷³ÌͼÖеÄNetInitʱºò±»µ÷Ó㬴úÂëÈçÏ£º

ÕâÑùÕû¸öLayer³õʼ»¯µÄ¹ý³ÌÖУ¬CheckBlobCounts±»×îÏȵ÷Óã¬È»ºó½ÓÏÂÀ´ÊÇLayerSetUp£¬ºóÃæ²ÅÊÇReshape£¬×îºó²ÅÊÇSetLossWeights¡£ÕâÑùLayer³õʼ»¯µÄÉúÃüÖÜÆÚ´ó¼Ò¾ÍÓÐÁËÁ˽⡣
LayerµÄÆäËûº¯ÊýµÄ½éÉÜ
LayerµÄForwardº¯ÊýºÍBackwardº¯ÊýÍê³ÉÁËÍøÂçµÄǰÏòºÍ·´Ïò´«µÝ£¬ÕâÁ½¸öº¯ÊýÔÚ×Ô¼ºÊµÏÖÐÂµÄ²ã±ØÐëҪʵÏÖ¡£ÆäÖÐBackward»áÐÞ¸ÄbottomÖÐblobµÄdiff_£¬ÕâÑù¾ÍÍê³ÉÁËÎó²îµÄ·½Ïò´«µ¼¡£
Protobuf½éÉÜ
CaffeÖеÄCaffe.protoÎļþ¸ºÔðÁËÕû¸öCaffeÍøÂçµÄ¹¹½¨£¬ÓÖ¸ºÔðÁËCaffemodelµÄ´æ´¢ºÍ¶ÁÈ¡¡£ÏÂÃæÓÃÒ»¸öÀý×Ó½éÉÜProtobufµÄ¹¤×÷·½Ê½£º
ÀûÓÃprotobuffer¹¤¾ß´æ´¢512ά¶ÈͼÏñÌØÕ÷£º
message ±àд£ºÐ½¨txtÎļþºó׺Ãû¸ÄΪproto,±àд×Ô¼ºµÄmessageÈçÏ£¬²¢·ÅÈë½âѹµÄprotobuffµÄÎļþ¼ÐÀï;

ÆäÖУ¬dwFaceFeatSize±íÊ¾ÌØÕ÷µãÊýÁ¿;pfFaceFeat±íʾÈËÁ³ÌØÕ÷¡£
´ò¿ªwindowsÃüÁî´°¿Ú(cmd.exe)¡ª->cd¿Õ¸ñ£¬°ÑprotobuffµÄÎļþ·¾¶¸´ÖÆÕ³Ìù½øÈ¥¡ª¡ª>enter;
ÊäÈëÖ¸Áîprotoc *.proto ¨Ccpp_out=. ¡ª¡ª¡ª>enter
¿ÉÒÔ¿´µ½Îļþ¼ÐÀïÃæÉú³É¡° .pb.h¡±ºÍ¡°.pb.cpp¡±Á½¸öÎļþ£¬ËµÃ÷³É¹¦ÁË

ÏÂÃæ¿ÉÒÔºÍ×Ô¼ºµÄ´úÂëÕûºÏÁË£º
н¨Äã×Ô¼ºµÄ¹¤³Ì£¬°Ñ¡° .pb.h¡±ºÍ¡°.pb.cpp¡±Á½¸öÎļþÌí¼Óµ½×Ô¼ºµÄ¹¤³ÌÀ²¢Ð´ÉÏ#include¡±
*.pb.h¡±
°´ÕÕÅä¿âµÄ½Ì³Ì°Ñ¿âÅäÖÃϾͿÉÒÔÁË
VSÏÂProtobufµÄÅä¿â·½·¨£º
½â¾ö·½°¸¡ª->ÓÒ»÷¹¤³ÌÃû¡ª->ÊôÐÔ
(1)c/c++¡ª>³£¹æ¡ª>¸½¼Ó°üº¬Ä¿Â¼¡ª>
($your protobuffer include path)\protobuffer
(2)c/c++¡ª>Á´½ÓÆ÷¨C>³£¹æ¡ª>¸½¼Ó¿âĿ¼¨C>
($your protobuffer lib path)\protobuffer
(3) c/c++¡ª>Á´½ÓÆ÷¨C>ÊäÈ롪>¸½¼ÓÒÀÀµÏî¨C>
libprotobufd.lib;(´ødµÄΪdebugģʽ)
»òlibprotobuf.lib;(²»´ød,Ϊreleaseģʽ)
ʹÓÃprotobuf½øÐдò°üµÄ·½·¨ÈçÏ´úÂ룺

CaffeµÄÄ£ÐÍÐòÁл¯
BlobProtoÆäʵ¾ÍÊÇBlobÐòÁл¯³ÉProtoµÄÀ࣬CaffeÄ£ÐÍÎļþʹÓÃÁ˸ÃÀà¡£Netµ÷ÓÃÿ¸ö²ãµÄToproto·½·¨£¬Ã¿¸ö²ãµÄToproto·½·¨µ÷ÓÃÁËBlobÀàµÄToProto·½·¨£¬ÕâÑùÍêÕûµÄÄ£Ð;ͱ»¶¼ÐòÁл¯µ½protoÀïÃæÁË¡£×îºóÖ»Òª½«Õâ¸öproto¼Ì³ÐÓÚmessageÀàµÄ¶ÔÏóÐòÁл¯µ½Îļþ¾ÍÍê³ÉÁËÄ£ÐÍдÈëÎļþ¡£Caffe´ò°üÄ£Ð͵Äʱºò¾ÍÖ»ÊǼòµ¥µ÷ÓÃÁËWriteProtoToBinaryFileÕâ¸öº¯Êý£¬¶øÕâ¸öº¯ÊýÀïÃæµÄÄÚÈÝÈçÏ£º

Proto.txtµÄ¼òµ¥ËµÃ÷
CaffeÍøÂçµÄ¹¹½¨ºÍSolverµÄ²ÎÊý¶¨Òå¾ùÓÉ´ËÀàÐÍÎļþÍê³É¡£Net¹¹½¨¹ý³ÌÖе÷ÓÃReadProtoFromTextFile½«ËùÓеÄÍøÂç²ÎÊý¶ÁÈ롣Ȼºóµ÷ÓÃÉÏÃæµÄÁ÷³Ì½øÐÐÕû¸öcaffeÍøÂçµÄ¹¹½¨¡£Õâ¸öÎļþ¾ö¶¨ÁËÔõÑùʹÓôæÔÚcaffe
modelÖеÄÿ¸öblobÊÇÓÃÀ´×öʲôµÄ£¬Èç¹ûûÓÐÁËÕâ¸öÎļþcaffeµÄÄ£ÐÍÎļþ½«ÎÞ·¨Ê¹Óã¬ÒòΪģÐÍÖÐÖ»´æ´¢Á˸÷ÖÖ¸÷ÑùµÄblobÊý¾Ý£¬ÀïÃæÖ»ÓÐfloatÖµ£¬¶øÔõÑùÇзÖÕâЩÊý¾ÝÊÇÓÉprototxtÎļþ¾ö¶¨µÄ¡£
CaffeµÄ¼Ü¹¹ÔÚ¿ò¼ÜÉϲÉÓÃÁË·´Éä»úÖÆÈ¥¶¯Ì¬´´½¨²ãÀ´¹¹½¨Net£¬Protobuf±¾ÖÊÉ϶¨ÒåÁËgraph£¬·´Éä»úÖÆÊÇÓɺêÅäºÏmap½á¹¹Ðγɵģ¬È»ºóʹÓù¤³§Ä£Ê½È¥ÊµÏÖ¸÷ÖÖ¸÷Ñù²ãµÄ´´½¨£¬µ±È»Çø±ðÓÚÒ»°ã¶¨ÒåÅäÖòÉÓÃxml»òÕßjson£¬¸ÃÏîÄ¿µÄд·¨²ÉÓÃÁËprotoÎļþ¶Ô×é¼þ½øÐÐ×é×°¡£
×ܽá
ÒÔÉÏΪCaffe´úÂë¼Ü¹¹µÄÒ»¸ö×ÜÌå½éÉÜ£¬Ï£ÍûÄܽè´Ë°ïÖúÉçÇøµÄС»ï°éÕÒµ½´ò¿ª¶¨ÖÆ»¯Caffe´óÃŵÄÔ¿³×¡£±¾ÎÄ×÷ÕßÏ£Íû½è´ËÅ×שÒýÓñ£¬Óë¸ü¶àÆÚÍûÁ˽âCaffeºÍÉî¶Èѧϰ¿ò¼Üµ×²ãʵÏÖµÄͬÐн»Á÷¡£ |