2016-11-22 7 views
0

私はTheanoベースの自動エンコーダを使ってGaussiansの1つの隠れたレイヤーからサンプルを入力しています。出力は入力と同じになると思っていましたが、達成していません。私は実装のためにthisチュートリアルに触発されています。隠れたレイヤーを1つしか持たないオートエンコーダーも出力の正確な複製を復元するのに十分ですか?あなたのコードでオートエンコーダが入力と同じ出力を持つのに十分な1つの隠れたレイヤー

` def train(self, n_epochs=100, mini_batch_size=1, learning_rate=0.01): 
    index = T.lscalar() 
    x=T.matrix('x') 
    params = [self.W, self.b1, self.b2] 
    hidden = self.activation_function(T.dot(x, self.W)+self.b1) 
    output = T.dot(hidden,T.transpose(self.W))+self.b2 
    output = self.output_function(output) 


    # Use mean square error 
    L = T.sum((x - output) ** 2) 
    cost = L.mean() 

    updates=[] 

    #Return gradient with respect to W, b1, b2. 
    gparams = T.grad(cost,params) 

    #Create a list of 2 tuples for updates. 
    for param, gparam in zip(params, gparams): 
     updates.append((param, param-learning_rate*gparam)) 

    #Train given a mini-batch of the data. 
    train = th.function(inputs=[index], outputs=cost, updates=updates, 
         givens={x:self.X[index:index+mini_batch_size,:]}) 
    import time 
    start_time = time.clock() 
    acc_cost = [] 
    for epoch in xrange(n_epochs): 

     #print "Epoch:", epoch 
     for row in xrange(0,self.m, mini_batch_size): 
      cost = train(row) 
     acc_cost.append(cost) 

    plt.plot(range(n_epochs), acc_cost) 
    plt.ylabel("cost") 
    plt.xlabel("epochs") 
    plt.show() 

    # Format input data for plotable format 
    norm_data = self.X.get_value() 
    plot_var1 = [] 
    plot_var1.append(norm_data[:,0]) 
    plot_var2 = [] 
    plot_var2.append(norm_data[:,1]) 
    plt.plot(plot_var1, plot_var2, 'ro') 

    # Hidden output 
    x=T.dmatrix('x') 
    hidden = self.activation_function(T.dot(x,self.W)+self.b1) 
    transformed_data = th.function(inputs=[x], outputs=[hidden]) 
    hidden_data = transformed_data(self.X.get_value()) 
    #print "hidden_output ", hidden_data[0] 

    # final output 
    y=T.dmatrix('y') 
    W = T.transpose(self.W) 
    output = self.activation_function(T.dot(y,W) + self.b2) 
    transformed_data = th.function(inputs=[y], outputs=[output]) 
    output_data = transformed_data(hidden_data[0])[0] 
    print "decoded_output ", output_data 

    # Format output data for plotable format 
    plot_var1 = [] 
    plot_var1.append(output_data[:,0]) 
    plot_var2 = [] 
    plot_var2.append(output_data[:,1]) 
    plt.plot(plot_var1, plot_var2, 'bo') 
    plt.show() 



' 
+0

理論的に1つの隠れ層MLPはユニバーサル関数近似であり、より深い層を使用することは最終的なモデル損失および一般化能力を改善する可能性がある。ただし、実装に問題がある可能性があります。あなたが使用したコードを提供できますか? – Kh40tiK

+0

コメントに数文字しか入力できないため、ここにコードを貼り付けることはできません – Shyamkkhadka

+0

トレーニングの損失曲線はどのように見えますか? – Kh40tiK

答えて

0

私のコードは次のようになりますあなたが入力と出力の両方に同じ重みを使用している

params = [self.W, self.b1, self.b2] 
    hidden = self.activation_function(T.dot(x, self.W)+self.b1) 
    output = T.dot(hidden,T.transpose(self.W))+self.b2 

。内容:

params = [self.W1, self.W2, self.b1, self.b2] 
    hidden = self.activation_function(T.dot(x, self.W1)+self.b1) 
    output = T.dot(hidden,self.W2)+self.b2 

オートエンコーダはPCAではありません。同じ体重を使いたい場合は、体重を直交させることをお勧めします。

そうしないと、より深いAEを作成することができます。 1つの独立した重み行列しかないので、提案されたモデルは3層MLPとしてユニバーサル関数近似器としてほとんど動作しない。

+0

まあ、私は1つの体重だけ必要と仮定します。他のレイヤー(出力レイヤー)では、単にウェイトをトランスポーズするためです。それは[ここ](http://deeplearning.net/tutorial/dA.html#autoencoders)と言われています。 wとw 'は束縛された重みであり、お互いに転置されているからです。あなたの答えでは、self.w2の転置を使うことの意義は何ですか? – Shyamkkhadka

+0

@Shyamkkhadka私の悪い、形が一致する限り転置する必要はない(あまりにも速くコピーしていた)。 2つの独立した重みを作ることのポイントは、3層のMLPであり、これはユニバーサル関数近似である。 AEに4つのウェイトがある場合は、2つのウェイトを相互に転置させることができます。 – Kh40tiK

+0

したがって、3層の単純な自動エンコーダを近似したい場合、2つの異なる重み(w1、w2)を使用する必要があります。そして私には、3層MLPのように見えます。それは自動エンコーダーの原則に従っていますか?私たちはお互いに重さを結びつけておくべきです(重さの転置)。 – Shyamkkhadka

関連する問題