最初のニューラルネットワークの一つであるパーセプトロンは、単一のニューロンで構成されていますしかし、最初のannの一つはパーセプトロンとして知られており、単一のニューロンで構成されていました。
パーセプトロンの(唯一の)ニューロンの出力は、最終的な予測として機能します。
私たち自身のパーセプトロンをコード化しましょう:
import numpy as npclass Neuron:
def __init__(self, n_inputs, bias = 0., weights = None):
self.b = bias
if weights: self.ws = np.array(weights)
else: self.ws = np.random.rand(n_inputs)
def __call__(self, xs):
return self._f(xs @ self.ws + self.b)
def _f(self, x):
return max(x*.1, x)
(注:上記の例では学習アルゴリズムは含まれていません—別のチュートリアルで学習アルゴリズムをカバーします)
perceptron = Neuron(n_inputs = 3, bias = -0.1, weights = )perceptron()
では、ANNに非常に多くのニューロンが必要なのはなぜですか(分類子として)十分なものがあれば?
残念ながら、個々のニューロンは線形分離可能なデータを分類することしかできません。
しかし、ニューロンを組み合わせることによって、我々は本質的に彼らの決定境界を結 したがって、多くのニューロンで構成されるANNは、複雑な非線形決定境界を学習することができます。
ニューロンは、特定のネットワークアーキテクチャに従って一緒に接続されています。 アーキテクチャは異なりますが、ほぼすべてのアーキテクチャにレイヤーが含まれています。 (NB: 同じ層のニューロンは互いに接続しません)
通常、入力層があります(データ)、出力層(クラスの数に等しい数のニューロンを含む)、および非表示層(任意の数のニューロンを含む)。
ニューラルネットがより複雑な決定境界を学ぶことを可能にするために、複数の隠された層が存在することができます(複数の隠された層を持つ任意のニューラルネットは、より複雑な決定境界を学ぶことができます。深いニューラルネットと考えられている)。
この絵を描くために深いNNを構築することができます:
画像をダウンarray
!curl -O https://pmcvariety.files.wordpress.com/2018/04/twitter-logo.jpg?w=100&h=100&crop=1from PIL import Image
image = Image.open('twitter-logo.jpg?w=100')import numpy as np
image_array = np.asarray(image)
今、私たちのannにペイントを教えることは教師あり学習タスクなので、ラベル付きのトレーニングセットを作成する必要があります( 学習入力には2つの値(各ピクセルのx、y座標)があります。
画像の単純さを考えると、実際には二つの方法のいずれかでこの問題にアプローチすることができます。 分類問題(ニューラルネットは、ピクセルがxy座標を指定して”blue”クラスまたは”grey”クラスに属しているかどうかを予測する)または回帰問題(ニューラルネットは、座標を指定したピクセルのRGB値を予測する)。これを回帰問題として扱う場合:学習出力には3つの値(各ピクセルの正規化されたr、g、b値)があります。 -今のところ、この方法を使用してみましょう。
training_inputs,training_outputs = ,
for row,rgbs in enumerate(image_array):
for column,rgb in enumerate(rgbs):
training_inputs.append((row,column))
r,g,b = rgb
training_outputs.append((r/255,g/255,b/255))
今、私たちのANNを作成することができます:
- 入力層には2つのニューロンが必要です(2つの値があるため、x&y座標)。
- 出力層には3つのニューロンが必要です(学習する値は3つあります:r、g、b)。
- 隠された層の数と各隠された層のニューロンの数は、実験する二つのハイパーパラメータです(だけでなく、我々はそれを訓練するエポックの数、活性化関数など)—私は10個の隠された層と100個のニューロンを使用します(これは深いニューラルネットワークになります)
from sklearn.neural_network import MLPRegressorann = MLPRegressor(hidden_layer_sizes= tuple(100 for _ in range(10)))ann.fit(training_inputs, training_outputs)
訓練されたネットワークは今、任意の座標の正規化されたrgb値を予測することができます(これは深いニューラルネットワークになります)。例えば、x、y=1,1)。
ann.predict(])
array(])
ANNを使用してすべての座標のrgb値を予測し、画像全体の予測rgb値を表示して、それがどれだけうまくいったかを確認できます(質div>