Некоторые проблемы при создании автоэнкодера в Tensorflow - PullRequest
0 голосов
/ 10 октября 2018
import numpy as np
from numpy.random import seed
import tensorflow as tf
from sklearn.model_selection import GridSearchCV,StratifiedKFold,train_test_split
trainset=(np.load('datasets/data_autoencoder_train.npz'))
trainset=trainset['x_ae_train']





n_input = tf.placeholder(tf.float32, (None, 28, 28, 1), name='inputs')
target = tf.placeholder(tf.float32, (None, 28, 28, 1), name='target')






#encoder
#now 28*28*1
layer_1 = tf.layers.conv2d(n_input,filters=32,kernel_size=(3,3),strides=1,padding='SAME',activation=tf.nn.relu)
#now 28*28*32
layer_2= tf.layers.max_pooling2d(layer_1,pool_size=(2,2),strides=2,padding='SAME')
#now 14*14*32
layer_3=tf.layers.conv2d(layer_2,filters=64,kernel_size=(3,3),strides=2,padding='SAME',activation=tf.nn.relu)
#now 7*7*64
layer_4=tf.layers.conv2d(layer_3,filters=64,kernel_size=(3,3),strides=1,padding='SAME',activation=tf.nn.relu)
#now 7*7*64
layer_5= tf.layers.max_pooling2d(layer_4,pool_size=(2,2),strides=2,padding='SAME')
#now 4*4*64



#decoder
layer_6=tf.image.resize_images(layer_5, size=(7,7),   method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)

#now 7*7*64

layer_7=tf.layers.conv2d(layer_6,filters=64,kernel_size=(3,3),strides=1,padding='SAME',activation=tf.nn.relu)
#now 7*7*64
layer_8=tf.layers.conv2d_transpose(layer_7,kernel_size=(3,3),strides=2,filters=32,padding='SAME',activation=tf.nn.relu)
#now 14*14*32

layer_9 =tf.image.resize_images(layer_8, size=(28,28), method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)

#now 28*28*32

outputlayer = tf.layers.conv2d_transpose(layer_9,filters=1,kernel_size=(3,3),strides=1,padding='SAME',activation=tf.nn.relu)




#now 28*28*1
cost = tf.reduce_mean(tf.square(tf.subtract(outputlayer, n_input)))


opt = tf.train.RMSPropOptimizer(learning_rate=learning_rate).minimize(cost)














epochs = 10000
batch_size = 1000




with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for e in range(epochs):
        for ii in range(0,(trainset.shape[0] // batch_size),batch_size):

        start = ii


        batch = trainset[start:start+batch_size]


        imgs = batch[0].reshape((-1, 28, 28, 1))



        batch_cost, _ = sess.run([cost, opt], feed_dict={n_input: imgs,target: imgs,learning_rate:0.001})



    print("Epoch: {}/{}...".format(e + 1, epochs),
      "Training loss: {:.4f}".format(batch_cost))

выше приведен мой код, когда я строю авто кодировщик, но я не получил желаемого результата (потеря очень высока).Я не знаю в чем проблема.Кроме того, наш учитель просит нас использовать гауссовский линейный модуль в качестве функции активации в выходном слое.Я не знаю, как мне поступить, так как я не нашел такой функции активации в tenorflow.Большое спасибо!

...