俺NNのデバッグが終えたと判断して、MNISTデータを使って学習させてみた。使ったネットワーク構成はDLfS通りで、2層で、[784,50,10]とした。データは10パターンを1セットとして、一回学習するごとに次の10パターンを使って勾配での学習(gradient_descent)を行わせた。1パターンの勾配演算と重み補正するのに数分かかり、夜間走らせて、朝に確認するということをやった。夜中走らせても350回ぐらいの学習に留まる。(350回だから、、読み込んだパターンは3500か?)この時の、損失、正解率が左のグラフ。損失は8から始まり、数回で2ぐらいまで下がるがそこからがなかなか改善されない。正しさ指数(accuracy)(100分率?にしていない正解率)は、0.1(正解率10%)から0.25(正解率25%)にすこしずつ上昇している様子。多分まともに動くには数日連続で走らせないと重みとバイアスは正しくならないと思われる。そこで、、ネットワークをバックアップ、リストアできる機能を付けた。
DLfSの教科書だと、多分、pickleを使ってるのだろうと思うけど、出力したネットワークを目視で読める方がいいだろうと思い、俺NNではJSON形式でバックアップ、リストアする実装とした。
最低限動いているというレベルですが、ご参考に、、JSONでネットワークデータを保存して読み込む実装例
def save_network(self,file_name): f = open(file_name,'w') dump_network={} dump_network['weight']=[None for j in range(self.n_of_layer)] dump_network['bias']=[None for j in range(self.n_of_layer)] for i in range(self.n_of_layer): dump_network['weight'][i]=(self.network['weight'][i]).tolist() dump_network['bias'][i]=(self.network['bias'][i]).tolist() json.dump(dump_network,f) f.close() def load_network(self,file_name): self.network['weight']=[None for j in range(self.n_of_layer)] self.network['bias']=[None for j in range(self.n_of_layer)] f = open(file_name) restore_network = json.load(f) for i in range(self.n_of_layer): self.network['weight'][i]=np.array(restore_network['weight'][i]) self.network['bias'][i]=np.array(restore_network['bias'][i]) f.close()