±à¼ÍƼö: |
±¾ÎÄÀ´×Ô360doc£¬±¾ÎÄÖ÷Òª½éÉÜÈçºÎʹÓÃKERASÕâ¸öÏÖÔÚ×îеÄÉî¶Èѧϰ¿ò¼ÜÀ´¹¹ÔìʵÓõÄÉî¶ÈѧϰģÐÍ¡£
|
|
Éî¶ÈѧϰÊÇĿǰ×îÈÈÃŵĸ߼¶·ÖÎö¼¼ÊõÖ®Ò»£¬ÔÚºÜ¶à·½Ãæ±íÏÖ³öÁ˳¬Ô½´«Í³»úÆ÷ѧϰ·½·¨µÄÓÐЧÐÔ¡£µ«ÊÇÔÚ³£ÓõÄTensorFlow£¬CNTK£¬TheanoµÈ¼ÆËã»·¾³ÖÐʵÏÖ²»Í¬µÄÉî¶ÈѧϰģÐÍÈÔÈ»ÐèÒªºÄ·ÑºÜ¶àʱ¼äÀ´±àд³ÌÐò¡£KERASµÄ³öÏÖÌṩÁËÒ»¸ö¸ß¶È³éÏóµÄ»·¾³À´´î½¨Éî¶ÈѧϰģÐÍ£¬ÌرðÊÇÆä¼òµ¥Ò×Ó㬸úÍøÂç½á¹¹Ò»Ò»¶ÔÓ¦µÄÌØµãʹµÃÆäѸËÙÔÚÊý¾Ý¿ÆÑ§¼ÒÕâ¸öʹÓÃÈËȺÖÐÁ÷ÐÐÆðÀ´¡£
ʲôÊÇKERAS
KEARSÊÇGoogle¹¤³ÌʦFranois CholletΪÖ÷´´ÈËÔ±£¬»ùÓÚPython¿ª·¢ºÍά»¤µÄÒ»¸ö³éÏóµÄÉñ¾ÍøÂ罨ģ»·¾³£¬ÌṩÁËһϵÁеÄAPI¹©Óû§µ÷Óù¹Ôì×Ô¼ºµÄÉî¶ÈÑ§Ï°ÍøÂç¡£KERASµÄ³ö·¢µã¾ÍÊÇΪÓû§Ìṩһ¸öÄܹ»¿ìËÙʵÏÖÄ£Ð͵ÄÊֶΣ¬´Ó¶øËõ¶Ì½¨Ä£µü´úµÄʱ¼ä£¬¼Ó¿ìÄ£ÐÍÊÔÑéµÄƵÂÊ¡£ÓÃKERAS¿ª·¢ÕߵĻ°Ëµ£¬¾ÍÊÇÒª×öºÃµÄ¿ÆÑбØÐ뾡¿ÉÄܵØËõ¶Ì´ÓÏë·¨µ½ÊµÏÖ½á¹ûµÄʱ¼ä¡£ÔÚÒµ½ç¹¤×÷ÖÐÕâÒ²Êdzɹ¦µÄ¹Ø¼üÒªËØÖ®Ò»¡£
Ïà±È½ÏÓÚ³£¼ûµÄÉî¶Èѧϰ»·¾³£¬±ÈÈçTensorFlow£¬CNTK£¬Theano£¬CaffeµÈ£¬KERASÓÐÒÔϼ¸¸ö²»Í¬£º
Éè¼Æ³õÖÔ¾ÍÊÇ·½±ãÒÔÄ£¿é»¯µØ·½Ê½¿ìËÙ¹¹ÔìÉî¶ÈѧϰģÐ͵ÄÔÐÍ¡£
¿ÉÒԺܷ½±ãµØÔÚCPUºÍGPUÖ®¼äÇл»¡£
KERAS±¾ÉíÖ»ÊÇÃèÊöÄ£Ð͵Ļ·¾³£¬Æä¼ÆËãÆ½Ì¨Ä¿Ç°ÒÀÀµÓÚTensorFlow£¬CNTKºÍTheanoÕâÈýÖÖ£¬ÒÔºó»áÍØÕ¹µ½ÆäËûÁ÷ÐеļÆËãÆ½Ì¨ÉÏ£¬±ÈÈçmxNetµÈ¡£
KERASµÄÍØÕ¹ÐԼȿÉÒÔͨ¹ý×Ô¶¨ÒåKERASÀïµÄ¼¤»îº¯Êý»òÕßËðʧº¯ÊýµÈÄÜ×Ô¶¨ÒåµÄ²¿·Ö½øÐУ¬Ò²¿ÉÒÔͨ¹ýÒýÓöÔÓ¦µÄ¼ÆËãÆ½Ì¨µÄ×Ô¶¨Ò岿·Ö½øÐУ¬¾ßÓÐÒ»¶¨µÄÁé»îÐÔ¡£
¸úÕâЩÁ÷ÐеļÆËãÆ½Ì¨Ò»Ñù£¬KERASÒ²Ö§³Ö³£¼ûµÄÉî¶ÈѧϰģÐÍ£¬±ÈÈç¾í»ýÉñ¾ÍøÂ磬ѻ·Éñ¾ÍøÂçÒÔ¼°¶þÕßµÄ×éºÏµÈ¡£
ʹÓÃKERAS¹¹ÔìÉî¶ÈÉñ¾ÍøÂçÓÐһϵÁÐÏà¶Ô¹Ì¶¨µÄ²½Ö裺
Ê×ÏÈÒª½«ÔʼÊý¾Ý´¦Àí³ÉKERASµÄAPIÄܹ»½ÓÊܵĸñʽ£¬Ò»°ãÊÇÒ»¸öÕÅÁ¿µÄÐÎʽ£¬Í¨³£ÔÚά¶ÈÉϱíʾΪ£¨ÅúÁ¿Êý£¬[µ¥Ò»Ñù±¾¶ÔÓ¦ÕÅÁ¿µÄά¶È]£©¡£ÕâÀï[µ¥Ò»Ñù±¾¶ÔÓ¦ÕÅÁ¿µÄά¶È]
ÊÇÒ»¸öͨÓõÄ˵·¨£¬¶ÔÓ¦ÓÚ²»Í¬ÀàÐ͵ÄÄ£ÐÍ£¬Êý¾ÝÓв»Í¬µÄÒªÇó¡£
ͨ³££¬Èç¹ûÊÇÒ»¸ö¼òµ¥µÄÈ«Á´½ÓÄ£ÐÍ£¬Ôòµ¥Ò»Ñù±¾¶ÔÓ¦ÕÅÁ¿µÄά¶È¾ÍÊÇÌØÕ÷¸öÊý£»Èç¹ûÊÇһάµÄʱ¼äÐòÁÐÊý¾Ý£¬²¢ÒªÓÃÑ»·Éñ¾ÍøÂçÄ£ÐÍѵÁ·µÄ»°£¬Ôòµ¥Ò»Ñù±¾¶ÔÓ¦ÕÅÁ¿µÄά¶ÈÊÇʱ¼ä²½ºÍÿ¸öʱ¼ä²½¶ÔÓ¦µÄ»Ø¿´ÐòÁг¤¶È£»Èç¹ûÊäÈëÊý¾ÝÊÇͼÏñ£¬²¢Ê¹Óþí»ýÉñ¾ÍøÂçÄ£ÐͽøÐÐѵÁ·£¬Ôòµ¥Ò»Ñù±¾ÕÅÁ¿¶ÔӦͼÏñµÄ¸ß£¬¿íºÍÉ«²ÊƵµÀÈý¸öά¶È¡£µ«ÊÇÈç¹ûÊÇʹÓÃÈ«Á¬½ÓÄ£ÐÍѵÁ·Í¼ÏñÊý¾Ý£¬Ôòµ¥Ò»Ñù±¾¶ÔÓ¦ÕÅÁ¿ÊǸÃͼÏñ±â»¯£¨Flatten£©ÒÔºóµÄÏòÁ¿³¤¶È£¬ÆäΪ¸ß£¬¿íºÍÉ«²ÊƵµÀ¸÷¸öά¶ÈÊýÁ¿µÄ³Ë»ý¡£Ò»°ã¾í»ýÉñ¾ÍøÂç×î¿¿½üÊä³ö²ãµÄÄDz㶼ÉèÖÃÒ»¸öÈ«Á¬½Ó²ã£¬Òò´ËÒ²ÐèÒª±â»¯ÊäÈëÕÅÁ¿¡£
Æä´ÎÒª¹¹ÔìÐèÒªµÄÉî¶ÈѧϰģÐÍ¡£ÕâÒ»²½ÓÖ·ÖΪÒÔÏÂÁ½¸ö²½Ö裺
Ñ¡ÔñÄ£Ð͵ÄÀàÐÍ¡£KERASÀﶨÒåÁËÁ½´óÀàÄ£ÐÍ£º1£©ÐòÁÐÄ£ÐÍ£¨Sequential£©£» 2£©Í¨ÓÃÄ£ÐÍ£¨Model£©¡£
ÐòÁÐÄ£ÐÍÖ¸µÄÊÇÉî¶ÈÄ£ÐÍÿһ²ãÖ®¼ä¶¼ÊÇǰºóÐòÁйØÏµ£¬ÈçÏÂͼËùʾ£º

Figure 1£ºMLPÊÇÒ»¸öµäÐ͵ÄÐòÁÐÄ£ÐÍ
¿ÉÒÔ¿´µ½´Ó×óµ½ÓÒ£¬ÊäÈë²ãµ½Òþº¬²ãµ½Êä³ö²ãÿһ²ãÖ®¼ä¶¼ÊÇǰºóÒÀ´ÎÏàÁ¬µÄ¼òµ¥¹ØÏµ¡£Õâ¸ö¼òµ¥µÄÍøÂç½á¹¹¿ÉÒÔÓÃÈý¾äKERASÃüÁîʵÏÖ£º
model=Sequential()model.add(Dense(5,
input_shape=(4,), activation=¡¯sigmoid¡¯))model.add(Dense(1,
activation=¡¯sigmoid¡¯)) |
¶øÍ¨ÓÃÄ£ÐÍÔòÊǶÔÓ¦¸ü¹ãÒåµÄÄ£ÐÍ£¬¾ß±¸¸ü´óµÄÁé»îÐÔ¡£ÉÏÃæÌáµ½µÄÐòÁÐÄ£ÐÍÒ²¿ÉÒÔÓÃͨÓÃÄ£ÐÍÀ´±í´ï£¬Õâ¸öÎÒÃÇÔÚºóÒ»½ÚÏê½â¡£
µ±È»Í¨ÓÃÄ£Ð͸üÄÜÓÃÀ´ÃèÊö²ãÓë²ãÖ®¼äÓнϸ´ÔÓ¹ØÏµµÄÇé¿ö£¬±ÈÈç·ÇÏàÁڵIJãÖ®¼ä½øÐÐÁ¬½Ó£¬»òÕß¶à¸öÉñ¾ÍøÂçµÄºÏ²¢µÈ¡£±ÈÈçÎÒÃÇ¿ÉÒÔʹÓÃͨÓÃÄ£ÐͽøÐоØÕó·Ö½â£º
user_in = Input(shape=(1,),
dtype='int64', name='user_in')u = Embedding(n_users,
n_factors, input_length=1)(user_in)movie_in =
Input(shape=(1,), dtype='int64', name='movie_in')v
= Embedding(n_movies, n_factors, input_length=1)(movie_in)x
= merge([u, v], mode='dot')x = Flatten()(x)model
= Model([user_in, movie_in], x)model.compile(Adam(0.001),
loss='mse') |
ÕâÀï¹¹ÔìÁËÒ»¸ö»ùÓÚ¾ØÕó·Ö½âµÄÍÆ¼öϵͳµÄÒ»¸öÉî¶ÈѧϰģÐÍ£¬Æä¶ÔÓ¦µÄÍøÂç½á¹¹ÈçÏÂͼËùʾ£º

Figure 2£º¾ØÕó·Ö½âµÄÉî¶ÈѧϰģÐÍ
ϸ»¯Ä£Ð͵Ľṹ¡£ÆäʵÉÏÃæÒѾչʾÁËÄ£Ðͽṹϸ»¯Ö®ºóµÄÇé¿ö¡£Ò»°ãÀ´Ëµ£¬È·¶¨ÁËÄ£ÐÍÀàÐÍÒÔºó£¬Æä½á¹¹²»Íâºõÿ²ãµÄÀàÐÍÊÇʲô£¬ÊÇÈ«Á¬½Ó²ã»¹ÊǾí»ý²ã»¹ÊÇ·ÅÆú£¨Dropout£©²ã£»Ã¿²ãµÄÆäËû²ÎÊýÊÇʲô£¬±ÈÈçÈç¹ûÐèÒªÖ¸¶¨¼¤»îº¯Êý£¬ÄÇôʹÓÃʲôÑùµÄ¼¤»îº¯Êý£¬Èç¹ûÊǾí»ý²ã£¬ÄÇôÐèÒª¶àÉÙ¹ýÂËÆ÷£¬Ã¿¸ö¹ýÂËÆ÷µÄ´óСÊÇÔõÑùµÄ£¿µÈµÈÕâЩ¶¼¿ÉÒÔͨ¹ýÉ趨²»Í¬µÄ²ÎÊý½øÐÐϸ»¯¡£
È»ºó¶ÔÄ£ÐͽøÐбàÒ룬±àÒëÍê³ÉÒÔºó¿ÉÒԲ鿴ģÐ͵Ļù±¾ÐÅÏ¢£¬ÌرðÊDzÎÊýµÄÊýÁ¿£»
×îºó´øÈëÊý¾Ý¶ÔÄ£ÐͽøÐÐÄâºÏ¡£Ò»°ãÀ´½²£¬Èç¹ûÊý¾ÝÊǾ²Ì¬µÄÕÅÁ¿Êý¾Ý£¬Í¨¹ýʹÓÃfit·½·¨¡£Èç¹ûÊý¾ÝÌØ±ð´ó£¬¿ÉÊÇʹÓÿɵü´úµÄdata
generator¶ÔÏ󣬲¢Ê¹ÓÃfit_generator·½·¨À´ÄâºÏ¡£
KERASºÍÉî¶ÈѧϰģÐ͵ĶÔÓ¦¹ØÏµ
KERAS¼ÈÈ»ÊÇ¿ª·¢³öÀ´¿ìËÙ¹¹ÔìÉî¶ÈѧϰģÐ͵Ť¾ß£¬ÄÇôËüµÄAPIºÍÉî¶ÈѧϰģÐ͵ÄÒªËØ¶¼ÓкÜÇ¿µÄ¶ÔÓ¦¹ØÏµ¡£
ÕýÈçÉÏÃæËù˵£¬Ä¿Ç°µÄÉî¶ÈѧϰģÐͶ¼¿ÉÒÔÄÉÈëÐòÁÐÄ£ÐÍ»òÕßͨÓÃÄ£Ð͵ģ¬ÄÇôÎÒÃÇÓÃͼʾµÄ·½Ê½À´±íʾÕâ¸ö¶ÔÓ¦¹ØÏµ£¬·½±ã¶ÁÕßÀí½â¡£ÕâÀïÍøÂçͼΪÁË·½±ãÓë°´ÐÐÅÅÁеĴúÂë¶ÔÓ¦£¬¶Ôÿһ²ã¶¼½øÐÐÁ˱ê×¢¡£
ÏÂͼչʾµÄÊÇÒ»¸öµäÐ͵ÄÈ«Á¬½ÓÐòÁÐÄ£ÐÍ£º

Õâ¸öÐòÁÐÄ£ÐÍ¿ÉÒÔʹÓÃÈçϵÄKERASÃüÁî¿ìËٴ£º
Model = Sequential()Model.add(Dense(10,
activation=¡¯sigmoid¡¯, input_shape=(8, )) ¡¾Òþº¬²ã1+ÊäÈë²ã¡¿Model.add(Dense(8,
activation=¡¯relu¡¯)) ¡¾Òþº¬²ã2¡¿Model.add(Dense(10,
activation=¡¯relu¡¯)) ¡¾Òþº¬²ã3¡¿Model.add(Dense(5, activation=¡¯softmax¡¯))
¡¾Êä³ö²ã¡¿ |
ÉÏÃæµÄÐòÁÐÄ£ÐÍÒ²¿ÉÒÔÓÃͨÓÃÄ£Ð͵ÄAPIÃèÊöµÄ½á¹û£¬ÆäÓëͼÖеÄÍøÂç½á¹¹ÓиüÇ¿µÄ¶ÔÓ¦¹ØÏµ£º
x = Input(shape=(8,))
¡¾ÊäÈë²ã¡¿b = Dense(10, activation=¡¯sigmoid¡¯)(x) ¡¾Òþº¬²ã1¡¿c
= Dense(8, activation=¡¯relu¡¯)(b) ¡¾Òþº¬²ã2¡¿d = Dense(10,
activation=¡¯relu¡¯)(c ) ¡¾Òþº¬²ã3¡¿out = Dense(5, activation=¡¯softmax¡¯)(d)
¡¾Êä³ö²ã¡¿model = Model(inputs=x, outputs=out) |
ÉÏÃæÒ²¾ÙÁËÁíÍâµÄ±È½Ï¸´ÔÓµÄÀý×Ó¡£ÔÚºóÃæµÄ¾ßÌå°¸ÀýÖУ¬ÎÒÃÇÒ²»áÇ¿µ÷ÍøÂç½á¹¹ºÍ¶ÔÓ¦µÄKERASÃüÁʹ¶ÁÕßÄܽ¨Á¢Æð½ÏÇ¿µÄÁªÏµ¡£
ʹÓÃKERAS¹¹ÔìÉî¶ÈÍÆ¼öϵͳ
ÍÆ¼öϵͳÊÇ»úÆ÷ѧϰ×î¹ã·ºµÄÓ¦ÓÃÁìÓòÖ®Ò»£¬´ó¼ÒÊìϤµÄÑÇÂíÑ·¡¢µÏÊ¿Äá¡¢¹È¸è¡¢Netflix µÈ¹«Ë¾¶¼ÔÚÍøÒ³ÉÏÓÐÆäÍÆ¼öϵͳµÄ½çÃæ£¬°ïÖúÓû§¸ü¿ì¡¢¸ü·½±ãµØ´Óº£Á¿ÐÅÏ¢ÖÐÕÒµ½ÓмÛÖµµÄÐÅÏ¢¡£±ÈÈçÑÇÂíÑ·£¨www.amazon.com£©»á¸øÄãÍÆ¼öÊé¡¢ÒôÀֵȣ¬µÏÊ¿Äᣨvideo.disney.com£©¸øÄãÍÆ¼ö×îϲ»¶µÄ¿¨Í¨ÈËÎïºÍµÏÊ¿ÄáµçÓ°£¬¹È¸èËÑË÷¸ü²»ÓÃ˵ÁË£¬
Google Play¡¢ Youtube µÈÒ²ÓÐ×Ô¼ºµÄÍÆ¼öÒýÇæ¡¢ÍƼöÊÓÆµºÍÓ¦Óõȡ£ÏÂÃæÊÇÎҵǽÑÇÂíÑ·Ö®ºóµÄÒ»¸öÍÆ¼öÒ³Ãæ£¬¿É¼ûÎÒ֮ǰӦ¸ÃÊǹºÂòÁË¿§·È»ú£¬ËùÒÔ»áÓÐÏà¹ØµÄ²úÆ·ÍÆ¼ö³öÀ´¡£

Figure 4£ºÑÇÂíÑ·µÄÍÆ¼öÒ³Ãæ¾Ö²¿
ÍÆ¼öϵͳµÄ×îÖÕÄ¿µÄÊÇ´Ó°ÙÍòÉõÖÁÉÏÒÚÄÚÈÝ»òÕßÉÌÆ·ÖаÑÓÐÓõĶ«Î÷¸ßЧµØÏÔʾ¸øÓû§£¬ÕâÑù¿ÉÒÔΪÓû§½ÚÊ¡ºÜ¶à×ÔÐвéѯµÄʱ¼ä£¬Ò²¿ÉÒÔÌáʾÓû§¿ÉÄܺöÂÔµÄÄÚÈÝ»òÉÌÆ·£¬Ê¹Óû§¸üÓÐð¤ÐÔ£¬¸üÔ¸Ò⻨ʱ¼ä´ýÔÚÍøÕ¾ÉÏ£¬´Ó¶øÊ¹É̼ҿÉÒÔ´ÓÄÚÈÝ»òÕßÉÌÆ·ÖÐ׬ȡ¸ü¶àµÄÀûÈ󣬼´Ê¹Á÷Á¿±¾ÉíÒ²»áʹÉÌ¼Ò´Ó¹ã¸æÖÐÊÜÒæ¡£
´«Í³ÉÏ£¬ÍƼöϵͳÊÇ»ùÓÚ¾ØÕó·Ö½âµÄÐͬ¹ýÂËËã·¨£¬Ç°ÃæÒ²Õ¹Ê¾ÁËÕâÑùµÄÒ»¸ö¼òµ¥Ä£ÐÍ¡£ÏÂÃæÎÒÃÇ×ÅÖØ½éÉÜÉî¶ÈÑ§Ï°ÍÆ¼öϵͳ¡£Õâ¸öÄ£ÐͳýÁËÄܽ«Óû§ºÍ¿ÉÑ¡²úÆ·ÁªÏµÆðÀ´ÒâÍ⣬»¹Äܽ«ÆäËû¸¨ÖúÊý¾Ý£¬±ÈÈçÓû§ÄêÁ䣬µØÇø£¬ÉÏÍøÉ豸ÒÔ¼°¸÷ÖÖ²úÆ·ÊôÐÔ£¬ÁªÏµÆðÀ´¡£ÕâÀïͨ¹ýǶÈ루Embedding£©ÕâÖÖ¼¼Êõ½«²»Í¬µÄÐÅÏ¢´®ÔÚÒ»Æð×÷ΪÊäÈë²ã£¬ÔÙ¼ÌÐø´î½¨²»Í¬µÄÉñ¾ÍøÂçÄ£ÐÍ£¬×îºóÒ»²ãÓÃÔ¤²âÆÀ·Ö×÷ΪÊä³ö²ã¡£ËäÈ»ÕâÀïµÄÊý¾ÝÖ»ÓÐÓû§±àÂëºÍµçÓ°²úÆ·±àÂ룬µ«ÊÇÕâÑùµÄ½á¹¹¿ÉÒÔÍØÕ¹µ½°üº¬ÆäËûÏà¹ØÊý¾Ý¡£ÏÂͼչʾÁËÕâÑùµÄÒ»¸öÉî¶ÈÄ£Ð͵ĽṹʾÒâͼ£º

Figure 5£ºÉî¶ÈÄ£ÐÍ
ÓÐÁËÕâ¸öʾÒâͼ£¬ÎÒÃǾͿÉÒԺܷ½±ãµØÓÃKERASÒÀ´Î¹¹Ôì¡£ÕâÀïÎÒÃǼÙÉèÒѾ½«Óû§ºÍµçÓ°²úÆ·×öÁ˰´ÕÕOne
Hot±àÂëÐÎʽ×éÖ¯ºÃÁË¡£
Ê×ÏÈÓÃǶÈë²ã¶ÔÓû§ºÍµçÓ°½øÐÐǶÈëÓ³É䣺
k = 128model1
= Sequential()model1.add(Embedding(n_users + 1,
k, input_length = 1))model1.add(Reshape((k,)))model2
= Sequential()model2.add(Embedding(n_movies +
1, k, input_length = 1))model2.add(Reshape((k,))) |
ÕâÀïµÄkÊÇÓ³Éäµ½µÄ¿Õ¼äµÄά¶È¡£ÔÚÒ»°ãµÄÒµÎñϵͳÖÐÎÒÃÇ¿ÉÄÜÓÐÉϰÙÍòµÄÓû§ºÍ²úÆ·£¬¾¹ýǶÈëÓ³Éäµ½128άµÄʵÊýÓòÉÏÒÔºóÏÔÖøµØ½µµÍÁËÕû¸öϵͳµÄά¶ÈºÍ´óС¡£
ÒÔÉϼ¸¾äÃüÁîʵÏÖÁËÉÏͼ´Ó×îµÍϵ½¡°Óû§Ç¶È롱ºÍ¡°µçӰǶÈ롱ÕâÒ»½×¶ÎµÄ±à³Ì¡£
Æä´Î£¬ÎÒÃÇÐèÒªÓõÚÈý¸öÉñ¾ÍøÂç°ÑÇ°ÃæµÄÁ½¸öǶÈëÍøÂçÓ³ÉäËùµÃµ½µÄÏòÁ¿µþ¼ÓÔÚÒ»Æð£º
model = Sequential()model.add(Merge([model1,
model2], mode = 'concat')) |
ÖÁ´ËÍê³ÉÁ˵½µÚÒ»¸ö´Ö¼ýÍ·µÄÍøÂç¹¹Ôì¡£Á½¸öÍøÂçÒѾºÏ²¢ÎªÒ»¸öÍøÂç¡£
ÏÂÃæµÄÃüÁîÒÀ´ÎÍê³É¡°Òþº¬²ã128¡±ºÍ¡°Òþº¬²ã32¡±µÄ¹¹Ô죺
model.add(Dropout(0.2))model.add(Dense(k,
activation = 'relu'))model.add(Dropout(0.5) )model.add(Dense(int(k/4),
activation = 'relu'))model.add(Dropout(0.5)) |
ÏÂÃæ¼ÌÐø¹¹Ôì¡°Òþº¬²ã8¡±£º
model.add(Dense(int(k/16),
activation = 'relu'))model.add(Dropout(0.5)) |
Òþº¬²ã¹¹ÔìÍê±ÏÖ®ºó£¬ÐèÒª¹¹ÔìÊä³ö²ã¡£ÒòΪÊÇÔ¤²âÁ¬Ðø±äÁ¿ÆÀ·Ö£¬×îºóÒ»²ãÖ±½ÓÉÏÏßÐԱ仯£º
model.add(Dense(1,
activation = 'linear')) |
ÖÁ´Ë£¬Ä£Ð͹¹ÔìÍê±Ï£¬¿ÉÒÔ±àÒëÁË£º
model.compile(loss
= 'mse', optimizer = 'adam') |
ÕâÀïʹÓÃÁ˾ù·½²î£¨MSE£©×÷ΪËðʧº¯Êý£¬²¢Ê¹ÓÃÁËADAMÓÅ»¯Ëã·¨¡£
ÏÂÃæ£¬ÎªÁËÄÜѵÁ·Ä£ÐÍ£¬ÐèÒª½«Êý¾Ý¹¹ÔìΪ[users, movies]µÄÐÎʽ£º
users = ratings['user_id'].valuesmovies
= ratings['movie_id'].valuesX_train = [users,
movies] |
×îºóѵÁ·Ä£ÐÍ£º
model.fit(X_train,
y_train, batch_size = 100, epochs = 50) |
ʹÓÃmovielensµÄÓû§¹Û¿´µçÓ°ÆÀ·ÖÊý¾Ý½øÐÐѵÁ·ºÍÑéÖ¤£¬ÎÒÃÇ·¢ÏÖÕâ¸öÄ£Ð͵ÄÎó²îÔÚ0.8226×óÓÒ£¬´óÔ¼Ò»¸öÆÀ·ÖµÈ¼¶²»µ½¡£¼´Ê¹ÕâÑùÒ»¸ö¼òµ¥µÄÄ£ÐÍ£¬Ð§¹û»¹ÊDZȽϺõġ£Èç¹û½øÒ»²½ÓÅ»¯½á¹¹£¬»òÕßÒýÈëÆäËûÐÅÏ¢£¬Îó²î»¹¿ÉÒÔ½øÒ»²½½µµÍ¡£
ʹÓÃKERAS¹¹ÔìͼÏñʶ±ðϵͳ
ͼÏñʶ±ðÊÇÉî¶Èѧϰ×îµäÐ͵ÄÓ¦ÓÃÖ®Ò»¡£¹ØÓÚÉî¶ÈѧϰµÄͼÏñʶ±ð¿ÉÒÔ×·Ëݺܳ¤µÄÀúÊ·£¬ÆäÖÐ×î¾ßÓдú±íÐÔµÄÀý×ÓÊÇÊÖд×ÖÌåʶ±ðºÍͼƬʶ±ð¡£ÊÖд×ÖÌåʶ±ðÖ÷ÒªÊÇÓûúÆ÷ÕýÈ·Çø±ðÊÖдÌåÊý×Ö
0~9¡£ÒøÐÐ֧ƱÉϵÄÊÖдÌåʶ±ð¼¼Êõ¾ÍÊÇ»ùÓÚÕâ¸ö¼¼Êõ¡£Í¼Æ¬Ê¶±ðµÄ´ú±í×÷¾ÍÊÇ ImageNet¡£Õâ¸ö±ÈÈüÐèÒªÍŶÓʶ±ðͼƬÖе͝Îï»òÕßÎïÌ壬°ÑËüÃÇÕýÈ·µØ·Öµ½Ò»Ç§¸öÀà±ðÖÐµÄÆäÖÐÒ»¸ö¡£
ͼÏñʶ±ðÓкܶàÖÖ¼¼Êõ¿ÉÒÔʵÏÖ£¬Ä¿Ç°×îÖ÷Á÷µÄ¼¼ÊõÊÇÉî¶ÈÉñ¾ÍøÂ磬ÆäÖÐÓÈÒÔ¾í»ýÉñ¾ÍøÂ磨CNN£©×îΪ³öÃû¡£¾í»ýÉñ¾ÍøÂ磨¼ûͼ1£©ÊÇÒ»ÖÖ×Ô¶¯»¯ÌØÕ÷ÌáÈ¡µÄ»úÆ÷ѧϰģÐÍ¡£´ÓÊýѧµÄ½Ç¶È¿´£¬ÈκÎÒ»ÕÅͼƬ¶¼¿ÉÒÔ¶ÔÓ¦µ½
224 ¡Á 224 ¡Á 3 »òÕß 32 ¡Á 32 ¡Á 3 µÈÈýάÏòÁ¿£¬ÕâÈ¡¾öÓÚÏñËØ¡£ÎÒÃǵÄÄ¿±êÊǰÑÕâ¸öÈýάÏòÁ¿£¨ÓÖ±»³ÆÎªÕÅÁ¿£©Ó³Éäµ½
N¸öÀà±ðÖеÄÒ»Àà¡£Éñ¾ÍøÂç¾ÍÊǽ¨Á¢ÁËÕâÑùÒ»¸öÓ³Éä¹ØÏµ£¬»òÕß³ÆÎªº¯Êý¡£Ëüͨ¹ý½¨Á¢Íø×´½á¹¹£¬¸¨ÒÔ¾ØÕóµÄ¼Ó¡¢³ËµÈÔËË㣬×îºóÊä³öÿ¸öͼÏñÊôÓÚÿ¸öÀà±ðµÄ¸ÅÂÊ£¬²¢ÇÒÈ¡¸ÅÂÊ×î¸ßµÄ×÷ΪÎÒÃǵľö²ßÒÀ¾Ý¡£
ÏÂÃæÊÇÒ»¸öµäÐ͵ÄÐòÁоí»ýÉñ¾ÍøÂçÄ£Ð͵Ľṹ£º

Figure 6£º¾í»ýÉñ¾ÍøÂç½á¹¹¡£À´Ô´ÓÚCNTK½Ì³Ì¡£
ÉÏÃæÕâ¸öÍøÂçÒÀ´ÎչʾÁ˾í»ýÍøÂçÄ£Ð͵ÄÖ÷ÒªÒªËØ£º
ÊäÈë²ãµÄͼÏñ£»
¾í»ý²Ù×÷£»
¼¤»îº¯ÊýµÄÓ¦Óã»
³Ø»¯²Ù×÷£»
½«Êý¾Ýչƽ£¨Flatten£©£¬ÎªÊä³öµ½È«Á¬½Ó²ã×ö×¼±¸£»
È«Á¬½Ó²ã×¼±¸Êä³ö£»
softmaxÓ¦ÓÃÓÚ·ÖÀàÎÊÌâµÄÈ«Á¬½Ó²ã×÷ΪÊä³ö²ã¡£
ÏÂÃæÏêϸ½éÉÜÒ»ÏÂÔÚKERASÖÐÈçºÎ¶ÔÓ¦µØ½øÐбà³Ì´¦Àí¡£
Ê×ÏÈ£¬ÕâÊÇÒ»¸öÐòÁÐÄ£ÐÍ£¬Òò´ËÏÈÒªÉùÃ÷Ò»¸öÐòÁÐÄ£Ð͵ĶÔÏó£º
¾í»ýÊÇÓ¦ÓÃÒ»¸ö¾Ö²¿µÄ¹ýÂËÆ÷µ½ÔʼÊý¾ÝµÄ¹ý³Ì£¬±ÈÈçÏÂͼ¾ÍչʾÁËÒ»¸ö3x3µÄ¹ýÂËÆ÷Ó¦ÓÃÔÚÒ»¸ö7x7µÄͼÏñÉϹý³Ì¡£¼ÙÉèÔÚµ±Ç°²½£¬Õâ¸ö¹ýÂËÆ÷µÄÈ¨ÖØ¾¹ýѧϰµÃµ½ÈçͼËùʾµÄÈ¨ÖØ½á¹û£¬ÔÚµ±Ç°²½¼ÌÐø½øÐоí»ý²Ù×÷¾ÍÊǽ«Õâ¸ö3x3µÄ¹ýÂËÆ÷´Ó×óÉϽÇÿ´ÎҪôÏòÓÒҪôÏòÏÂÒÆ¶¯Ò»¸ñ£¬ºÍ¶ÔÓ¦µÄͼÏñ¾Ö²¿µÄ3x3µÄÇøÓò½øÐÐÒÀÔªËØµã³ËÇóºÍµÃµ½¾í»ýµÄ½á¹û¡£ÒòΪÒÀ´ÎÒÆ¶¯£¬µ½×î±ßÉϵÄʱºò¹ýÂËÆ÷»á³¬³öͼÏñµÄ±ß½ç£¬Ò»°ã»á½«ÕâЩ¶ÔÓ¦µÄ¾í»ý½á¹ûɾ³ý£¬´Ó¶ø¾í»ýºóµÄÕÅÁ¿Î¬¶È»áÉÙÓÚÔʼͼÏñ¡£±ÈÈçÕâ¸öÀý×ÓÖÐÔͼΪ7x7£¬Ê¹ÓÃÒ»¸ö3x3µÄ¹ýÂËÆ÷¾í»ýÖ®ºó×îºóÁ½ÁкÍÁ½ÐнøÐоí»ýµÄʱºò»áʹ¹ýÂËÆ÷³¬¹ý±ß½ç£¬Òò´Ë×îºóµÄ¾í»ý½á¹ûÊÇÒ»¸ö5x5µÄͼÏñ¡£ÕâÀï¿ÉÒÔʹÓöà¸ö¹ýÂËÆ÷£¬Ã¿¸ö¹ýÂËÆ÷Ó¦ÓÃÒ»´Î£¬Ã¿´ÎÓ¦ÓòúÉúµÄ¾í»ý½á¹û¹¹³ÉÒþº¬²ãµÄÒ»²ã¡£±ÈÈç²ÉÓÃ16¸ö¹ýÂËÆ÷£¬Èç¹û²»É¾³ý±ß½çµÄ¹ýÂ˽á¹û£¬ÔòµÃµ½ÐµÄ[7x7x16]µÄÕÅÁ¿¡£
Figure 7£º¾í»ýÑÝʾ£¬À´Ô´ÓÚCNTK½Ì³Ì¡£
ÔÚKERASÀ¶ÔÓÚͼÏñÕâÖÖ¶þάÊý¾Ý£¬Ò»°ãʹÓÃConv2DÕâ¸ö¶þά¾í»ý²ã¡£Conv2DÓм¸¸ö±Ø±¸µÄ²ÎÊý£º
Ê×ÏÈÖ¸¶¨¹ýÂËÆ÷ÊýÁ¿ filters£¬ÊÇÒ»¸öÕûÊý£»
µÚ¶þÊÇÒªÖ¸¶¨¶þά¹ýÂËÆ÷µÄ´óС£¬±ÈÈç(3,3)£»
µÚÈýÒªÖ¸¶¨²½³¤£¬¼´ÑÓijÖáÒÆ¶¯µÄʱºòÊÇÒÀ´ÎÒÆ¶¯Ò»¸öÏñËØ»¹ÊǶà¸öÏñËØ£¬Ä¬ÈÏΪ1£»
µÚËÄÒªÖ¸¶¨²¹Æë²ßÂÔpadding£¬¼´ÊÇ·ñÒª½«Ôڱ߽çµÄ¾í»ý½á¹ûÈ¥µô¡£Èç¹ûֵΪ¡±same¡±£¬Ôò²»È¥µô£¬¾í»ý½á¹ûºÍÊäÈëͼÏñÓÐͬÑùµÄ¸ßºÍ¿í£»Èç¹ûֵΪ¡±valid¡±£¬Ôò²»»á´¦Àí¹ýÂËÆ÷»á³¬³ö±ß½çµÄÏñËØ¡£
×îºó£¬Èç¹û¾í»ý²ãÊǵÚÒ»²ã£¬ÄÇô»¹ÐèÒªÖ¸Ã÷ÊäÈëÊý¾ÝµÄά¶Èinput\_shape¡£ÒòΪһ°ãÓÃTensorFlow»òÕßCNTK×öºǫ́£¬ÊäÈëÊý¾ÝÒªÇóÊÇchannel_last£¬Òò´ËÊäÈëµÄÔʼά¶ÈΪ[Ñù±¾Á¿£¬¸ß£¬¿í£¬ÆµµÀ]£¬ÄÇôÕâÀïµÄά¶ÈÖ»ÐèҪȥµôÑù±¾Á¿¼´¿É£¬¼´Îª[¸ß£¬¿í£¬ÆµµÀÊý]£¬Ò»°ãÓÃX.shape[1:]¼´¿ÉµÃµ½¡£
¶ÔÓÚÉÏÃæµÄÀý×Ó£¬KERASÀïµÄµäÐÍд·¨ÊÇ£º
model.add(Conv2D(filters=16,
kernel_size=(3, 3), strides=1, padding=¡±valid¡±,
input_shape=xtrain.shape[1:])) |
ÔÙ´ÎÒªÌí¼Ó¼¤»î²ãÒýÈ뼤»îº¯Êý£¬Í¨³£ÊÇÒ»¸ö·ÇÏßÐԵĺ¯Êý¡£¼¤»îº¯Êý¼È¿ÉÒÔͨ¹ýÔÚConv2DÀïÃæÖ¸¶¨activation=²ÎÊýÒýÈ룬Ҳ¿ÉÒÔͨ¹ýµ¥¶ÀÌí¼ÓActivation²ãÒýÈë¡£¾í»ýÉñ¾ÍøÂç³£Óõļ¤»îº¯ÊýÊÇRectified
Linear Unit£¬ ¼ò³Ærelu¡£¸Ãº¯ÊýÆäʵ¾ÍÊÇmax(0, x)£¬ÔÚ²ã´Î½ÏÉîµÄÍøÂçÖбÈÒÔǰ³£ÓõÄÈ¡ÖµÇø¼äÔÚ£¨0£¬1£©»òÕߣ¨-1£¬
1£©Ö®¼äµÄsigmoidÀ༤»îº¯ÊýЧ¹ûºÃ£¬ÒòΪ²»´æÔÚÌݶÈÏûʧµÄÎÊÌâ¡£
Èç¹ûÊÇͨ¹ý²ÎÊý£¬ÔòÉÏÃæµÄ´úÂë¸ÄдΪ£º
model.add(Conv2D(filters=16,
kernel\_size=(3, 3), strides=1, padding=¡±valid¡±,
activation=¡¯relu¡¯) |
Èç¹ûͨ¹ýÌí¼Ó¼¤»î²ãÒýÈ룬ÔòÔÚÉÏÃæµÄ´úÂëºóÌí¼Ó£º
model.add(Activation(¡®relu¡¯)) |
È»ºó½øÐеijػ¯²Ù×÷ÊÇÔÚ¾í»ýÉñ¾ÍøÂçÖжÔͼÏñÌØÕ÷µÄÒ»ÖÖ´¦Àí£¬Í¨³£ÔÚ¾í»ý²Ù×÷ºÍ¼¤»îº¯ÊýÖ®ºó½øÐС£³Ø»¯²Ù×÷Êǽ«ÔÓÐÊäÈë°´ÕÕÒ»¶¨´óСÇзֳɻ¥²»½»²æµÄ¾Ö²¿ÇøÓò£¬Ä¿µÄÊÇΪÁ˼ÆËãÌØÕ÷ÔÚ¾Ö²¿µÄ³ä·Öͳ¼ÆÁ¿£¬´Ó¶ø½µµÍ×ÜÌåµÄÌØÕ÷ÊýÁ¿£¬·ÀÖ¹¹ý¶ÈÄâºÏºÍ¼õÉÙ¼ÆËãÁ¿¡£ÏÂͼչʾÁË×î´ó³Ø»¯·½·¨µÄÓ¦Óá£ÔÚÒ»¸ö6x6µÄͼÏñÉÏÓ¦ÓÃ3x3µÄ³Ø»¯²Ù×÷£¬½«ÔÊäÈë¾ØÕóÇиîΪ²»Ïཻ²æµÄ2x2ÇøÓò£¬Ã¿¸öÇøÓòµÄȡֵÊǶÔÓ¦ÔÊäÈë¾Ö²¿µÄ×î´óÖµ¡£

Figure 8£º×î´ó³Ø»¯²Ù×÷
¶ÔÓ¦ÓÚͼÏñµÄ×î´ó³Ø»¯²ãͨ¹ýMaxPooling2D£¬KERASÒ²Ö§³Öƽ¾ù³Ø»¯²ã£¬Çø±ðÔÚÓÚÈ¡¶ÔÓ¦¾Ö²¿µÄƽ¾ùÖµ×÷Ϊ³Ø»¯ºó½á¹û£¬·½·¨ÎªAveragePooling2D¡£¶ÔÓ¦ÉÏÃæµÄÀý×Ó£¬KERASµÄÃüÁîÈçÏ£º
model.add(MaxPooling2D(pool_size=(3,
3)) |
ΪÁËÊä³öµ½È«Á¬½Ó²ã£¬ÏÈÒª¶ÔÊý¾Ý½øÐÐչƽ£¨Flatten£©¡£ÕâÊÇÒòΪȫÁ¬½Ó²ãÖ»´¦Àí°üº¬Ñù±¾ÊýÔÚÄÚÒ»¹²¶þάµÄÊý¾Ý£¬ÒªÇóµÚһάÊÇÑù±¾Êý£¬µÚ¶þάÊÇËùÓÐÌØÕ÷µÄ¸öÊý¡£Òò´Ë¶ÔÓÚÒ»¸ö°üº¬2000¸öÑù±¾£¬Ã¿¸öÑù±¾ÊÇ28x28x3µÄСͼÏñµÄÊý¾Ý£¬Õ¹Æ½Ö®ºóÊÇÒ»¸ö2000x2352µÄ¾ØÕ󣬯äÖÐ2352ÊÇ28,28,3µÄ³Ë»ý¡£ÔÚKERASÀï½øÐÐչƽ·Ç³£¼òµ¥£¬ÔÚÉÏÃæµÄMaxPooling2D²ãÖ®ºóÌímodel.add(Flatten())¼´¿É£¬KERASÄÜ×Ô¼º·ÖÎö³öÊäÈëºÍÊä³öµÄά¶È¡£
ÔÚÇ°ÃæÕâЩ´¦ÀíÖ®ºó£¬µ«ÊÇÔÚÊä³ö֮ǰ£¬Í¨³£»áÌí¼ÓÒ»¸ö»òÕß¶à¸öÈ«Á¬½Ó²ã½øÒ»²½´¦ÀíÊý¾Ý¡£È«Á¬½Ó²ã¿ÉÒÔͨ¹ýDenseÖ¸³ö£¬Ö¸Ã÷Êä³öÉñ¾Ôª¸öÊýºÍ¼¤»îº¯Êý¼´¿É£º
model.add(Dense(1000,
activation=¡¯relu¡¯)) |
×îºóʹÓÃÒ»¸öÈ«Á¬½Ó²ã×÷ΪÊä³ö²ã£¬Í¬ÑùÒªÇóʹÓÃsoftmax¼¤»îº¯Êý£¬²¢Ê¹ÓøúÊä³öÀà±ðͬÑù¶àµÄÉñ¾Ôª¸öÊý¡£±ÈÈçʶ±ð0¡ª9Ê®¸öÊý×Ö£¬ÄÇô¾ÍÓ¦¸Ãд×÷£º
model.add(Dense(10,
activation=¡¯relu¡¯)) |
°ÑËùÓв½Öè×éºÏµ½Ò»Æð£¬ÎÒÃǾͿÉÒÔ½«Í¼6ÏÔʾµÄÒ»¸ö¾í»ýÉñ¾ÍøÂçÄ£ÐÍÏàÓ¦µØÐ´ÎªKERAS´úÂëÁË£º
model=Sequential()model.add(Conv2D(filters=32,
kernel_size=(3, 3), padding='same', input_shape=X_train.shape[1:],
activation='relu'))model.add(MaxPooling2D(pool_size=(2,
2)))model.add(Conv2D(filters=64, kernel_size=(3,
3), padding='valid'))model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Flatten())model.add(Dense(128,
activation='relu')) model.add(Dense(num_classes,
activation='softmax')) |
ÊDz»ÊǺܼòµ¥£¿
ҪѵÁ·Õâ¸öÄ£Ðͷdz£¼òµ¥¡£ÎÒÃÇÏȱàÒëÕâ¸öÄ£ÐͲ¢ÏÔʾÆä¹Ø¼üÐÅÏ¢£º
model.compile(loss='categorical_crossentropy',
optimizer='adagrad', metrics=['accuracy'])model.summary() |

Figure 9£ºÄ£ÐÍÐÅÏ¢
ÎÒÃÇ¿´µ½Õâ¸öÄ£ÐÍÒ»¹²ÓÐ421642¸ö²ÎÊý£¬´ó¶àÀ´×ÔÓÚµ¹ÊýµÚ¶þ²ãµÄÈ«Á¬½Ó²ã¡£
ÄâºÏÕâ¸öÄ£ÐÍÒ²ºÜ¼òµ¥£º
model.fit(X_train,
y_train, epochs=20, verbose=1, batch_size=10,
validation_data = (X_test, y_test)) |
ÕâÀïʹÓÃ×î±ê×¼µÄfit·½·¨¡£ÆäÖÐÖ¸¶¨¼¸¸öºËÐIJÎÊý£º
ѵÁ·ÓÃÌØÕ÷Êý¾ÝX_train
ѵÁ·Óýá¹ûÊý¾Ýy_train
µü´ú´ÎÊýepochs
ÅúÁ¿´óСÓÃbatch_sizeÖ¸¶¨
verbose±íʾÏÔʾѵÁ·¹ý³ÌµÄÐÅÏ¢£¬Èç¹ûֵΪ0²»ÏÔʾÈκÎÖмäÐÅÏ¢£¬Èç¹ûΪ1ÏÔʾ°´ÅúÁ¿ÄâºÏµÄ½ø¶È£¬Èç¹ûΪ2ÔòÏÔʾÄâºÏ½á¹ûÐÅÏ¢¡£
ÁíÍâ¶ÁÕß»¹¿ÉÒÔÖ¸¶¨ÑéÖ¤Êý¾Ý¼¯£¬ÓÃvalidation_dataÕâ¸ö²ÎÊý±íʾ£¬Æä°üº¬Ò»¸ötuple£¬µÚÒ»¸öÔªËØÊÇÑéÖ¤ÓÃÌØÕ÷Êý¾Ý£¬µÚ¶þ¸öÊÇÑéÖ¤Óýá¹ûÊý¾Ý¡£
ÏÂÃæÎÒÃÇʹÓÃÕâ¸öÄ£ÐÍѵÁ·Ê¶±ð0-9ÕâÊ®¸öÊý×Ö£¬Ê¹ÓÃÖøÃûµÄMNISTÊý¾Ý¡£²»¹ýÔÚѵÁ·Ö®Ç°»¹ÐèÒªÌá¼°¶ÔÊý¾ÝµÄ´¦Àí£º
Ê×ÏȽ«Êý¾ÝÖØËÜΪ[Ñù±¾Êý£¬¸ß£¬¿í£¬É«²ÊͨµÀÊý]µÄ¸ñʽ¡£Õâ¸ö¿ÉÒÔͨ¹ýnumpy.reshape·½·¨À´ÊµÏÖ¡£ÒòΪkeras×Ô´øµÄMNISTÊý¾ÝÒѾÊÇnumpyµÄ¶àά¾ØÕ󣬲¢ÇÒÊǵ¥É«µÄ£¬Òò´ËÉ«²ÊͨµÀÊýΪ1£¬Òò´ËÊý¾ÝÖØËÜ¿ÉÒÔÓÃÏÂÃæµÄÃüÁîʵÏÖ¡£¶ÁÕß¿É×ÔÐÐÖØËÜÑéÖ¤ÓÃÊý¾Ý¡£
X_train = X_train.reshape(X_train.shape[0],
X_train.shape[1], X_train.shape[2], 1).astype(float) |
Æä´Î£¬ÐèÒª½«Êý¾ÝµÄȡֵѹËõµ½[0£¬ 1]Ö®¼ä¡£ÕâÓÐÀûÓÚÄâºÏʱÓõÄËæ»úÌݶȵݽµËã·¨µÄÎȶ¨ºÍÊÕÁ²¡£Õâ¿ÉÒÔʹÓÃX_train
/= 255.0 À´ÊµÏÖ¡£
×îºóÒª½«½á¹ûÊý¾Ý±äΪOne Hot CodeÐÎʽ¡£KERASÌṩÁËÒ»¸ö·Ç³£·½±ãµÄ·½·¨to_categoricalÀ´ÊµÏÖÕâ¸ö¹¦ÄÜ£º
y_train = keras.utils.to_categorical(y_train,
len(set(y_train))) |
ÏÂͼµÄ½á¹ûÏÔʾ¼´Ê¹ÊÇÕâ¸ö·Ç³£¼òµ¥µÄÄ£ÐÍ£¬ÆäÔÚÑéÖ¤Êý¾ÝÉϵÄÔ¤²â׼ȷÂʶ¼ÊǷdz£¸ßµÄ£¬´ïµ½ÁË99.14%¡£

ʹÓÃKERAS¿ÉÒԷdz£·½±ãµÄ¹¹Ôì×Ô¼ºµÄ¾í»ýÉñ¾ÍøÂ磬¶ÔÓڱȽϸ´ÔÓµÄÇé¿ö£¬Ò²¿ÉÒÔʹÓÃÒѾѵÁ·ºÃµÄһЩ³£¼ûµÄ¸ßЧģÐÍ£¬±ÈÈçVGG16£¬Xception
µÈ×öÇ¨ÒÆÑµÁ·À´ÄâºÏ×Ô¼ºµÄÊý¾Ý¡£

Figure 11£º VGG16½á¹¹
ÉÏͼÊÇÖøÃûµÄVGG16Ä£Ð͵Ľṹ¡£¸ù¾Ý¸Õ²ÅµÄѧϰ½á¹û£¬¶ÁÕß¿ÉÒÔºÜ¿ìµØÄ£·ÂÕâ¸ö½á¹¹´î½¨×Ô¼ºµÄÀàËÆÄ£ÐÍ£¬µ«ÊÇKERASÔÚapplication¿âÀïÒѾÌṩÁËÏÖ³ÉѵÁ·ºÃµÄVGG16Ä£Ð͹©¶ÁÕß¶ÁÈëʹÓ᣶ÁÕß¿ÉÒÔÒýÓÃÕâ¸öÄ£ÐÍ£¬½«¶¥²ãÈ¥µôÓÃ×Ô¼ºµÄÊý¾ÝÖØÐÂѵÁ·£¬µ«ÊǵײãµÄ²ÎÊý½èÓÃVGG16ÒѾѵÁ·ºÃµÄÈ¨ÖØ¡£Õâ¾ÍÊÇÇ¨ÒÆÑ§Ï°µÄ˼·£¬¿ÉÒÔ´ó´ó½µµÍÐèҪѵÁ·µÄ²ÎÊýÊýÁ¿£¬¼Ó¿ìÐÂÄ£Ð͵Ŀª·¢¡£ÕâÀïʹÓÃÁËͨÓÃÄ£ÐÍÒÔ±ãÔÚÏÖÓеÄVGG16Ä£ÐÍÉϽøÐÐÐ޸ģº
model_vgg =
VGG16(include_top = False, weights = 'imagenet',
input_shape =(224,224,3))model = Flatten(name
= 'flatten')(model_vgg.output)model = Dense(10,
activation = 'softmax')(model)model_vgg_mnist
= Model(model_vgg.input, model, name = 'vgg16') |
ÕâÀïÊ×ÏÈÒýÓÃVGG16Ä£ÐÍ£¬µ«ÊÇͨ¹ý²ÎÊýinclude_top=FalseÖ¸¶¨Ç¨ÒƳý¶¥²ãÒÔÍâµÄÆäÓàÍøÂç½á¹¹µ½×Ô¼ºµÄÄ£ÐÍÖС£Weights=¡¯imagenet¡¯±íʾ½èÓõÄÈ¨ÖØÊÇÓÃImageNetÊý¾ÝѵÁ·³öÀ´µÄ¶î¡£
Æä´Î£¬Í¨¹ýº¯Êý·½·¨ÔÚÐ޸ĹýµÄVGG16Ä£ÐÍÉϹ¹ÔìÒ»¸öÐÂµÄ±âÆ½²ãÓÃÀ´Á¬½Óй¹ÔìµÄÈ«Á¬½Ó²ã£¬Õâ¸öÈ«Á¬½Ó²ã¸úÇ°ÃæµÄÄ£ÐÍûÓÐÇø±ð¡£×îºó°ÑÐ޸ĹýµÄVGG16Ä£ÐͺÍÐµĶ¥²ãµþ¼ÓÆðÀ´²¢¸³ÓèеÄÃû×Övgg16¡£ÕâÑù¾ÍµÃµ½ÁËÒ»¸ö»ùÓÚVGG16µÄÐÂÄ£ÐÍ¡£
ʹÓÃKERAS¹¹Ôìʱ¼äÐòÁÐÔ¤²âÄ£ÐÍ
ʱ¼äÐòÁÐÊÇÔÚÉÌÒµÊý¾Ý»òÕß¹¤³ÌÊý¾ÝÖо³£³öÏÖµÄÒ»ÖÖÊý¾ÝÐÎʽ£¬ÊÇÒÔʱ¼äΪ´ÎÐòÅÅÁУ¬ÓÃÀ´ÃèÊöºÍ¼ÆÁ¿Ò»ÏµÁйý³Ì»òÕßÐÐΪµÄÊý¾ÝµÄͳ³Æ¡£±ÈÈçÿÌìÉ̵êµÄÊÕÈëÁ÷Ë®»òÕßij¸ö¹¤³§Ã¿Ð¡Ê±µÄ²úÆ·²ú³ö¶¼ÊÇʱ¼äÐòÁÐÊý¾Ý¡£Ò»°ãÑо¿µÄʱ¼äÐòÁÐÊý¾ÝÓÐÁ½ÖÖÀàÐÍ¡£×î³£¼ûµÄÊǸú×Ùµ¥Ò»µÄ¼ÆÁ¿Êý¾ÝËæÊ±¼ä±ä»¯µÄÇé¿ö£¬¼´Ã¿¸öʱ¼äµãÉÏÊÕ¼¯µÄÊý¾ÝÊÇÒ»¸öһά±äÁ¿£¬ÕâÖÖÊÇ×î³£¼ûµÄ£¬Í¨³£µÄʱ¼äÐòÁÐĬÈϾÍÊÇÕâÖÖÊý¾Ý£¬Ò²ÊDZ¾ÕÂÑо¿µÄ¶ÔÏó¡£ÁíÍâÒ»ÖÖʱ¼äÐòÁÐÊý¾ÝÊǶà¸ö¶ÔÏó»òÕß¶à¸öά¶ÈµÄ¼ÆÁ¿Êý¾ÝËæÊ±¼ä±ä»¯µÄÇé¿ö£¬¼´Ã¿¸öʱ¼äµãÉÏÊÕ¼¯µÄÊý¾ÝÊÇÒ»¸ö¶àά±äÁ¿£¬ÕâÖÖÒ»°ãÒ²±»³ÆÎª×ÝÏòÊý¾Ý£¨Longitudinal
Data£©£¬µ«ÊDz»ÊôÓÚÕâÀï½éÉܵĶÔÏó¡£
ÔÚÕâÀïÎÒÃǽéÉÜÈçºÎ´î½¨Ò»¸öLSTMÉî¶ÈѧϰģÐÍÀ´¶ÔÔÚºº¿Ú²âÁ¿µÄ³¤½Ã¿ÔÂÁ÷Á¿Êý¾Ý½øÐÐÔ¤²â½¨Ä£¡£¸ÃÊý¾ÝÀ´Ô´ÓÚDataMarket
µÄʱ¼äÐòÁÐÊý¾Ý¿â£¬ÓɰĴóÀûÑÇĪÄÉʲ´óѧµÄͳ¼ÆÑ§½ÌÊÚRob Hyndman ´´½¨£¬ÊÕ¼¯ÁËÊýÊ®¸ö¹«¿ªµÄʱ¼äÐòÁÐÊý¾Ý¼¯¡£
ºº¿Ú³¤½ÔÂÁ÷Á¿Êý¾Ý°üº¬´Ó 1865 Äê 1 Ôµ½ 1978 Äê 12 ÔÂÔÚºº¿Ú¼Ç¼µÄ³¤½Ã¿ÔµÄÁ÷Á¿£¬×ܼÆ
1368 ¸öÊý¾Ýµã¡£¼ÆÁ¿µ¥Î»Î´Öª¡£

Figure 12£º³¤½Ô¶ÈÁ÷Á¿Ê±¼äÐòÁÐ
ÔÚÒ»°ãµÄʱ¼äÐòÁн¨Ä£ÖУ¬¶¼ÐèÒª¼ìÑéÊý¾ÝµÄƽÎÈÐÔ£¬ÒòΪ´«Í³Ê±¼äÐòÁн¨Ä£¶¼Êǽ¨Á¢ÔÚÆ½ÎÈÊý¾ÝµÄ¼ÙÉèÖ®ÉÏ¡£Õâ¸öÊý¾Ý¾ß±¸·Ç³£Ç¿µÄÄê¶ÈÖÜÆÚÐÔ¡£Ê¹Óô«Í³µÄͳ¼Æ¼¼Êõ½¨Ä£µÄʱºò¶¼ÐèÒªÕì²âÖÜÆÚÐÔ£¬²¢Ïû³ýÖ®£¬¶ÔÏû³ýÖÜÆÚÐÔÖ®ºóµÄÊý¾ÝÔËÓÃARIMAÄ£Ðͽ¨Ä£¡£

Figure 13£º³¤½Ô¶ÈÁ÷Á¿¾Ö²¿ºÍÒÆ¶¯Æ½»¬½á¹û
ÎÒÃÇ¿ÉÒÔͨ¹ýÖÜÆÚͼÆ×·¨£¨Periodogram£©À´µÃµ½Ö÷ÒªµÄÖÜÆÚ·ù¶È¡£ÔÚPythonÖпÉÒÔʹÓÃscipy.signal.periodogramÀ´µÃµ½ÖÜÆÚͼÆ×¡£ÔÚÕâÀïÎÒÃDz»ÊÇʹÓÃÔʼÊý¾Ý£¬¶øÊÇʹÓÃÔʼÊý¾ÝµÄ×ÔÏà¹Øº¯ÊýµÄÖÜÆÚͼÆ×À´¼ÆËãÖ÷ÒªÖÜÆÚ£¬ÕâÑù¿ÉÒÔµÖÏûÔëÒôµÄÓ°Ïì¡£¶Ô¶ÁÈëpandas
DataFrameµÄÔʼÊý¾ÝtsÔËÐÐÏÂÃæµÄ³ÌÐòÎÒÃÇ¿ÉÒԵõ½ÈçϵÄÖÜÆÚͼÆ×ºÍ¼ÆËãµÃµ½µÄÖ÷ÒªÖÜÆÚ³¤¶È¡£
import statsmodels.api
as smfrom statsmodels.tsa.stattools import acffrom
scipy import signalimport peakutils as peakacf_x,
acf_ci = acf(ts, alpha=0.05, nlags=36)fs=1f, Pxx_den
= signal.periodogram(acf_x, fs)index = peak.indexes(Pxx_den)cycle=(1/f[index[0]]).astype(int)fig
= plt.figure()ax0 = fig.add_subplot(111)plt.vlines(f,
0, Pxx_den)plt.plot(f, Pxx_den, marker='o', linestyle='none',
color='red')plt.title('Identified Cycle of %i'
% (cycle))plt.xlabel('frequency [Hz]')plt.ylabel('PSD
[V**2/Hz]')plt.show()print( index, f, Pxx_den) |

Figure 14£ºÖÜÆÚͼÆ×
ºÜÃ÷ÏÔÓÐÒ»¸öÖÜÆÚΪ 12 ¸öÔµļ¾½ÚÐÔ¡£ËäÈ»¿¼Âǵ½Õâ¸öÊý¾ÝµÄ±¾ÖÊÊdz¤½Ë®ÎÄ×ÊÁÏ£¬ 12 ¸öÔµÄÖÜÆÚÊǷdz£×ÔÈ»µÄÔ¤ÆÚ£¬µ«ÊÇÕâ¸ö·½·¨Õ¹Ê¾Á˶Ô
ACF ÐòÁÐÔËÓÃÖÜÆÚͼ·¨£¨periodogram£©ÕÒ¼¾½ÚÐÔÖÜÆÚµÄ¿É¿¿ÐÔ¡£ÔÚ´«Í³·½·¨ÀÕâÀïÐèҪͨ¹ýÈ¡¼ä¸ôΪ12
µÄ²î·ÖÀ´Ïû³ýÖÜÆÚÐÔ£¬µÃµ½Ò»¸ö¾¡¿ÉÄÜÆ½ÎȵÄʱ¼äÐòÁУ¬½ø¶ø²ÉÓÃARIMAÄ£Ðͽ¨Ä£¡£ÔÚPythonÀµ¥ÖÜÆÚµÄʱ¼äÐòÁÐÊý¾Ý£¬ÖªµÀÖÜÆÚµÄ³¤¶ÈÒÔºó¿ÉÒÔÖ±½ÓʹÓü¾½ÚÐÔARIMAÄ£ÐÍ£¨SARIMA£©À´ÑµÁ·¡£
µ«ÊÇÔÚʹÓÃÑ»·Éñ¾ÍøÂçÄ£Ð͵ÄʱºòÎÒÃDz»Óÿ¼ÂÇÕâЩÇé¿ö£¬¿ÉÒÔÖ±½ÓʹÓó¤¶Ì¼ÇÒäÄ£ÐÍ¡£´ËÍ⣬ÔÚʹÓÃLSTMÕâÖÖÐòÁÐÄ£Ð͵ÄʱºòÔÚʹÓÃLSTM¶ÔÕâÖÖµ¥Ò»Ê±¼äÐòÁнøÐн¨Ä£µÄʱºò£¬Ò»°ãͨ¹ýһϲ½Ö裺
½«Êý¾Ý±ê×¼»¯Îª[0£¬1]Çø¼ä¡£
°´ÕÕLSTMµÄÒªÇ󣬽«ÊäÈëÊý¾Ý×é֯Ϊ[Ñù±¾Êý£¬Ê±¼ä²½£¬ÌØÕ÷±äÁ¿Êý]µÄÈýλ¸ñʽÀ´×éÖ¯¡£
¶¨ÒåÒ»¸öLSTMÉî¶ÈѧϰģÐÍ£¬Í¨³£ÎªÒ»¸öÐòÁÐÄ£ÐͶÔÏó£¬Öð²ãÌí¼ÓLSTM²ã»òÕ߯äËû²ã£¬×îºóͨ¹ýÒ»¸öÈ«Á¬½Ó²ãÊä³öµ½Êä³ö²ã¡£
×îºó¶ÔÐèÒªµÄʱ¼ä¶Î½øÐÐÔ¤²â¡£
Ê×ÏȶÔÊý¾Ý½øÐбê×¼»¯£¬ÎÒÃÇʹÓÃsklearn°üÀïµÄMinMaxScalerº¯Êý£º
scaler = MinMaxScaler(feature_range=(0,
1)) trainstd = scaler.fit_transform(train.values.astype(float)
.reshape(-1, 1))teststd = scaler.transform(test.values.astype(float).reshap |
Æä´Î£¬ÎÒÃǽ«ÑµÁ·Êý¾ÝºÍ²âÊÔÊý¾Ý×éÖ¯³ÉÐèÒªµÄ¸ñʽ£¬Õâ¸ö¸ñʽÓëÎÒÃǽ«Òª½¨Á¢µÄLSTMÄ£ÐÍÓйء£ÕâÀïÎÒÃǶÔÿ¸öÊäÈë¹¹ÔìÒ»¸öLSTMÉñ¾Ôª£¬Ò»¸ö60¸öÊäÈëµ¥Ôª£¬Ã¿Ò»¸ö¶ÔÓ¦Ò»¸öʱ¼ä²½¡£Õâ60¸öµ¥ÔªµÄÊä³ö»á×÷Ϊһ¸öÈ«Á¬½Ó²ãµÄÊäÈ룬Õâ¸öÈ«Á¬½Ó²ãÖ±½Ó²úÉúÏÂK¸öÁ¬ÐøÊ±¼ä²½µÄÊä³öÔ¤²â¡£×÷Ϊ·ÀÖ¹¹ý¶ÈÄâºÏµÄÕýÔò»¯ÊֶΣ¬ÎÒÃÇÔÚLSTM²ãºÍÈ«Á¬½Ó²ã
Ö®¼ä¼ÓÁËÒ»¸öDropout²ã¡£Õâ¸öDropout²ãÔÚѵÁ·µÄʱºò»áËæ»ú·ÅÆúÒ»²¿·ÖÈ¨ÖØµÄ¸üУ¬µ«ÊÇÔÚ½øÐÐÔ¤²âµÄʱºòËùÓÐÈ¨ÖØ¶¼»á±»Óõ½¡£

Figure 15£ºLSTMÍøÂç½á¹¹
¶ÔÓÚÕâÑùµÄÍøÂç½á¹¹£¬ÎÒÃÇÐèÒªÈçϵÄÒ»¸öº¯ÊýÀ´¶¨ÒåÎÒÃǵÄÊý¾Ý£¬¼´½«Êý¾Ý×éÖ¯³ÉΪ[ÅúÁ¿Êý£¬Ê±¼ä²½Êý£¬ÖͺóÌØÕ÷Êý]µÄÐÎʽ¡£Õâ¸ö¿ÉÒÔͨ¹ýÈçϵĺ¯ÊýÀ´ÊµÏÖ£º
def create_dataset(dataset,
timestep=1, look_back=1, look_ahead=1): from statsmodels.tsa.tsatools
import lagmat import numpy as np ds = dataset.reshape(-1,
1) dataX = lagmat(dataset, maxlag=timestep*look_back,
trim='both', original='ex') dataY = lagmat(dataset[(timestep*look_back):],
maxlag=look_ahead, trim='backward', original='ex')
dataX = dataX.reshape(dataX.shape[0], timestep,
look_back)[:-(look_ahead-1)] return np.array(dataX),
np.array(dataY[:-(look_ahead-1)]) |
Ö´ÐÐÏÂÃæµÄÃüÁî¾Í¿ÉÒÔÉú³ÉËùÐèÊý¾Ý£º
lookback=1lookahead=24timestep=60trainX,
trainY = create_dataset(trainstd, timestep=timestep,
look_back=lookback, look_ahead=lookahead)trainX,
trainY = trainX.astype('float32'), trainY.astype('float32')truthX,
truthY = create_dataset(truthstd, timestep=timestep,
look_back=lookback, look_ahead=lookahead) |
ÓÐÁËÈçͼ15µÄÍøÂçͼÒԺ󣬾ͿÉÒÔ¿ªÊ¼¶¨ÒåÎÒÃǵÄLSTMÉî¶ÈѧϰģÐÍ¡£
batch_size=100model
= Sequential()model.add(LSTM(48, batch_size=batch_size,
\input_shape=(timestep, lookback), kernel_initializer='he_uniform'))
model.add(Dropout(0.15) )model.add(Dense(lookahead))model.compile
(loss='mean_squared_error', optimizer='adam') |
µ÷ÓÃfit·½·¨¾Í¿ÉÒÔ¿ìËÙµÄѵÁ·Õâ¸öÄ£ÐÍ¡£ÎÒÃÇÖ¸¶¨µü´ú20´Î£¬Ð¡ÅúÁ¿ÊýΪ100£©£º
model.fit(trainX,
trainY, epochs=20, batch_size=batch_size, verbose=1) |
ÏÂͼչʾÁËÄâºÏ¹ý³ÌµÄÐÅÏ¢£º

Figure 16£ºLSTMÄâºÏ¹ý³ÌÐÅÏ¢
ÄÇôÕâ¸öÄ£Ð͵ÄÄâºÏЧ¹ûÈçºÎÄØ£¿

Figure 17£ºLSTMÄâºÏ½á¹û
ÎÒÃÇ¿´µ½ÄâºÏЧ¹û»¹²»´í¡£Æ½¾ù¾ø¶ÔÎó²î°Ù·Ö±È£¨MAPE£©Ö»ÓÐ25%²»µ½£¬±ÈÓô«Í³µÄSARIMAÄ£ÐÍЧ¹ûÒªºÃµã¡£Æä´Î£¬LSTMÄ£ÐÍÒ»´ÎÊä³öδÀ´24¸öʱ¼äµãµÄÔ¤²âÖµ£¬Ê¹ÓÃÆðÀ´±ÈÓÃSARIMAµü´úÔ¤²â·½±ãºÜ¶à¡£ÁíÍâÐèÒªÖ¸³öµÄÊÇÎÒÃÇÒ²¿ÉÒÔÖ±½ÓÔÚÄ£ÐÍÖÐÖ¸¶¨Ëðʧº¯ÊýΪMAPE£¬ÕâÑù¸üºÃÓÅ»¯ºâÁ¿Ö¸±ê¡£
С½á
ÔÚÕâÆª¶ÌÎÄÖУ¬ÎÒÃǽéÉÜÁËÒ»¸öĿǰÕýÔÚÁ÷ÐÐÆðÀ´µÄÉî¶Èѧϰ½¨Ä£»·¾³KERAS¡£Õâ¸ö½¨Ä£»·¾³Ïà¶ÔÓÚ´«Í³µÄ¼ÆËã»·¾³£¬±ÈÈçCNTK£¬TensorFlow£¬TheanoµÈ¾ßÓгéÏóÐԸߣ¬Ò×ÓÃÐԺõÄÌØµã£¬Í¬Ê±ÓÖÒÀÍÐÓÚÕ⼸ÖÖ¼ÆËã»·¾³£¬¾ßÓÐÒ»¶¨µÄ¿ÉÍØÕ¹ÐÔ£¬·Ç³£ÊʺÏÓÚ´ÓÊÂÉî¶ÈѧϰµÄʵ¼ùÕßʹÓá£
ÎÒÃÇ¿´µ½Ê¹ÓÃKERAS¿ÉÒԷdz£Ö±¹ÛµØÃèÊöÉñ¾ÍøÂç½á¹¹£¬¼¸ºõ¿ÉÒÔ´ïµ½Ëù¼û¼´ËùµÃµÄÇé¿ö¡£ÎÒÃÇÔÚÎÄÖл¹·Ö±ð½éÉÜÁËÈýÖÖÁ÷ÐеÄÓ¦ÓÃÁìÓò£¬·Ö±ðÊÇ£º
Éî¶ÈÍÆ¼öÄ£ÐÍ£¬ÔËÓÃǶÈë¼¼Êõ¿ÉÒÔ½«²»Í¬ÀàÐ͵ÄÐÅÏ¢Óлú½áºÏÔÚÒ»Æð¹¹ÔìÒ»¸öÉî¶ÈÉñ¾ÍøÂçÍÆ¼öϵͳ¡£
ͼÏñʶ±ðÄ£ÐÍ£¬ÔËÓöà²ã¾í»ýÉñ¾ÍøÂç¶ÔͼÏñ½øÐÐÇиî·ÖÎö£¬µÃµ½Ò»¸ö¾«¶ÈºÜºÃµÄÊÖдÊý×Ö·ÖÀàÆ÷¡£Í¬ÑùµÄ¼¼ÊõºÍÄ£ÐÍ¿ÉÒÔÖ±½ÓÒÆÖ²µ½ÆäËûÎïÌåʶ±ðÊý¾ÝÉÏ£¬±ÈÈçCIFAR10µÈ¡£ÎÒÃÇÒ²½éÉÜÁËÔËÓÃÒѾѵÁ·ºÃµÄÏÖ³ÉÄ£ÐͽøÐÐÇ¨ÒÆÑ§Ï°µÄÊֶΣ¬¼õÉÙÄâºÏµÄ²ÎÊýÁ¿£¬ÔÚ±£³ÖÒ»¶¨¾«¶ÈµÄÇé¿öÏÂÌá¸ßѵÁ·ËÙ¶È¡£
¼òµ¥Ê±¼äÐòÁÐÔ¤²âÄ£ÐÍ£¬ÔËÓó¤¶Ì¼ÇÒ䣨LSTM£©Éñ¾ÍøÂçÄ£ÐÍÀ´ÓÐЧԤ²â¾ß±¸Ò»¶¨ÖÜÆÚÐÔµÄʱ¼äÐòÁÐÄ£ÐÍ¡£Ò»¸ö·Ç³£¼òµ¥µÄµ¥²ãLSTMÄ£ÐͼȿÉÒÔ´ïµ½¶¨ÖƵÄSARIMAÄ£Ð͵ÄÔ¤²â¾«¶È¡£ |