Реализуйте автоэнкодер с помощью tensorflow

Я хочу реализовать свой собственный код автоэнкодера, используя тензорный поток, изменив код: введите здесь описание ссылки Я хочу записать код в класс. Реализуемый мной класс:

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

И класс вызывается основной функцией:

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'

И я хочу знать, что не так с моим кодом? Заранее спасибо!

ЖК


person Qiang Zhang    schedule 18.09.2016    source источник


Ответы (1)


Проблема в том, что вам нужно использовать заполнитель, если вы хотите передать некоторые данные во время сеанса. Например:

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

Заполнители - это части графика, которые должны быть указаны словарём каналов во время сеанса.

Вы можете узнать о них больше здесь.

person Dmitriy Danevskiy    schedule 18.09.2016
comment
И у меня есть еще один вопрос: что я могу сделать, чтобы уложить 2 автокодера для предсказания регресса? Например, encoder1 = autoencoder1.encoderOp; encoder2 = autoencoder2.encoderOp; Как сделать в следующий раз с помощью двух автокодировщиков? Не могли бы вы дать мне демонстрацию? - person Qiang Zhang; 18.09.2016
comment
Не могли бы вы более точно описать архитектуру 2-кодера? - person Dmitriy Danevskiy; 18.09.2016
comment
В моем коде (класс AutoEncoder) я обучаю слой автоэнкодера. После завершения обучения я могу получить обученный слой, каждый слой: layer = tf.nn.sigmoid (...). Например, у меня есть два слоя: layer1, layer2. Но как я могу сложить два слоя, чтобы сформировать глубокую сеть? Насколько мне известно, я могу сложить два слоя следующим образом: deeplayer = tf.nn.sigmoid (tf.add (tf.matmul (layer1, layer2.Weight), layer2.biase)). Но я не знаю, как получить вес и смещение слоя. Спасибо! - person Qiang Zhang; 20.09.2016