2017-01-19 22 views
1

私は機械学習をPythonで勉強しています。 このコードはStandford Uivクラスからのものです。 私はこれらのコードを把握しようとしましたが失敗しました。私はこのラムダ関数を理解することができません

問題はloss_W = lambda W: self.loss(x,t)です。 それは本当ではありませんloss_W(1)またはloss_W(2)または何かが結果を変更できないのですか?

私はこれら2つのコードの結果が異なることを理解できません。

grads['W1'] = numerical_gradient(loss_W, self.params['W1']) 

grads['b1'] = numerical_gradient(loss_W, self.params['b1']) 


def numerical_gradient(f, x): 

    h = 1e-4 # 0.0001 
    grad = np.zeros_like(x) 

    for idx in range(x.size): 
     tmp_val = x[idx] 

     # f(x+h) 
     x[idx] = float(tmp_val) + h 
     fxh1 = f(x) 

     # f(x-h) 
     x[idx] = tmp_val - h 
     fxh2 = f(x) 

     grad[idx] = (fxh1 - fxh2)/(2*h) 
     x[idx] = tmp_val 

    return grad 

class TwoLayerNet: 

    def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01): 
     self.params = {} 
     self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size) 
     self.params['b1'] = np.zeros(hidden_size) 
     self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size) 
     self.params['b2'] = np.zeros(output_size) 

    def predict(self, x): 
     W1, W2 = self.params['W1'], self.params['W2'] 
     b1, b2 = self.params['b1'], self.params['b2'] 

     a1 = np.dot(x, W1) 
     z1 = sigmoid(a1) 
     a2 = np.dot(z1,W2) 
     y = softmax(a2) 

     return y 

    def loss(self, x, t): 
     y = self.predict(x) 
     return cross_entropy_error(y,t) 

    def accuracy(self, x,t): 
     y = self.predict(x) 
     y = np.argmax(y, axis=0) 
     t = np.argmax(t, axis=0) 
     data_len = len(x) 
     accuracy = np.sum(y==t)/float(data_len) 
     return accuracy 

    def numerical_gradient(self, x, t): 
     loss_W = lambda W: self.loss(x,t) 

     grads = {} 
     grads['W1'] = numerical_gradient(loss_W, self.params['W1']) 
     grads['b1'] = numerical_gradient(loss_W, self.params['b1']) 
     grads['W2'] = numerical_gradient(loss_W, self.params['W2']) 
     grads['b2'] = numerical_gradient(loss_W, self.params['b2']) 

     return grads 
+1

Umは、クラスメンバとトップレベル関数の両方として定義された 'numerical_gradient'ですか?私は '_numerical_gradient'(これはまったく呼び出されていないようです)について話しているわけではありません。 – Tagc

+0

申し訳ありませんが、_numerical_gradientはnumeric_gradientである必要があります。それは私の逃した と私はコードを編集しました。ありがとう – yunsoo

+0

クール。ですから、私の質問は、クラスメンバとトップレベルの関数の両方として 'numerical_gradient'を2回定義しているのでしょうか? – Tagc

答えて

0

このラムダだけでloss_W = lambda W: self.loss(x,t)Wの値から無関心です。

x = 1 # Just some random value 
t = 5 # Just some random value 

def simplified_lambda_function(W): 
    return (x,t) 

コードはあなたが投稿スニペットが外のどこかに

grads['W1'] = numerical_gradient(loss_W, self.params['W1']) 

grads['b1'] = numerical_gradient(loss_W, self.params['b1'] 

selfとしてクラス定義で、ここで定義されていないことを示します。この関数は次のように簡略化することができます。このため、彼らが本当に同一であるかどうかは確かではありませんが、そうである可能性が高いのは確かです。

+0

あなたの関数内では、名前空間はグローバルなもの(または外側のもの)であり、OPによって提供されるコードでは内部のものであり、関数内部のものです。 –

+0

はい、私はこれについていくつかの説明を追加しました。提供されたコードから、私たちは確信できません。 –

関連する問題