Skip to content

Commit f6df1b5

Browse files
committed
Autoencoder 모델을 조금 더 간단하게 하고 설명을 추가
1 parent 3dead28 commit f6df1b5

1 file changed

Lines changed: 20 additions & 35 deletions

File tree

03 - MNIST (CNN, Autoencoder)/04 - Autoencoder.py

Lines changed: 20 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@
1717
training_epoch = 20
1818
batch_size = 100
1919
# 신경망 레이어 구성 옵션
20-
n_hidden_1 = 256 # 첫번째 레이어의 특성 갯수
21-
n_hidden_2 = 128 # 두번째 레이어의 특성 갯수
20+
n_hidden = 256 # 히든 레이어의 특성 갯수
2221
n_input = 28*28 # 입력값 크기 - 이미지 픽셀수
2322

2423

@@ -30,44 +29,31 @@
3029

3130
# 인코더 레이어와 디코더 레이어의 가중치와 편향 변수를 설정합니다.
3231
# 다음과 같이 이어지는 레이어를 구성하기 위한 값들 입니다.
33-
# encode1 -> encode2 -> decode1 -> decode2
34-
# encode1 에서는 입력값보다 작은 값의 특성치를 갖게 하여 정보를 압축하고,
35-
# 최종적으로 decode2 의 출력을 입력값과 동일한 크기의 특성치를 갖도록 만듭니다.
36-
weights = {
37-
'encode1': tf.Variable(tf.random_normal([n_input, n_hidden_1])),
38-
'encode2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
39-
'decode1': tf.Variable(tf.random_normal([n_hidden_2, n_hidden_1])),
40-
'decode2': tf.Variable(tf.random_normal([n_hidden_1, n_input]))
41-
}
42-
43-
biases = {
44-
'encode1': tf.Variable(tf.random_normal([n_hidden_1])),
45-
'encode2': tf.Variable(tf.random_normal([n_hidden_2])),
46-
'decode1': tf.Variable(tf.random_normal([n_hidden_1])),
47-
'decode2': tf.Variable(tf.random_normal([n_input]))
48-
}
32+
# input -> encode -> decode -> output
33+
W_encode = tf.Variable(tf.random_normal([n_input, n_hidden]))
34+
b_encode = tf.Variable(tf.random_normal([n_hidden]))
35+
# encode 의 아웃풋 크기를 입력값보다 작은 크기로 만들어 정보를 압축하여 특성을 뽑아내고,
36+
# decode 의 출력을 입력값과 동일한 크기를 갖도록하여 입력과 똑같은 아웃풋을 만들어 내도록 합니다.
37+
# 히든 레이어의 구성과 특성치을 뽑아내는 알고리즘을 변경하여 다양한 오토인코더를 만들 수 있습니다.
38+
W_decode = tf.Variable(tf.random_normal([n_hidden, n_input]))
39+
b_decode = tf.Variable(tf.random_normal([n_input]))
4940

5041
# sigmoid 함수를 이용해 신경망 레이어를 구성합니다.
5142
# sigmoid(X * W + b)
5243
# 인코더 레이어 구성
53-
encode_layer_1 = tf.nn.sigmoid(
54-
tf.add(tf.matmul(X, weights['encode1']), biases['encode1']))
55-
encode_layer_2 = tf.nn.sigmoid(
56-
tf.add(tf.matmul(encode_layer_1, weights['encode2']), biases['encode2']))
57-
44+
encoder = tf.nn.sigmoid(
45+
tf.add(tf.matmul(X, W_encode), b_encode))
5846
# 디코더 레이어 구성
59-
decode_layer_1 = tf.nn.sigmoid(
60-
tf.add(tf.matmul(encode_layer_2, weights['decode1']), biases['decode1']))
61-
decode_layer_2 = tf.nn.sigmoid(
62-
tf.add(tf.matmul(decode_layer_1, weights['decode2']), biases['decode2']))
63-
47+
# 이 디코더가 최종 모델이 됩니다.
48+
decoder = tf.nn.sigmoid(
49+
tf.add(tf.matmul(encoder, W_decode), b_decode))
6450

65-
# 예측값을 최종 레이어의 출력값으로 설정합니다.
66-
prediction = decode_layer_2
67-
# Y 값, 즉 예측을 평가하기 위한 실제 값을 입력값으로 설정합니다.
51+
# 디코더는 인풋과 최대한 같은 결과를 내야 하므로,
52+
# 디코딩한 결과를 평가하기 위해 (손실 함수 구성을 위해)
53+
# 입력 값인 X 값을 평가를 위한 실측 결과 값으로 설정합니다. (안해도 됩니다만, 이해를 위해 작성)
6854
Y = X
6955

70-
cost = tf.reduce_mean(tf.pow(Y - prediction, 2))
56+
cost = tf.reduce_mean(tf.pow(Y - decoder, 2))
7157
optimizer = tf.train.RMSPropOptimizer(learning_rate).minimize(cost)
7258

7359

@@ -100,15 +86,14 @@
10086
######
10187
sample_size = 10
10288

103-
predicted_samples = sess.run(prediction,
104-
feed_dict={X: mnist.test.images[:sample_size]})
89+
samples = sess.run(decoder, feed_dict={X: mnist.test.images[:sample_size]})
10590

10691
fig, ax = plt.subplots(2, sample_size, figsize=(sample_size, 2))
10792

10893
for i in range(sample_size):
10994
ax[0][i].set_axis_off()
11095
ax[1][i].set_axis_off()
11196
ax[0][i].imshow(np.reshape(mnist.test.images[i], (28, 28)))
112-
ax[1][i].imshow(np.reshape(predicted_samples[i], (28, 28)))
97+
ax[1][i].imshow(np.reshape(samples[i], (28, 28)))
11398

11499
plt.show()

0 commit comments

Comments
 (0)