皆さん、こんにちは
シニアTです
新しいGPUを導入したので、流行りのAI(torch)をマスターすることにしました
シニアT式のマスターの仕方は、たった一つ
プログラムを手で打ち込んで、動かしてみるんです
動いたら、ちょっとずつ改造していきます
改造するたびに、どこか引っ掛かりますから、それを解決していくと身に付ついていきますよね
ちょっとずつだし、消耗するけど・・・
今回は、
https://www.atmarkit.co.jp/ait/articles/2002/06/news025.htmlで、始めました
で、最初の改造・・・
class NeuralNetwork(nn.Module):
def __init__(self, nfs=[2,3,3,1]):
super(NeuralNetwork, self).__init__()
self.layers = [nn.Linear(nfs[i],nfs[i+1]) for i in range(len(nfs) - 1)]
self.activations = [torch.nn.Tanh() for _ in range(len(nfs) - 1)]
def forward(self, x):
for layer, activation in zip(self.layers, self.activations):
x = activation(layer(x))
return x
def parameters(self):
for layer in self.layers:
yield layer.weight
yield layer.bias
ちょっと(13行)とはいえ、NeuralNetwork全面的に書き換えて、parameters()を上書きしました
狙いは、
nn = NewralNetwork(nfs=[2,3,3,1])
などと、コンストラクタに与えるパラメータによって、ニューロンや層の数を設定できるようにすることです
で、学習データに
を与えると、ネットワークの構成によって学習結果がどうなるか
初心者(私)は、わくわくしますね
XY平面上(XtoYで2入力)の色(1出力)の、適当なサンプルで学習させた結果、XY平面全体は、どんな風に分類されるかの、実験です
まずはお手本と、同じネットワークになる設定、
nfs=[2,3,3,1]
2入力で、ニューロン3個のレイヤーが二つあって、そのあと色の値を出力する(1出力)っていう設定です
あれこんなふうに、たまに、失敗します
境界部分は、どんな風か気になりますよね。アナログで色付けしました
色が綺麗になっただけで同じですね(苦笑)。
実は、たいていはうまくいって・・・
間のレイヤーが3ニューロンだから三辺形になる
たまに失敗して二辺形(笑)になるのでしょう
だったら、nfs=[2,10,1]なら、ほぼ丸くなって、ほぼ必ず成功しそうな気がする
確かに・・・
で、これは、必ず失敗のはず
けど、面白いね