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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÓÃPython´ÓÍ·¿ªÊ¼ÊµÏÖÒ»¸öÉñ¾­ÍøÂç
 
·­Ò룺supermouse
  2131  次浏览      27
 2019-11-22
 
±à¼­ÍƼö:
ÎÄÕ½éÉÜÁËʵÏÖÒ»¸ö¼òµ¥µÄÈý²ãÉñ¾­ÍøÂçÒÔ¼°ÓÅ»¯Ëã·¨£¨±ÈÈçÌݶÈϽµ·¨£©µÄ¹¤×÷Ô­Àí£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚcsdn£¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼­¡¢ÍƼö¡£

ÔÚÕâÆªÎÄÕÂÖУ¬ÎÒÃǽ«½éÉÜΪʲôҪ´ÓÍ·¿ªÊ¼ÊµÏÖÉñ¾­ÍøÂçÄØ£¿¼´Ê¹Äã´òËãÒÔºóʹÓÃPyBrainÕâÑùµÄÉñ¾­ÍøÂç¿â£¬ÖÁÉÙÒ»´Î´ÓÍ·¿ªÊ¼ÊµÏÖÒ»¸öÉñ¾­ÍøÂçÒ²ÊÇÒ»¸ö¼«¾ß¼ÛÖµµÄÁ·Ï°£¬Õâ»á°ïÖúÄãÀí½âÉñ¾­ÍøÂçÊÇÔõô¹¤×÷µÄ£¬²¢ÇÒÈç¹ûÄãÏëÒªÉè¼Æ³ö¸ßЧµÄÉñ¾­ÍøÂçÄ£ÐÍ£¬×öÒ»¸öÕâÑùµÄÁ·Ï°Ò²ÊǺÜÓбØÒªµÄ¡£

ÐèҪעÒâµÄÒ»¼þÊÂÇéÊÇ£¬±¾ÆªÎÄÕµÄʾÀý´úÂëЧÂʲ¢²»¸ß£¬ËüµÄÄ¿µÄÊÇÒ×ÓÚ±»ÈËÀí½â¡£

Éú³ÉÊý¾Ý¼¯

Ê×ÏÈÎÒÃÇÉú³ÉÒ»¸ö¿ÉÒÔ²Ù×÷µÄÊý¾Ý¼¯£¬ÐÒÔ˵ÄÊÇ£¬scikit-learnÌṩÁËһЩÓÐÓõÄÊý¾Ý¼¯Éú³ÉÆ÷£¬ËùÒÔÎÒÃDz»ÐèÒª×Ô¼ºÐ´´úÂëÀ´Éú³ÉÊý¾Ý¼¯£¬Ö»ÐèʹÓÃmake_moonsÕâ¸öº¯Êý¾Í¿ÉÒÔ¡£

# Éú³ÉÊý¾Ý¼¯²¢»æÖƳöÀ´
np.random.seed(0)
X, y = sklearn.datasets.make_moons(200, noise=0.20)
plt.scatter(X[:,0], X[:,1], s=40, c=y, cmap=plt.cm.Spectral)

ÔÂÑÀÐÎ×´µÄ¡¢ÓÐÁ½ÀàÊý¾ÝµÄÊý¾Ý¼¯

ÎÒÃÇÉú³ÉµÄÊý¾Ý¼¯ÖÐÓÐÁ½ÖÖÀàÐ͵ÄÊý¾Ý£¬·Ö±ðÓúìµãºÍÀ¶µã±êʶÁ˳öÀ´¡£Äã¿ÉÒÔ½«À¶µãÊÓΪÄÐÐÔ»¼Õߣ¬½«ºìµãÊÓΪŮÐÔ»¼Õߣ¬²¢ÇÒ½«xÖáºÍyÖáÊÓΪҽÁÆ·½Ê½¡£

ÎÒÃǵÄÄ¿±êÊÇѵÁ·Ò»¸ö»úÆ÷ѧϰ·ÖÀàÆ÷£¬ÈÃËüÔÚx¡¢y×ø±êϵÏÂÔ¤²âÕýÈ·µÄÀà±ð£¨ÄÐÐÔ»òÕßÅ®ÐÔ£©¡£ÐèҪעÒâµÄÊÇÕâЩÊý¾Ý²»Äܱ»ÏßÐԷָÎÒÃÇÎÞ·¨»­³öÒ»ÌõÖ±Ïß½«ÕâÁ½ÖÖÀàÐ͵ÄÊý¾Ý·Ö¿ª£¬ÕâÒâζ×ÅÏßÐÔ·ÖÀàÆ÷£¨±ÈÈçLogistic»Ø¹é£©½«ÎÞ·¨ÄâºÏÕâЩÊý¾Ý£¬³ý·ÇÄãÊÖ¹¤Éè¼ÆµÄ·ÇÏßÐÔÌØÕ÷£¨Èç¶àÏîʽ£©£¬Îª¸ø¶¨µÄÊý¾Ý¼¯¹¤×÷Á¼ºÃ¡£

ÊÂʵÉÏ£¬Õâ¾ÍÊÇÉñ¾­ÍøÂçÖ÷ÒªµÄÓŵãÖ®Ò»£¬Äã²»±Øµ£ÐÄÌØÕ÷¹¤³Ì£¬Éñ¾­ÍøÂçµÄÒþ²Ø²ã½«»áΪÄãÑ§Ï°ÌØÕ÷¡£

Logistic»Ø¹é

ΪÁËÖ¤Ã÷ÕâÒ»µã£¬ÈÃÎÒÃÇѵÁ·Ò»¸öLogistic»Ø¹é·ÖÀàÆ÷¡£Õâ¸ö·ÖÀàÆ÷µÄÊäÈëÊÇ×ø±êx¡¢y£¬ËüµÄÊä³öÊÇÔ¤²âµÄÊý¾ÝÀàÐÍ£¨0»ò1£©¡£ÎªÁË·½±ã£¬ÎÒÃÇʹÓÃscikit-learnÖеÄLogistic RegressionÀà¡£

# Train the logistic rgeression classifier
clf = sklearn.linear_model.LogisticRegressionCV()
clf.fit(X, y)

# Plot the decision boundary
plot_decision_boundary(lambda x: clf.predict(x))
plt.title("Logistic Regression")

ÉÏͼÏÔʾÁËLogistic»Ø¹é·ÖÀàÆ÷ѧϰµÄ¾ö²ß±ß½ç£¬ËüÓÃÖ±Ïß¾¡¿ÉÄܵذÑÊý¾Ý·Ö¿ªÁË£¬µ«ÊDz¢Ã»Óв¶»ñÊý¾ÝµÄÔÂÑÀÐÎ×´¡£

ѵÁ·Ò»¸öÉñ¾­ÍøÂç

ÏÖÔÚÈÃÎÒÃǴһ¸ö3²ãµÄÉñ¾­ÍøÂ磬ÆäÖаüº¬1¸öÊäÈë²ã£¬1¸öÒþ²Ø²ãÒÔ¼°1¸öÊä³ö²ã¡£Êä³ö²ãµÄ½ÚµãÊýÈ¡¾öÓÚÎÒÃǵÄÊý¾ÝµÄά¶È£¬Ò²¾ÍÊÇ2£»ÀàËÆµØ£¬Êä³ö²ãµÄ½ÚµãÊýÈ¡¾öÓÚÎÒÃÇÓжàÉÙÀàÊý¾Ý£¬ÕâÀïÒ²ÊÇ2£¨ÒòΪÎÒÃÇÖ»ÓÐÁ½ÀàÊý¾Ý£¬ËùÒÔʵ¼ÊÉÏ¿ÉÒÔÖ»ÓÐÒ»¸öÊä³ö½Úµã£¬Êä³ö0»ò1£¬µ«ÊÇÓÐÁ½¸öÊä³ö½Úµã»áʹµÃÒÔºóÓжàÀàÊý¾ÝµÄʱºòÉñ¾­ÍøÂç¸üÈÝÒ×À©Õ¹£©¡£Éñ¾­ÍøÂçµÄÊäÈëÊÇx¡¢y×ø±ê£¬¶øÊä³öÊÇÁ½¸ö¸ÅÂÊ£¬Ò»¸öÊÇÀàÐÍΪ0£¨Å®ÐÔ»¼Õߣ©µÄ¸ÅÂÊ£¬ÁíÒ»¸öÊÇÀàÐÍΪ1£¨ÄÐÐÔ»¼Õߣ©µÄ¸ÅÂÊ¡£Õâ¸öÉñ¾­ÍøÂç¿´ÆðÀ´¾ÍÏñÏÂÃæÕâÑù£º

ÎÒÃÇ¿ÉÒÔ×Ô¼ºÑ¡ÔñÒþ²Ø²ãµÄά¶È£¨½ÚµãÊýÁ¿£©£¬Òþ²Ø²ã½ÚµãµÄÊýÁ¿Ô½¶à£¬ÎÒÃÇÄܹ»ÊÊÓ¦µÄ¹¦ÄܾÍÔ½¸´ÔÓ¡£µ«ÊǸßά¶È×ÜÊǰéËæ×Ÿ߳ɱ¾¡£Èç¹û½ÚµãÊýÁ¿ºÜ¶à£¬Ê×ÏÈ£¬ÎªÁËÔ¤²â½á¹ûÒÔ¼°Ñ§Ï°Éñ¾­ÍøÂç²ÎÊý£¬¾ÍÐèÒª½øÐдóÁ¿µÄ¼ÆË㣻Æä´Î£¬¸ü¶àµÄ²ÎÊýÊýÁ¿£¨ÒëÕß×¢£ºÒþ²Ø²ãµÄ²ÎÊýÁ¿ÊÇÓɸòã½ÚµãÊýºÍǰһ²ãµÄ½ÚµãÊý¾ö¶¨µÄ£©ÒâζןüÈÝÒ×Ôì³É¶ÔÊý¾ÝµÄ¹ý¶ÈÄâºÏ¡£

ÄÇô¸ÃÈçºÎÑ¡ÔñÒþ²Ø²ãµÄ½ÚµãÊýÄØ£¿¾¡¹ÜÓÐһЩͨÓÃÖ¸ÄϺͽ¨Ò飬µ«ÊÇÒþ²Ø²ãµÄ½ÚµãÊýͨ³£È¡¾öÓÚÄãÒª½â¾öµÄÌØ¶¨µÄÎÊÌ⣬ÓëÆä˵½ÚµãÊýµÄÑ¡ÔñÊÇÒ»ÃÅ¿ÆÑ§£¬²»Èç˵ËüÊÇÒ»ÃÅÒÕÊõ¡£ÎÒÃÇÉÔºó»á̽¾¿Òþ²Ø²ã½ÚµãµÄÊýÁ¿ÎÊÌ⣬²¢¹Û²ìËüÊÇÈçºÎÓ°ÏìÉñ¾­ÍøÂçµÄÊä³öµÄ¡£

ÎÒÃÇ»¹ÐèҪΪÒþ²Ø²ãÑ¡ÔñÒ»¸ö¼¤»îº¯Êý£¬¼¤»îº¯ÊýÓÃÀ´½«¸Ã²ãµÄÊäÈëת»»³ÉÊä³ö¡£·ÇÏßÐÔ¼¤»îº¯ÊýÄܹ»Ê¹ÎÒÃÇÄâºÏ·ÇÏßÐÔÊý¾Ý¡£³£Óõļ¤»îº¯ÊýÓÐtanh¡¢sigmoidÒÔ¼°RELUs£¬ÔÚÕâÀïÎÒÃÇʹÓÃtanh£¬ÒòΪËüÔںܶೡ¾°Öж¼±íÏֵúܺá£ÕâЩº¯Êý¶¼ÓÐÒ»¸öºÜ°ôµÄÌØÐÔ£¬ÄǾÍÊÇËüÃǵĵ¼Êý¶¼ÄÜÓÃËüÃDZ¾Éí±íʾ£¬±ÈÈ磬tanh(x)µÄµ¼ÊýÊÇ1?tanh2(x)1?tanh 2(x)£¬Õâ·Ç³£ÓÐÓã¬ÒòΪÎÒÃÇÖ»Òª¼ÆËãtanh(x)µÄÖµÒ»´Î£¬¾Í¿ÉÒÔÔÚ¶Ôtanh(x)Çóµ¼µÄʱºòÖØ¸´Ê¹ÓÃËü¡£

ÒòΪÎÒÃÇÏëÒªÈÃÉñ¾­ÍøÂçÊä³ö¸ÅÂÊ£¬ËùÒÔÊä³ö²ãµÄ¼¤»îº¯ÊýÎÒÃÇʹÓÃsoftmax£¬Ëü¿ÉÒÔ¼òµ¥µØ°ÑԭʼÊýֵת»»³É¸ÅÂÊ¡£Èç¹ûÄã¶ÔÂß¼­º¯ÊýºÜÊìϤ£¬ÄÇôÄã¿ÉÒÔ½«softmax¿´×÷ÊÇÂß¼­º¯ÊýÔÚ¶àÀàÐÍÖеÄÒ»°ã»¯Ó¦Óá£

Éñ¾­ÍøÂçÈçºÎ×ö³öÔ¤²â

ÎÒÃǵÄÉñ¾­ÍøÂçÀûÓÃÕýÏò´«²¥À´×ö³öÔ¤²â£¬ËùνÕýÏò´«²¥£¬¾ÍÊÇÖ¸Ò»×龨ÕóµÄÏà³ËÒÔ¼°ÎÒÃÇ֮ǰÌáµ½µÄ¼¤»îº¯ÊýµÄÓ¦Ó᣼ÙÉèxÊǶÔÉñ¾­ÍøÂçµÄ¶þάÊäÈ룬ÄÇôÎÒÃǰ´ÕÕÈçϲ½Öè¼ÆËãÎÒÃǵÄÔ¤²â½á¹û$ \hat{y}$£¨Î¬¶ÈÒ²ÊÇ2£©£º

ѧϰ²ÎÊý

ΪÉñ¾­ÍøÂçѧϰ²ÎÊýÒâζ×ÅÔÚѵÁ·Êý¾ÝÉÏѰÕÒ×î¼Ñ²ÎÊý(W1,b1,W2,b2£¬ÒԴ˴ﵽʹ´íÎó×îС»¯µÄÄ¿µÄ¡£µ«ÊÇÎÒÃÇÓ¦¸ÃÈçºÎ¶¨Òå¡°´íÎó¡±ÄØ£¿ÎÒÃǽ«ºâÁ¿´íÎóµÄº¯Êý³ÆÎªËðʧº¯Êý£¨loss function£©¡£¶ÔÓÚsoftmaxÊä³öÀ´Ëµ£¬Ò»¸ö³£ÓõÄÑ¡ÔñÊÇ·ÖÀཻ²æìØËðʧ£¨categorical cross-entropy loss£¬ÓÖ³ÆÎª¸º¶ÔÊýËÆÈ» negative log likelihood£©¡£Èç¹ûÎÒÃÇÓÐN¸öѵÁ·Ñù±¾£¬ÒÔ¼°C¸öÊä³öÀà±ð£¬ÄÇôÎÒÃǵÄÔ¤²â½á¹û$ \hat{y}Ïà¶ÔÓÚÕæÖµ±êÇ©Ïà¶ÔÓÚÕæÖµ±êÇ© y$µÄËðʧÊÇÕâÑù¶¨ÒåµÄ£º

Õâ¸ö¹«Ê½¿´ÆðÀ´¸´ÔÓ£¬ÆäʵËü×öµÄÊÂÇé¾ÍÊÇ×ܽáѵÁ·Ñù±¾£¬Èç¹ûÔ¤²â´íÁËÀàÐÍ£¬¾ÍÔö¼ÓËðʧ£¨ÒëÕß×¢£º´ÖÌ岿·ÖµÄÔ­ÎÄÈçÏ£ºsum over our training examples and add to the loss if we predicted the incorrect class. ÎÒ²»È·¶¨´ÖÌ岿·ÖÕâÑù·­ÒëÊÇ·ñºÏÊÊ£¬Èç¹ûÓÐÍøÓÑÓиüºÃµÄ·­Òë»¶Ó­Ö¸Õý£©¡£yy£¨ÕýÈ·µÄ±êÇ©£©ºÍy£¨ÎÒÃǵÄÔ¤²âÖµ£©µÄÊýÖµÏà²îÔ½´ó£¬ÎÒÃǵÄËðʧ¾ÍÔ½´ó¡£Í¨¹ýѰÕÒʹËðʧ×îС»¯µÄ²ÎÊý£¬ÎÒÃÇ¿ÉÒÔ×î´óÏ޶ȵØÌá¸ßѵÁ·Êý¾ÝµÄËÆÈ»¡£

ÎÒÃÇ¿ÉÒÔÓÃÌݶÈϽµ·¨À´Ñ°ÕÒËðʧº¯ÊýµÄ×îСֵ¡£ÎÒ»áÓù̶¨µÄѧϰÂÊʵÏÖÒ»¸ö×îÆÕͨ°æ±¾µÄÌݶÈϽµ·¨£¬Ò²³ÆÎªÅúÁ¿ÌݶÈϽµ·¨£¬ËüµÄ±ä»¯°æ±¾±ÈÈçËæ»úÌݶÈϽµ·¨ºÍСÅúÁ¿ÌݶÈϽµ·¨ÔÚʵ¼ùÖÐͨ³£±íÏֵøüºÃ£¬ËùÒÔÈç¹ûÄã¶Ô´ËÒªÇóÑϸñ£¬ÄÇôÄãÒ»¶¨»áÏëҪʹÓÃËüÃÇ£¬×îºÃËæ×Åʱ¼äµÄÍÆÒÆÔÙÅäºÏÒÔѧϰÂÊË¥¼õ¡£

×÷ΪÊäÈ룬ÌݶÈϽµ·¨ÐèÒª¼ÆËãËðʧº¯Êý¶ÔÓÚ²ÎÊýµÄÌݶȣ¨µ¼ÊýÏòÁ¿£©ÎÒÃÇÀûÓÃÖøÃûµÄ·´Ïò´«²¥Ëã·¨À´¼ÆËãÕâЩÌݶȣ¬´ÓÊä³ö¿ªÊ¼Ó÷´Ïò´«²¥¼ÆËãÌݶȻáºÜ¸ßЧ¡£¶ÔÓÚ·´Ïò´«²¥µÄ¹¤×÷Ô­Àí£¬ÎÒ²»»áÉîÈë½²½âÆäϸ½Ú£¬µ«ÊÇÍøÉÏÓкܶà³öÉ«µÄ½âÊÍ£¨ÕâÀï»òÕßÕâÀ¡£

ÏÂÃæµÄ¹«Ê½»á°ïÖúÎÒÃÇÓ¦Ó÷´Ïò´«²¥£¨ÕâÀïÇëÏàÐÅÎÒ£©£º

ʵÏÖ

ÏÖÔÚÎÒÃÇÒѾ­×¼±¸ºÃʵÏÖÒ»¸öÉñ¾­ÍøÂçÁË£¬ÎÒÃÇΪÌݶÈϽµ¶¨ÒåһЩ±äÁ¿ºÍ²ÎÊý£º

num_examples = len(X) # ѵÁ·Ñù±¾µÄÊýÁ¿
nn_input_dim = 2 # ÊäÈë²ãµÄά¶È
nn_output_dim = 2 # Êä³ö²ãµÄά¶È

# ÌݶÈϽµµÄ²ÎÊý£¨ÎÒÖ±½ÓÊÖ¶¯¸³Öµ£©
epsilon = 0.01 # ÌݶÈϽµµÄѧϰÂÊ
reg_lambda = 0.01 # ÕýÔò»¯µÄÇ¿¶È

Ê×ÏÈÎÒÃÇʵÏÖ֮ǰ¶¨ÒåµÄËðʧº¯Êý£¬ÎÒÃÇÓÃÕâ¸öËðʧº¯ÊýÀ´ºâÁ¿Ä£Ð͵Ť×÷³É¹ûÊÇ·ñÁîÈËÂúÒâ¡£

#°ïÖúÎÒÃÇÔÚÊý¾Ý¼¯ÉϹÀËã×ÜÌåËðʧµÄº¯Êý
def calculate_loss(model):
W1, b1, W2, b2 = model['W1'], model['b1'], model['W2'], model['b2']
#ÕýÏò´«²¥£¬¼ÆËãÔ¤²âÖµ
z1 = X.dot(W1) + b1
a1 = np.tanh(z1)
z2 = a1.dot(W2) + b2
exp_scores = np.exp(z2)
probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)
# ¼ÆËãËðʧ
corect_logprobs = -np.log(probs[range(num_examples), y])
data_loss = np.sum(corect_logprobs)
#ÔÚËðʧÉϼÓÉÏÕýÔòÏ¿ÉÑ¡£©
data_loss += reg_lambda/2 * (np.sum(np.square(W1)) + np.sum(np.square(W2)))
return 1./num_examples * data_loss

ÎÒÃÇ»¹ÊµÏÖÁËÒ»¸öº¯ÊýÓÃÀ´°ïÖúÎÒÃǼÆËãÉñ¾­ÍøÂçµÄÊä³ö£¬¾ÍÏñÎÒÃÇ֮ǰ¶¨ÒåµÄÄÇÑù£¬ÔÚº¯ÊýÄÚ²¿½øÐÐÕýÏò´«²¥£¬È»ºó·µ»Ø¸ÅÂÊ×î¸ßµÄÄǸöÀà±ð¡£

# Ô¤²âÊä³ö£¨0»ò1£©
def predict(model, x):
W1, b1, W2, b2 = model['W1'], model['b1'], model['W2'], model['b2']
# ÕýÏò´«²¥
z1 = x.dot(W1) + b1
a1 = np.tanh(z1)
z2 = a1.dot(W2) + b2
exp_scores = np.exp(z2)
probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)
return np.argmax(probs, axis=1)

×îºó£¬Õâ¸öº¯ÊýÓÃÀ´ÑµÁ·Éñ¾­ÍøÂ磬ËüÀûÓÃÎÒÃÇ֮ǰÌáµ½µÄ·´Ïò´«²¥µ¼ÊýÀ´ÊµÏÖÅúÁ¿ÌݶÈϽµ¡£

# Õâ¸öº¯ÊýΪÉñ¾­ÍøÂçѧϰ²ÎÊý²¢ÇÒ·µ»ØÄ£ÐÍ
# - nn_hdim: Òþ²Ø²ãµÄ½ÚµãÊý
# - num_passes: ͨ¹ýѵÁ·¼¯½øÐÐÌݶÈϽµµÄ´ÎÊý
# - print_loss: Èç¹ûÊÇTrue, ÄÇôÿ1000´Îµü´ú¾Í´òÓ¡Ò»´ÎËðʧֵ
def build_model(nn_hdim, num_passes=20000, print_loss=False):

# ÓÃËæ»úÖµ³õʼ»¯²ÎÊý¡£ÎÒÃÇÐèҪѧϰÕâЩ²ÎÊý
np.random.seed(0)
W1 = np.random.randn(nn_input_dim, nn_hdim) / np.sqrt(nn_input_dim)
b1 = np.zeros((1, nn_hdim))
W2 = np.random.randn(nn_hdim, nn_output_dim) / np.sqrt(nn_hdim)
b2 = np.zeros((1, nn_output_dim))

# ÕâÊÇÎÒÃÇ×îÖÕÒª·µ»ØµÄÊý¾Ý
model = {}

# ÌݶÈϽµ
for i in xrange(0, num_passes):

# ÕýÏò´«²¥
z1 = X.dot(W1) + b1
a1 = np.tanh(z1)
z2 = a1.dot(W2) + b2
exp_scores = np.exp(z2)
probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)

# ·´Ïò´«²¥
delta3 = probs
delta3[range(num_examples), y] -= 1
dW2 = (a1.T).dot(delta3)
db2 = np.sum(delta3, axis=0, keepdims=True)
delta2 = delta3.dot(W2.T) * (1 - np.power(a1, 2))
dW1 = np.dot(X.T, delta2)
db1 = np.sum(delta2, axis=0)

# Ìí¼ÓÕýÔòÏî (b1 ºÍ b2 ûÓÐÕýÔòÏî)
dW2 += reg_lambda * W2
dW1 += reg_lambda * W1

# ÌݶÈϽµ¸üвÎÊý
W1 += -epsilon * dW1
b1 += -epsilon * db1
W2 += -epsilon * dW2
b2 += -epsilon * db2

# ΪģÐÍ·ÖÅäеIJÎÊý
model = { 'W1': W1, 'b1': b1, 'W2': W2, 'b2': b2}

# Ñ¡ÔñÐԵشòÓ¡Ëðʧ
# ÕâÖÖ×ö·¨ºÜÉݳޣ¬ÒòΪÎÒÃÇÓõÄÊÇÕû¸öÊý¾Ý¼¯£¬ËùÒÔÎÒÃDz»Ïë̫Ƶ·±µØÕâÑù×ö
if print_loss and i % 1000 == 0:
print "Loss after iteration %i: %f" %(i, calculate_loss(model))

return model

Òþ²Ø²ã½ÚµãÊýΪ3µÄÉñ¾­ÍøÂç

µ±ÎÒÃÇѵÁ·Ò»¸öÒþ²Ø²ã½ÚµãÊýΪ3µÄÉñ¾­ÍøÂçʱ£¬ÈÃÎÒÃÇ¿´¿´»á·¢Éúʲô¡£

# ´î½¨Ò»¸ö3άÒþ²Ø²ãµÄÄ£ÐÍ
model = build_model(3, print_loss=True)

# »­³ö¾ö²ß±ß½ç
plot_decision_boundary(lambda x: predict(model, x))
plt.title("Decision Boundary for hidden layer size 3")

Yes£¡Õâ¿´ÆðÀ´ºÜ°ô¡£ÎÒÃǵÄÉñ¾­ÍøÂç·¢Ïֵľö²ß±ß½çÄܹ»³É¹¦µØÇø·ÖÊý¾ÝÀà±ð¡£

¸Ä±äÒþ²Ø²ãµÄ´óС

ÔÚÉÏÃæµÄÀý×ÓÖУ¬ÎÒÃÇÑ¡ÔñÁËÓÐÈý¸ö½ÚµãµÄÒþ²Ø²ã£¬ÏÖÔÚÈÃÎÒÃÇ¿´¿´¸Ä±äÒþ²Ø²ãµÄ´óС»áÈçºÎÓ°Ïì×îÖյĽá¹û¡£

plt.figure(figsize=(16, 32))
hidden_layer_dimensions = [1, 2, 3, 4, 5, 20, 50]
for i, nn_hdim in enumerate(hidden_layer_dimensions):
plt.subplot(5, 2, i+1)
plt.title('Hidden Layer size %d' % nn_hdim)
model = build_model(nn_hdim)
plot_decision_boundary(lambda x: predict(model, x))
plt.show()

ÎÒÃÇ¿ÉÒÔ¿´µ½µÍά¶ÈµÄÒþ²Ø²ã¿ÉÒԺܺõز¶»ñÊý¾ÝµÄ´óÖ±߽磬¶ø¸ßά¶ÈµÄÒþ²Ø²ãÔò¸üÒ׳öÏÖ¹ý¶ÈÄâºÏ¡£ÕýÈçÎÒÃÇÆÚ´ýµÄÄÇÑù£¬ËüÃÇ¡°¼Çס¡±ÁËÊý¾Ý²¢ÊÊÓ¦ÁËÊý¾ÝµÄ´óÖÂÐÎ×´¡£Èç¹ûÎÒÃǽÓÏÂÀ´ÔÚÒ»¸ö¶ÀÁ¢µÄ²âÊÔ¼¯ÉÏÆÀ¹ÀÎÒÃǵÄÄ£ÐÍ£¨ÊÂʵÉÏÄãÒ²Ó¦¸ÃÕâô×ö£©£¬µÍά¶ÈµÄÒþ²Ø²ã»á±íÏֵøüºÃ£¬ÒòΪËüÃǸüÒ»°ã»¯¡£ÎÒÃÇ¿ÉÒÔÀûÓøü¸ßÇ¿¶ÈµÄÕýÔò»¯À´µÖÏû¹ý¶ÈÄâºÏ£¬µ«ÊÇΪÒþ²Ø²ãÑ¡ÔñÒ»¸öÕýÈ·µÄ³ß´çÔòÊDZȽϡ°¾­¼Ã¡±µÄ½â¾ö°ì·¨¡£

Á·Ï°

ΪÁ˶ԴúÂë¸üÊìϤ£¬Äã¿ÉÒÔ³¢ÊÔ×öÏÂÃæÕâЩÊ£º

1.ÓÃСÅúÁ¿ÌݶÈϽµ·¨£¨Á˽â¸ü¶à£©¶ø²»ÊÇÅúÁ¿ÌݶÈϽµ·¨À´ÑµÁ·Éñ¾­ÍøÂç¡£ÔÚʵ¼ùÖУ¬Ð¡ÅúÁ¿ÌݶÈϽµ·¨Í¨³£»á±íÏֵøüºÃ¡£

2.ÎÒÃÇÔÚÌݶÈϽµÊ±ÓÃÁ˹̶¨µÄѧϰÂÊ??¡£Äã¿ÉÒÔΪÌݶÈϽµµÄѧϰÂÊ´´½¨Ò»¸öË¥¼õ¹ý³Ì£¨Á˽â¸ü¶à£©¡£

3.ÎÒÃÇÔÚÒþ²Ø²ãʹÓõļ¤»îº¯ÊýÊÇtanhtanh¡£ÓÃÆäËûµÄ¼¤»îº¯Êýʵ¼ùһϣ¨ÓÐһЩÔÚÉÏÃæÌáµ½ÁË£©¡£×¢Ò⣺¸Ä±ä¼¤»îº¯ÊýÒ²¾ÍÒâζ×ÅÒª¸Ä±ä·´Ïò´«²¥µ¼Êý¡£

4.°ÑÉñ¾­ÍøÂçµÄÊä³öÀà±ð´Ó2Ôö¼Óµ½3¡£Îª´ËÄãÐèÒªÉú³ÉÒ»¸öÀàËÆµÄÊý¾Ý¼¯¡£

½«Éñ¾­ÍøÂçÀ©Õ¹µ½4²ã¡£ÔÚÉñ¾­ÍøÂçµÄ²ãÊýÉÏÃæ×öÒ»ÏÂʵ¼ù¡£Ôö¼ÓÁíÍâÒ»¸öÒþ²Ø²ãÒâζ×ÅÄã²»½öÒªµ÷ÕûÕýÏò´«²¥µÄ´úÂ룬»¹Òªµ÷Õû·´Ïò´«²¥µÄ´úÂë¡£

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

»ùÓÚͼ¾í»ýÍøÂçµÄͼÉî¶Èѧϰ
×Ô¶¯¼ÝÊ»ÖеÄ3DÄ¿±ê¼ì²â
¹¤Òµ»úÆ÷ÈË¿ØÖÆÏµÍ³¼Ü¹¹½éÉÜ
ÏîĿʵս£ºÈçºÎ¹¹½¨ÖªÊ¶Í¼Æ×
 
Ïà¹ØÎĵµ

5GÈ˹¤ÖÇÄÜÎïÁªÍøµÄµäÐÍÓ¦ÓÃ
Éî¶ÈѧϰÔÚ×Ô¶¯¼ÝÊ»ÖеÄÓ¦ÓÃ
ͼÉñ¾­ÍøÂçÔÚ½»²æÑ§¿ÆÁìÓòµÄÓ¦ÓÃÑо¿
ÎÞÈË»úϵͳԭÀí
Ïà¹Ø¿Î³Ì

È˹¤ÖÇÄÜ¡¢»úÆ÷ѧϰ&TensorFlow
»úÆ÷ÈËÈí¼þ¿ª·¢¼¼Êõ
È˹¤ÖÇÄÜ£¬»úÆ÷ѧϰºÍÉî¶Èѧϰ
ͼÏñ´¦ÀíËã·¨·½·¨Óëʵ¼ù