forked from fredgu2019/tensorflow-example
-
Notifications
You must be signed in to change notification settings - Fork 0
/
DenoisingAutoencoder.py
59 lines (46 loc) · 2.03 KB
/
DenoisingAutoencoder.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import tensorflow as tf
import numpy as np
import input_data
mnist_width = 28
n_visible = mnist_width * mnist_width
n_hidden = 500
corruption_level = 0.3
# 输入的一张图片用28x28=784的向量表示.
X = tf.placeholder("float", [None, n_visible], name='X')
# 用于将部分输入数据置为0
mask = tf.placeholder("float", [None, n_visible], name='mask')
# create nodes for hidden variables
W_init_max = 4 * np.sqrt(6. / (n_visible + n_hidden))
W_init = tf.random_uniform(shape=[n_visible, n_hidden],
minval=-W_init_max,
maxval=W_init_max)
# 编码器
W = tf.Variable(W_init, name='W')#shape:784x500
b = tf.Variable(tf.zeros([n_hidden]), name='b')#隐含层的偏置
#解码器
W_prime = tf.transpose(W)
b_prime = tf.Variable(tf.zeros([n_visible]), name='b_prime')
def model(X, mask, W, b, W_prime, b_prime):
tilde_X = mask * X # corrupted X
Y = tf.nn.sigmoid(tf.matmul(tilde_X, W) + b) # hidden state
Z = tf.nn.sigmoid(tf.matmul(Y, W_prime) + b_prime) # reconstructed input
return Z
# build model graph
Z = model(X, mask, W, b, W_prime, b_prime)
# create cost function
cost = tf.reduce_sum(tf.pow(X - Z, 2)) # minimize squared error
train_op = tf.train.GradientDescentOptimizer(0.02).minimize(cost) # construct an optimizer
# load MNIST data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
trX, trY, teX, teY = mnist.train.images, mnist.train.labels, mnist.test.images, mnist.test.labels
# Launch the graph in a session
with tf.Session() as sess:
# you need to initialize all variables
tf.initialize_all_variables().run()
for i in range(100):
for start, end in zip(range(0, len(trX), 128), range(128, len(trX)+1, 128)):
input_ = trX[start:end]
mask_np = np.random.binomial(1, 1 - corruption_level, input_.shape)
sess.run(train_op, feed_dict={X: input_, mask: mask_np})
mask_np = np.random.binomial(1, 1 - corruption_level, teX.shape)
print(i, sess.run(cost, feed_dict={X: teX, mask: mask_np}))