質問編集履歴

1

質問事項をシンプルにしました。ソースを表記しました

2019/09/06 07:17

投稿

uekin_
uekin_

スコア11

test CHANGED
@@ -1 +1 @@
1
- Variational autoencoders 予測(predict実装
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
- ng_test = vae.predict(x_test_ng)
38
-
39
- vaeは学習に使用したモデルそのまま)
40
-
41
-
42
-
43
- 私の認識は,
44
-
45
- 学習済みのVAEで予測をする際には,
46
-
47
- 画像を入力し,エンコーダ部で2つのデータ(分散と平均)を取得し,
48
-
49
- デコーダ部で2つのデータから画像を新たに生成する
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
- 画像:50*50*1
76
-
77
- 学習:60000枚 epochs=3(少ししか学習させていません)
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))