|
17 | 17 | training_epoch = 20 |
18 | 18 | batch_size = 100 |
19 | 19 | # 신경망 레이어 구성 옵션 |
20 | | -n_hidden_1 = 256 # 첫번째 레이어의 특성 갯수 |
21 | | -n_hidden_2 = 128 # 두번째 레이어의 특성 갯수 |
| 20 | +n_hidden = 256 # 히든 레이어의 특성 갯수 |
22 | 21 | n_input = 28*28 # 입력값 크기 - 이미지 픽셀수 |
23 | 22 |
|
24 | 23 |
|
|
30 | 29 |
|
31 | 30 | # 인코더 레이어와 디코더 레이어의 가중치와 편향 변수를 설정합니다. |
32 | 31 | # 다음과 같이 이어지는 레이어를 구성하기 위한 값들 입니다. |
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])) |
49 | 40 |
|
50 | 41 | # sigmoid 함수를 이용해 신경망 레이어를 구성합니다. |
51 | 42 | # sigmoid(X * W + b) |
52 | 43 | # 인코더 레이어 구성 |
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)) |
58 | 46 | # 디코더 레이어 구성 |
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)) |
64 | 50 |
|
65 | | -# 예측값을 최종 레이어의 출력값으로 설정합니다. |
66 | | -prediction = decode_layer_2 |
67 | | -# Y 값, 즉 예측을 평가하기 위한 실제 값을 입력값으로 설정합니다. |
| 51 | +# 디코더는 인풋과 최대한 같은 결과를 내야 하므로, |
| 52 | +# 디코딩한 결과를 평가하기 위해 (손실 함수 구성을 위해) |
| 53 | +# 입력 값인 X 값을 평가를 위한 실측 결과 값으로 설정합니다. (안해도 됩니다만, 이해를 위해 작성) |
68 | 54 | Y = X |
69 | 55 |
|
70 | | -cost = tf.reduce_mean(tf.pow(Y - prediction, 2)) |
| 56 | +cost = tf.reduce_mean(tf.pow(Y - decoder, 2)) |
71 | 57 | optimizer = tf.train.RMSPropOptimizer(learning_rate).minimize(cost) |
72 | 58 |
|
73 | 59 |
|
|
100 | 86 | ###### |
101 | 87 | sample_size = 10 |
102 | 88 |
|
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]}) |
105 | 90 |
|
106 | 91 | fig, ax = plt.subplots(2, sample_size, figsize=(sample_size, 2)) |
107 | 92 |
|
108 | 93 | for i in range(sample_size): |
109 | 94 | ax[0][i].set_axis_off() |
110 | 95 | ax[1][i].set_axis_off() |
111 | 96 | 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))) |
113 | 98 |
|
114 | 99 | plt.show() |
0 commit comments