2016-11-30 14 views
1

現時点では、this websiteに基づいたPythonの機械学習で遊んでいます(パート2は画像認識に関するものです)。機械学習の入出力サイズ

ニューラルネットワークは、単純に行列を乗算し、与えられた出力と認識された出力との間のデルタを計算し、重みを再計算することによって作成されます。マトリックス内にある。さて、私は入力として600x800ピクセル画像を持っているとしましょう。これをレイヤーマトリックスに乗算すると、出力として4x2マトリックスを得ることができません(各ポイントについてx,y)。

私の2番目の問題は、この問題に対してどのくらいの隠れたレイヤーが必要なのでしょうか?より多くのレイヤーが常に優れていますが、計算に時間がかかりますか?どれだけの隠れたレイヤーが必要か、いくつかの値をテストして、それを最大限に使うべきかを推測できますか?

私の現在のニューラルネットワークコード:

from os.path import isfile 
import numpy as np 

class NeuralNetwork: 

    def __init__(self): 
     np.random.seed(1) 
     self.syn0 = 2 * np.random.random((480000,8)) - 1 

    @staticmethod 
    def relu(x, deriv=False): 
     if(deriv): 
      res = np.maximum(x, 0) 
      return np.minimum(res, 1) 
     return np.maximum(x, 0) 

    def train(self, imgIn, out): 
     l1 = NeuralNetwork.relu(np.dot(imgIn, self.syn0)) 

     l1_error = out - l1 

     exp = NeuralNetwork.relu(l1,True) 
     l1_delta = l1_error * exp 

     self.syn0 += np.dot(imgIn.T,l1_delta) 
     return l1 #np.abs(out - l1) 

    def identify(self, img): 
     return NeuralNetwork.relu(np.dot(imgIn, self.syn0)) 

答えて

1

問題1.入力データ。

入力をシリアル化する必要があります。たとえば、1つの600 * 800ピクセルイメージがある場合、入力は1 * 480000(rows、cols)でなければなりません。 行はデータの数を意味し、列はデータの次元を意味します。

問題2分類。

4種類のクラスを分類する場合は、(1,4)ベクトルを出力に使用する必要があります。たとえば、4つのクラス( 'Fish'、 'C​​at'、 'Tiger'、 'C​​ar')があります。それからベクトル(1,0,0,0)はフィッシュを意味します。

問題3完全に接続されたネットワーク。

このホームページの例では、完全に接続されたネットワークを使用しています。一度分類するために全体画像を使用します。画像のサブセットで分類したい場合。畳み込みニューラルネットワークまたは他の方法を使用する必要があります。私はこれについてよく分かりません。

問題4ハイパーパラメータ

データによって異なります。さまざまなハイパーパラメータでテストする必要があります。最良のハイパーパラメータを選択します。

+0

それは私を助けました。ありがとうございました!しかし、今私は別の問題に直面しています:最初のレイヤー(最初はランダムに生成されたもの)でイメージを掛け合わせると、結果行列の値が大きくなり、nonlin(Sigmoid)メソッドの 'exp'関数は計算される。私はそれに近づけることができるアイデアですか?または、おそらくより良いシグモイド関数ですか? – Cilenco

+0

Relu機能を使用することができます。シグモイド関数は、勾配が消える問題があるため、現在は使用されていません。 ReLUはほとんどすべての状況に最適なソリューションです – Hulk

+0

ありがとうございます私はこれで試してみましょう! 'error_delta'を計算するためにこの関数の派生関数を使用していますか?これは' 0'または '1'なので、少し奇妙です。 – Cilenco