前提
Pythonで単純パーセプトロンに誤り訂正学習法を組み合わせたNOTゲートの学習を行うプログラムを作っています。
実現したいこと
『乱数を用いてNOTゲートの入力(論理値(0,1)の組)と出力の組を10000組作り、配列data1に保存すし、戻り値に配列data1を返す』という動作を関数で定義する。
発生している問題
NOTゲートが作れない
該当のソースコード
Python
1# NOTゲートの誤り訂正学習 2import numpy as np 3 4#データ作成 5def preparedata(kk): 6 kk = 10000 7 nn = 2 8 xx = np.random.randint(0,2, (kk, nn)) 9 yy = xx[:, 0] ~ xx[:, 1] 10 return deta1 11 12# 重みの学習 13def weightlearning(wwold, errork, xxk, eta): 14 wwnew = wwold + eta*errork*xxk 15 16 return wwnew 17 18# 線形結合器 19def linearcombiner(ww, xxk): 20 y = np.dot(ww,xxk) 21 22 return y 23 24# 平均誤り 25def checkerrorrate(error, shiftlen, k): 26 if(k>shiftlen): 27 errorshift = np.abs(error[k+1-shiftlen:k]) 28 else: 29 errorshift = np.abs(error[0:k]) 30 errorave = np.average(errorshift) 31 32 return errorave 33 34# ステップ関数 35def stepfunction(x): 36 if x>=0: 37 return 1 38 else: 39 return 0 40 41# メイン関数 42def main(): 43 eta = 5.0e-1 44 epsilon = 0.001 45 shiftlen = 100 46 # データを読み込む. 47 notgatedata = deta1 48 xx = notgatedata["x"] 49 kk, nn = xx.shape 50 one = np.ones([kk,1]) 51 xx = np.concatenate((one, xx), 1) 52 kk, nn = xx.shape 53 zztrue = notgatedata["y"] 54 print("zztrue size=", zztrue.shape) 55 # 繰返し:学習過程 56 wwold = [0.0, 0.0, 0.0] 57 error = np.zeros(kk) 58 errorave = np.zeros(kk) 59 ww = np.empty([kk,nn]) 60 for k in range(kk): 61 yyk = linearcombiner(wwold, xx[k]) 62 zzk = stepfunction(yyk) 63 error[k] = zztrue[k] - zzk 64 errorave[k] = checkerrorrate(error, shiftlen, k) 65 print("k={0} zztrue={1:.4f} zz={2:.4f} errorave={3:.8f}".format(k, zztrue[k], zzk, errorave[k])) 66 if(k>shiftlen and errorave[k]<epsilon): 67 break 68 wwnew = weightlearning(wwold, error[k], xx[k], eta) 69 wwold = wwnew 70 ww[k,:] = wwold 71 # 重みの学習結果を表示 72 print("重みの学習結果: w0=", wwold[0], "w1=", wwold[1], "w2=", wwold[2]) 73
あなたの回答
tips
プレビュー