2016-09-18 4 views
3

テンソルフローを使用して独自のオートエンコーダーコードを実装する場合は、コードを変更してください。enter link description hereクラスにコードを書きたいと思います。テンソルフローを使用してオートエンコーダーを実装する

import tensorflow as tf 

class AutoEncoder: 

    def __init__(self,input,hidden,learning_rate=0.01,training_epochs=50, 
       batch_size = 100, display_step = 10): 
     print('hello,world\n') 
     self.X = input 
     self.hidden = hidden 
     self.weights = [] 
     self.biases = [] 
     self.inputfeature = input.shape[1] 
     self.learning_rate = learning_rate 
     self.trainning_epochs = training_epochs 
     self.batch_size = batch_size 
     self.display_step = display_step 
    def initialPara(self): 
     weights = { 
      'encoder_h1': tf.Variable(tf.random_normal([self.inputfeature,self.hidden])), 
      'decoder_h1': tf.Variable(tf.random_normal([self.hidden,self.inputfeature])) 
     } 
     biases = { 
      'encoder_b1': tf.Variable(tf.random_normal([self.hidden])), 
      'decoder_b1': tf.Variable(tf.random_normal([self.inputfeature])) 
     } 
     self.weights = weights 
     self.biases = biases 
    def encoder(self,X): 
     layer = tf.nn.sigmoid(
      tf.add(
       tf.matmul(X, self.weights['encoder_h1']),self.biases['encoder_b1'] 
      ) 
     ) 
     return layer 
    def decoder(self,X): 
     layer = tf.nn.sigmoid(
      tf.add(
       tf.matmul(X, self.weights['decoder_h1']),self.biases['decoder_b1'] 
      ) 
     ) 
     return layer 

    def train(self): 

     X = self.X 
     batch_size = self.batch_size 

     self.initialPara() 

     encoder_op = self.encoder(X) 
     decoder_op = self.decoder(encoder_op) 

     y_pred = decoder_op 
     y_true = X 

     # define loss and optimizer, minimize the squared error 
     cost = tf.reduce_mean(
      tf.pow(y_true-y_pred,2) 
     ) 
     optimizer = tf.train.RMSPropOptimizer(self.learning_rate).minimize(cost) 

     init = tf.initialize_all_variables() 

     # launch the graph 
     with tf.Session() as sess: 
      sess.run(init) 
      total_batch = int(X.shape[0]/batch_size) 
      # training cycle 
      for epoch in range(self.trainning_epochs): 
       # loop over all batches 
       for i in range(total_batch): 
        batch_xs = X[i*batch_size:(i+1)*batch_size] 
        _, c = sess.run([optimizer, cost], feed_dict={X: batch_xs}) 
       #display logs per epoch step 
       if epoch % self.display_step == 0: 
        print("Epoch:", '%04d'%(epoch+1), 
          "cost=","{:.9f}".foramt(c)) 

      print("optimization finished!!") 

     self.encoderOp = encoder_op 
     self.decoderOp = decoder_op 

とクラスは、main関数によって呼び出されます:私は実装 クラスがある

from AutoEncoder import * 

import tensorflow as tf 
import tflearn.datasets.mnist as mnist 

from tensorflow.examples.tutorials.mnist import input_data 

X,Y,testX,testY = mnist.load_data(one_hot=True) 

autoencoder1 = AutoEncoder(X,10,learning_rate=0.01) 

autoencoder1.train() 

とエラーが発生します

Traceback (most recent call last): 
    File "/home/zhq/Desktop/AutoEncoder/main.py", line 13, in <module> 
    autoencoder1.train() 
    File "/home/zhq/Desktop/AutoEncoder/AutoEncoder.py", line 74, in train 
    _, c = sess.run([optimizer, cost], feed_dict={X: batch_xs}) 
TypeError: unhashable type: 'numpy.ndarray' 

そして、私が間違っているかを知りたいです私のコードで? ありがとうございます!

ZhQ

答えて

2

問題は、あなたがセッション中にいくつかのデータを送りたい場合は、プレースホルダを使用する必要があります。例:

self.X = tf.placeholder(tf.float32, [None, input_dim]) 

プレースホルダーは、セッション中にフィード辞書で指定されるグラフの一部です。

hereについてもっと読むことができます。

+0

もう1つ質問があります。回帰予測のために2つのオートエンコーダーをスタックするにはどうすればよいですか?たとえば、encoder1 = autoencoder1.encoderOp; encoder2 = autoencoder2.encoderOp;次に2つの自動エンコーダーを使用する方法は?デモをお願いしますか? –

+0

2エンコーダのアーキテクチャをより正確に記述できますか? –

+0

私のコード(AutoEncoderクラス)では、オートエンコーダレイヤを訓練します。トレーニングが終わったら、私は訓練された層を得ることができ、各層は層= tf.nn.sigmoid(...)である。例として、レイヤー1、レイヤー2の2つのレイヤーがあります。しかし、どうすれば2つのレイヤーを積み重ねて深いネットワークを形成できますか?私の知る限り、私は2つのレイヤーを積み重ねることができます:deeplayer = tf.nn.sigmoid(tf.add(tf.matmul(layer1、layer2.Weight)、layer2.biase))。しかし、私は層の重量とバイアスを得る方法を知らない。ありがとう! –

関連する問題