遅々としてという点を除けば、順調に進んでおります。
第2章に入って、パーセプトロンを勉強中。まあ、まだまだ序の口ではありますが、
- AND/OR/NANDゲートの仕組み
- ANDゲートの実装
まで進みました。まあまあ順調。読んだところは理解できているという感じ。またしばらくほっとくと忘れそうですが。
で、今日書き残しておきたいのは、いかにもビギナーらしいミスをやらかしてデバッグの時間を浪費した顛末です。二度と繰り返さぬよう、戒めにしたい! #でも絶対やらかすだろうなあ
np.arrayを使ったANDゲートの実装
さて、今日のメインはANDゲートの実装です。掲載されたサンプルの入力と動作確認はまあ問題なし。以下のプログラムまで入力して、何をやっているのかは理解できました。
import numpy as np
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.75
tmp = np.sum(x * w) + b
if tmp <= 0:
return 0
elif tmp > 0:
return 1
print(AND(0, 0))
print(AND(1, 0))
print(AND(0, 1))
print(AND(1, 1))
ちなみに、AND関数の仮引数x1、x2は入力値。変数wのnp.arrayはそれぞれの入力値に対応した重みです。bはしきい値。バイアスだからbだそう。#勉強になります
本のサンプルはプロンプトで実行するのがベースなのか、AND(0, 0)
だけ入力して出力を確認しているようでしたが、一応あとからいじったりできるようにファイルに落とすようにしました。なので、出力はprint関数を使うようにしています。
三項演算子でハマったのかと思ったら論理演算子でした
ここまでは問題なかったのですが、ここからが生意気な話です。入力値によってパーセプトロンが発火する/しないというのを実装しようと思って、入力値と重みの計算結果が0だったら「シーン……」、1だったら「ドカーン!」とメッセージが出るようにしてみようと(工夫①)。
で、そうすると条件分岐が必要になって、その結果次第でメッセージが変わるというのなら、その判定を三項演算子を使った条件式にしてみようと(工夫②)。
三項演算子を使った条件式は、手元にあった『ビジネススキルとしてのプログラミングが8日で身につく本』に出ていたので、それを参考に。で、動かしてみたところ……。
そしたら、エラーが出てしまってなかなか解決できなくてねぇ…。
具体的には、上記のコードをこんな風に変えてみました。
import numpy as np
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.75
tmp = np.sum(x * w) + b
if tmp <= 0:
return 0
elif tmp > 0:
return 1
for i in range(2):
for j in range(2):
print(i, 'and', j, '->', AND(i, j))
message = 'silence...' if AND(i, j) = 0 else 'explosion!'
print(message)
print()
でもねぇ、まったく何も出力されなくってSyntax Error
が出るんですよ。
File "233_AND-01.py", line 17
message = 'silence...' if AND(in1, in2) = 0 else 'explosion!'
^
SyntaxError: invalid syntax
ってね。えーと、なんで???と、もう一度『ビジネススキル…』を読み直してもよくわからない。
で、落ち着いてエラーメッセージを読み直してみればif AND(in1, in2) = 0
の「=」のところに印がついているので、ここが悪いんだろうと。ここがSyntax Errorなんだろうと。
ここまで来れば、「=」だからダメなんで、「==」じゃなきゃダメじゃんということにようやく気が付いて…。もうね、Deep Learningがどうとか、numpyがどうとか、三項演算子がどうとか、そういうレベルではなく、条件式の中で一致を調べるときは「==」ですよと。1個じゃなくて2個ですよと。そういうところでつまずいてしまっていたというわけです。
一応、ここを修正したら
0 and 0 -> 0
silence...
0 and 1 -> 0
silence...
1 and 0 -> 0
silence...
1 and 1 -> 1
explosion!
と出力できましたとご報告しておきます。よかったよかった。
まだまだいろいろ身についていませんね、ということを身につまされた独学の2時間でございました。本当は三項演算子でelifは使えるのかなあとか実験したかったのですが、もう精根尽き果てました。==むずかしい。きっとまたやると思う…。