質問編集履歴
1
質問事項をシンプルにしました。ソースを表記しました
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Variational autoencoders
|
1
|
+
Variational autoencoders test画像の入力方法
|
test
CHANGED
@@ -1,5 +1,13 @@
|
|
1
|
+
(全面的に書き換えました。よろしくお願いします)
|
2
|
+
|
3
|
+
|
4
|
+
|
1
5
|
VAEを使って,画像の異常検知を学んでいます。
|
2
6
|
|
7
|
+
(mnistの手書き文字のチュートリアル)
|
8
|
+
|
9
|
+
(具体的なコードは下記に示します。)
|
10
|
+
|
3
11
|
|
4
12
|
|
5
13
|
環境は
|
@@ -14,7 +22,51 @@
|
|
14
22
|
|
15
23
|
|
16
24
|
|
25
|
+
学習のコード部分は
|
26
|
+
|
27
|
+
vae.fit(x=x_train, y=None,
|
28
|
+
|
29
|
+
shuffle=True,
|
30
|
+
|
31
|
+
epochs=10,
|
32
|
+
|
33
|
+
batch_size=batch_size,
|
34
|
+
|
35
|
+
validation_data=(x_test, None))
|
36
|
+
|
37
|
+
となっています
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
【質問】
|
42
|
+
|
43
|
+
これで学習したモデルにtest画像を入力して,
|
44
|
+
|
45
|
+
その結果(再現された出力画像)を確認したいのですが,
|
46
|
+
|
17
|
-
|
47
|
+
どのようなコードを書けば良いのでしょうか?
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
result_test = vae.predict(x_test)
|
52
|
+
|
53
|
+
かと思ったのですが,これだと
|
54
|
+
|
55
|
+
出力画像=入力画像
|
56
|
+
|
57
|
+
の結果が出力されます
|
58
|
+
|
59
|
+
(未学習でも出力画像=入力画像の結果でした)
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
まだソースの内容など細かいことが理解できていない初心者です
|
64
|
+
|
65
|
+
よろしくお願いします
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
------------- 記 -------------
|
18
70
|
|
19
71
|
(mnistの手書き文字のチュートリアル)
|
20
72
|
|
@@ -22,62 +74,144 @@
|
|
22
74
|
|
23
75
|
|
24
76
|
|
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
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
77
|
+
|
78
|
+
|
79
|
+
img_shape = (28, 28, 1)
|
80
|
+
|
81
|
+
batch_size = 16
|
82
|
+
|
83
|
+
latent_dim = 2 # Dimensionality of the latent space: a plane
|
84
|
+
|
85
|
+
input_img = keras.Input(shape=img_shape)
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
x = layers.Conv2D(32, 3,padding='same', activation='relu')(input_img)
|
90
|
+
|
91
|
+
x = layers.Conv2D(64, 3,padding='same', activation='relu',strides=(2, 2))(x)
|
92
|
+
|
93
|
+
x = layers.Conv2D(64, 3,padding='same', activation='relu')(x)
|
94
|
+
|
95
|
+
x = layers.Conv2D(64, 3,padding='same', activation='relu')(x)
|
96
|
+
|
97
|
+
shape_before_flattening = K.int_shape(x)
|
98
|
+
|
99
|
+
x = layers.Flatten()(x)
|
100
|
+
|
101
|
+
x = layers.Dense(32, activation='relu')(x)
|
102
|
+
|
103
|
+
z_mean = layers.Dense(latent_dim)(x)
|
104
|
+
|
105
|
+
z_log_var = layers.Dense(latent_dim)(x)
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
def sampling(args):
|
112
|
+
|
113
|
+
z_mean, z_log_var = args
|
114
|
+
|
115
|
+
epsilon = K.random_normal(shape=(K.shape(z_mean)[0], latent_dim),mean=0., stddev=1.)
|
116
|
+
|
117
|
+
return z_mean + K.exp(z_log_var) * epsilon
|
118
|
+
|
119
|
+
z = layers.Lambda(sampling)([z_mean, z_log_var])
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
decoder_input = layers.Input(K.int_shape(z)[1:])
|
126
|
+
|
127
|
+
x = layers.Dense(np.prod(shape_before_flattening[1:]),activation='relu')(decoder_input)
|
128
|
+
|
129
|
+
x = layers.Reshape(shape_before_flattening[1:])(x)
|
130
|
+
|
131
|
+
x = layers.Conv2DTranspose(32, 3,padding='same', activation='relu',strides=(2, 2))(x)
|
132
|
+
|
133
|
+
x = layers.Conv2D(1, 3,padding='same', activation='sigmoid')(x)
|
134
|
+
|
135
|
+
decoder = Model(decoder_input, x)
|
136
|
+
|
137
|
+
z_decoded = decoder(z)
|
138
|
+
|
139
|
+
|
140
|
+
|
141
|
+
class CustomVariationalLayer(keras.layers.Layer):
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
def vae_loss(self, x, z_decoded):
|
146
|
+
|
147
|
+
x = K.flatten(x)
|
148
|
+
|
149
|
+
z_decoded = K.flatten(z_decoded)
|
150
|
+
|
151
|
+
xent_loss = keras.metrics.binary_crossentropy(x, z_decoded)
|
152
|
+
|
153
|
+
kl_loss = -5e-4 * K.mean(
|
154
|
+
|
155
|
+
1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1)
|
156
|
+
|
157
|
+
return K.mean(xent_loss + kl_loss)
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
def call(self, inputs):
|
162
|
+
|
163
|
+
x = inputs[0]
|
164
|
+
|
165
|
+
z_decoded = inputs[1]
|
166
|
+
|
167
|
+
loss = self.vae_loss(x, z_decoded)
|
168
|
+
|
169
|
+
self.add_loss(loss, inputs=inputs)
|
170
|
+
|
171
|
+
# We don't use this output.
|
172
|
+
|
173
|
+
return x
|
174
|
+
|
175
|
+
|
176
|
+
|
177
|
+
y = CustomVariationalLayer()([input_img, z_decoded])
|
178
|
+
|
179
|
+
|
180
|
+
|
181
|
+
|
182
|
+
|
183
|
+
|
184
|
+
|
185
|
+
vae = Model(input_img, y)
|
186
|
+
|
187
|
+
vae.compile(optimizer='rmsprop', loss=None)
|
188
|
+
|
189
|
+
vae.summary()
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
# Train the VAE on MNIST digits
|
194
|
+
|
195
|
+
(x_train, _), (x_test, y_test) = mnist.load_data()
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
x_train = x_train.astype('float32') / 255.
|
200
|
+
|
201
|
+
x_train = x_train.reshape(x_train.shape + (1,))
|
202
|
+
|
203
|
+
x_test = x_test.astype('float32') / 255.
|
204
|
+
|
205
|
+
x_test = x_test.reshape(x_test.shape + (1,))
|
206
|
+
|
207
|
+
|
208
|
+
|
209
|
+
vae.fit(x=x_train, y=None,
|
210
|
+
|
211
|
+
shuffle=True,
|
212
|
+
|
213
|
+
epochs=10,
|
214
|
+
|
215
|
+
batch_size=batch_size,
|
216
|
+
|
217
|
+
validation_data=(x_test, None))
|