1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | import numpy as np # ½Ã±×¸ðÀ̵å ÇÔ¼ö def actf(x): return 1/(1+np.exp(-x)) # ½Ã±×¸ðÀ̵å ÇÔ¼öÀÇ ¹ÌºÐ°ª def actf_deriv(x): return x*(1-x) # XOR ¿¬»êÀ» À§ÇÑ 4Çà*2¿ÀÇ ÀÔ·Â Çà·Ä # ¸¶Áö¸· ¿Àº ¹ÙÀ̾¸¦ ³ªÅ¸³½´Ù. X = np.array([[0,0,1], [0,1,1], [1,0,1], [1,1,1]]) # XOR ¿¬»êÀ» À§ÇÑ 4Çà*1¿ÀÇ ¸ñÇ¥ Çà·Ä y = np.array([[0], [1], [1], [0]]) np.random.seed(5) inputs = 3 # ÀÔ·ÂÃþÀÇ ³ëµå °³¼ö hiddens = 6 # Àº´ÐÃþÀÇ ³ëµå °³¼ö outputs = 1 # Ãâ·ÂÃþÀÇ ³ëµå °³¼ö # °¡ÁßÄ¡¸¦ –1.0¿¡¼ 1.0 »çÀÌÀÇ ³¼ö·Î ÃʱâÈÇÑ´Ù. weight0 = 2*np.random.random((inputs, hiddens))-1 weight1 = 2*np.random.random((hiddens, outputs))-1 # ¹Ýº¹ÇÑ´Ù. for i in range(10000): # ¼ø¹æÇâ °è»ê layer0 = X # ÀÔ·ÂÀ» layer0¿¡ ´ëÀÔÇÑ´Ù. net1 = np.dot(layer0, weight0) # Çà·ÄÀÇ °öÀ» °è»êÇÑ´Ù. layer1 = actf(net1) # È°¼ºÈ ÇÔ¼ö¸¦ Àû¿ëÇÑ´Ù. layer1[:,-1] = 1.0 # ¸¶Áö¸· ¿Àº ¹ÙÀ̾¸¦ ³ªÅ¸³½´Ù. 1.0À¸·Î ¸¸µç´Ù. net2 = np.dot(layer1, weight1) # Çà·ÄÀÇ °öÀ» °è»êÇÑ´Ù. layer2 = actf(net2) # È°¼ºÈ ÇÔ¼ö¸¦ Àû¿ëÇÑ´Ù. # Ãâ·ÂÃþ¿¡¼ÀÇ ¿ÀÂ÷¸¦ °è»êÇÑ´Ù. layer2_error = layer2-y # Ãâ·ÂÃþ¿¡¼ÀÇ µ¨Å¸°ªÀ» °è»êÇÑ´Ù. layer2_delta = layer2_error*actf_deriv(layer2) # Àº´ÐÃþ¿¡¼ÀÇ ¿ÀÂ÷¸¦ °è»êÇÑ´Ù. # ¿©±â¼ T´Â Çà·ÄÀÇ ÀüÄ¡¸¦ ÀǹÌÇÑ´Ù. # ¿ª¹æÇâÀ¸·Î ¿ÀÂ÷¸¦ ÀüÆÄÇÒ ¶§´Â ¹Ý´ë¹æÇâÀ̹ǷΠÇà·ÄÀÌ ÀüÄ¡µÇ¾î¾ß ÇÑ´Ù. layer1_error = np.dot(layer2_delta, weight1.T) # Àº´ÐÃþ¿¡¼ÀÇ µ¨Å¸¸¦ °è»êÇÑ´Ù. layer1_delta = layer1_error*actf_deriv(layer1) # Àº´ÐÃþ->Ãâ·ÂÃþÀ» ¿¬°áÇÏ´Â °¡ÁßÄ¡¸¦ ¼öÁ¤ÇÑ´Ù. weight1 += -0.2*np.dot(layer1.T, layer2_delta) # ÀÔ·ÂÃþ->Àº´ÐÃþÀ» ¿¬°áÇÏ´Â °¡ÁßÄ¡¸¦ ¼öÁ¤ÇÑ´Ù. weight0 += -0.2*np.dot(layer0.T, layer1_delta) print(layer2) # ÇöÀç Ãâ·ÂÃþÀÇ °ªÀ» Ãâ·ÂÇÑ´Ù. | cs |