質問編集履歴
12
追加編集
test
CHANGED
File without changes
|
test
CHANGED
@@ -30,15 +30,19 @@
|
|
30
30
|
|
31
31
|
|
32
32
|
|
33
|
-
また、これはこの状況を再現するための実装のJupyter Noteboo
|
33
|
+
また、これはこの状況を再現するための実装のJupyter Notebookです。
|
34
34
|
|
35
35
|
https://colab.research.google.com/drive/1qH-gMq_MYq2J-yIsE5IngWixp9wvzrQ9?hl=ja#scrollTo=XRfxGOW3Oybz
|
36
36
|
|
37
37
|
|
38
38
|
|
39
|
-
|
39
|
+
(モデル更新後)
|
40
|
+
|
40
|
-
|
41
|
+
もしかしたらエポック数が足りないのかもしれないため、更に試してみます。
|
42
|
+
|
43
|
+
|
44
|
+
|
41
|
-
#Generator
|
45
|
+
#Generator(変更前)
|
42
46
|
|
43
47
|
```python
|
44
48
|
|
@@ -122,7 +126,7 @@
|
|
122
126
|
|
123
127
|
```
|
124
128
|
|
125
|
-
#Discriminator
|
129
|
+
#Discriminator(変更前)
|
126
130
|
|
127
131
|
```python
|
128
132
|
|
@@ -202,6 +206,140 @@
|
|
202
206
|
|
203
207
|
```
|
204
208
|
|
209
|
+
|
210
|
+
|
211
|
+
|
212
|
+
|
213
|
+
#Generator(変更前)
|
214
|
+
|
215
|
+
```python
|
216
|
+
|
217
|
+
def make_generator_model():
|
218
|
+
|
219
|
+
model = tf.keras.Sequential()
|
220
|
+
|
221
|
+
model.add(layers.Dense(32*32*3, use_bias=False, input_shape=(100,)))
|
222
|
+
|
223
|
+
model.add(layers.LeakyReLU())
|
224
|
+
|
225
|
+
|
226
|
+
|
227
|
+
model.add(layers.Reshape((32, 32, 3)))
|
228
|
+
|
229
|
+
assert model.output_shape == (None, 32, 32, 3) # Note: None is the batch size
|
230
|
+
|
231
|
+
|
232
|
+
|
233
|
+
model.add(layers.Conv2DTranspose(32, (4, 4), strides=(2, 2), padding='same', use_bias=False,kernel_initializer=tf.keras.initializers.RandomNormal(mean=0.0, stddev=0.2)))
|
234
|
+
|
235
|
+
assert model.output_shape == (None, 64, 64, 32)
|
236
|
+
|
237
|
+
model.add(layers.BatchNormalization())
|
238
|
+
|
239
|
+
model.add(layers.LeakyReLU())
|
240
|
+
|
241
|
+
|
242
|
+
|
243
|
+
model.add(layers.Conv2DTranspose(64, (4, 4), strides=(2, 2), padding='same', use_bias=False,kernel_initializer=tf.keras.initializers.RandomNormal(mean=0.0, stddev=0.2)))
|
244
|
+
|
245
|
+
assert model.output_shape == (None, 128, 128, 64)
|
246
|
+
|
247
|
+
model.add(layers.BatchNormalization())
|
248
|
+
|
249
|
+
model.add(layers.LeakyReLU())
|
250
|
+
|
251
|
+
|
252
|
+
|
253
|
+
model.add(layers.Conv2DTranspose(3, (4, 4), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))
|
254
|
+
|
255
|
+
assert model.output_shape == (None, 256, 256, 3)
|
256
|
+
|
257
|
+
|
258
|
+
|
259
|
+
return model
|
260
|
+
|
261
|
+
|
262
|
+
|
263
|
+
noise = tf.random.normal([1, 100])
|
264
|
+
|
265
|
+
generated_image = generator(noise, training=False)
|
266
|
+
|
267
|
+
generated_image[0]
|
268
|
+
|
269
|
+
|
270
|
+
|
271
|
+
plt.imshow(tf.cast((generated_image[0, :, :, :] + 1.0 ) * 127.5,'uint32')) #matlotlibです
|
272
|
+
|
273
|
+
```
|
274
|
+
|
275
|
+
#Discriminator(変更後)
|
276
|
+
|
277
|
+
```python
|
278
|
+
|
279
|
+
def make_discriminator_model():
|
280
|
+
|
281
|
+
model = tf.keras.Sequential()
|
282
|
+
|
283
|
+
model.add(layers.Conv2D(16,(5, 5), strides=(2, 2), padding='same',
|
284
|
+
|
285
|
+
input_shape=[256, 256, 3]))
|
286
|
+
|
287
|
+
model.add(layers.LeakyReLU())
|
288
|
+
|
289
|
+
|
290
|
+
|
291
|
+
model.add(layers.Conv2D(32, (5, 5), strides=(2, 2), padding='same'))
|
292
|
+
|
293
|
+
model.add(layers.LeakyReLU())
|
294
|
+
|
295
|
+
|
296
|
+
|
297
|
+
model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same'))
|
298
|
+
|
299
|
+
model.add(layers.LeakyReLU())
|
300
|
+
|
301
|
+
|
302
|
+
|
303
|
+
model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))
|
304
|
+
|
305
|
+
model.add(layers.LeakyReLU())
|
306
|
+
|
307
|
+
|
308
|
+
|
309
|
+
model.add(layers.Conv2D(256, (5, 5), strides=(2, 2), padding='same'))
|
310
|
+
|
311
|
+
model.add(layers.LeakyReLU())
|
312
|
+
|
313
|
+
|
314
|
+
|
315
|
+
model.add(layers.Conv2D(512, (5, 5), strides=(2, 2), padding='same'))
|
316
|
+
|
317
|
+
model.add(layers.LeakyReLU())
|
318
|
+
|
319
|
+
|
320
|
+
|
321
|
+
model.add(layers.Dense(1024))
|
322
|
+
|
323
|
+
model.add(layers.LeakyReLU())
|
324
|
+
|
325
|
+
|
326
|
+
|
327
|
+
model.add(layers.Flatten())
|
328
|
+
|
329
|
+
|
330
|
+
|
331
|
+
model.add(layers.Dense(1))
|
332
|
+
|
333
|
+
# model.add(Activation('sigmoid'))
|
334
|
+
|
335
|
+
|
336
|
+
|
337
|
+
return model
|
338
|
+
|
339
|
+
```
|
340
|
+
|
341
|
+
|
342
|
+
|
205
343
|
###学習無しの状態で表示される画像
|
206
344
|
|
207
345
|
![イメージ説明](a290f6150d47dd55d29733ea7234a434.png)
|
@@ -252,6 +390,12 @@
|
|
252
390
|
|
253
391
|
|
254
392
|
|
393
|
+
|
394
|
+
|
395
|
+
|
396
|
+
|
397
|
+
|
398
|
+
|
255
399
|
### 試したこと
|
256
400
|
|
257
401
|
|
11
Jupyterの追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -30,7 +30,9 @@
|
|
30
30
|
|
31
31
|
|
32
32
|
|
33
|
-
|
33
|
+
また、これはこの状況を再現するための実装のJupyter Notebooldです。
|
34
|
+
|
35
|
+
https://colab.research.google.com/drive/1qH-gMq_MYq2J-yIsE5IngWixp9wvzrQ9?hl=ja#scrollTo=XRfxGOW3Oybz
|
34
36
|
|
35
37
|
|
36
38
|
|
10
問題点をより正確に変更した
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
KerasのGANで
|
1
|
+
KerasのGANで常に同じ画像しか表示せず学習できません
|
test
CHANGED
@@ -30,6 +30,12 @@
|
|
30
30
|
|
31
31
|
|
32
32
|
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
|
33
39
|
#Generator
|
34
40
|
|
35
41
|
```python
|
@@ -222,13 +228,11 @@
|
|
222
228
|
|
223
229
|
|
224
230
|
|
225
|
-
for i in range(16):
|
226
|
-
|
227
|
-
|
231
|
+
for i in range(predictions.shape[0]):
|
228
232
|
|
229
233
|
plt.subplot(4, 4, i+1)
|
230
234
|
|
231
|
-
plt.imshow(tf.cast((predictions[i
|
235
|
+
plt.imshow(tf.cast((predictions[i] + 1 ) * 0.5 ,dtype='float32'))
|
232
236
|
|
233
237
|
plt.axis('off')
|
234
238
|
|
9
更に自分で工夫を加えたが解決しなかった
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
KerasのGANで
|
1
|
+
KerasのGANでモザイク状の画像しか表示せず学習できません
|
test
CHANGED
@@ -2,17 +2,23 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
+
何度も質問内容を変更して申し訳ありません。
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
|
10
|
+
|
5
11
|
皆様こんにちは。Tensorflow 2.0(Keras)のチュートリアルを参考にして画像生成を試みています。
|
6
12
|
|
7
13
|
256 * 256のRGB画像でのDCGANで画像生成をしていますが、Trainingしてもほとんど更新されず、16種類画像を表示しても同じ画像ばかり現れて新しい画像が生成できません。
|
8
14
|
|
9
15
|
|
10
16
|
|
11
|
-
https://www.tensorflow.org/tutorials/generative/dcgan?hl=ja のMNISTのGANを参考にしています。この場合、出力層などを変えながらciferAの画像を学習することができたため、
|
17
|
+
https://www.tensorflow.org/tutorials/generative/dcgan?hl=ja のMNISTのGANを参考にしています。この場合、出力層などを変えながらciferAの画像(ただし入出力画像の出力チャンネルを3にした)を学習することができたため、原因が分かりません。
|
12
|
-
|
13
|
-
|
14
|
-
|
18
|
+
|
19
|
+
|
20
|
+
|
15
|
-
問題があるところは、
|
21
|
+
問題があるところは、モデルと画像表示の部分だと思うのですが、その部分だけのコードだけで解決できるでしょうか。
|
16
22
|
|
17
23
|
コードが十分でなかった場合は追記いたします。よろしくおねがいします。
|
18
24
|
|
@@ -104,7 +110,7 @@
|
|
104
110
|
|
105
111
|
|
106
112
|
|
107
|
-
plt.imshow(generated_image[0]
|
113
|
+
plt.imshow(tf.cast((generated_image[0, :, :, :] + 1.0 ) * 127.5,'uint8')) #matlotlibです
|
108
114
|
|
109
115
|
```
|
110
116
|
|
@@ -164,31 +170,33 @@
|
|
164
170
|
|
165
171
|
model.add(layers.BatchNormalization())
|
166
172
|
|
173
|
+
|
174
|
+
|
167
|
-
|
175
|
+
model.add(layers.Flatten())
|
168
176
|
|
169
177
|
model.add(layers.Dense(1024))
|
170
178
|
|
171
179
|
model.add(layers.LeakyReLU())
|
172
180
|
|
181
|
+
model.add(Activation('relu'))
|
182
|
+
|
183
|
+
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
model.add(layers.Dense(1))
|
188
|
+
|
173
189
|
model.add(Activation('sigmoid'))
|
174
190
|
|
175
191
|
|
176
192
|
|
177
|
-
model.add(layers.Flatten())
|
178
|
-
|
179
|
-
model.add(layers.Dense(1))
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
193
|
return model
|
186
194
|
|
187
195
|
```
|
188
196
|
|
189
197
|
###学習無しの状態で表示される画像
|
190
198
|
|
191
|
-
![イメージ説明](f
|
199
|
+
![イメージ説明](a290f6150d47dd55d29733ea7234a434.png)
|
192
200
|
|
193
201
|
|
194
202
|
|
@@ -214,11 +222,13 @@
|
|
214
222
|
|
215
223
|
|
216
224
|
|
225
|
+
for i in range(16):
|
226
|
+
|
217
|
-
for i in range(predictions.shape[0]):
|
227
|
+
# for i in range(predictions.shape[0]):
|
218
228
|
|
219
229
|
plt.subplot(4, 4, i+1)
|
220
230
|
|
221
|
-
plt.imshow((predictions[i]
|
231
|
+
plt.imshow(tf.cast((predictions[i, :, :, :] + 1.0 ) * 127.5,'uint8')) #ここはintに変えました
|
222
232
|
|
223
233
|
plt.axis('off')
|
224
234
|
|
@@ -242,7 +252,7 @@
|
|
242
252
|
|
243
253
|
重みの初期値の変更、Generatorの出力のバイアスのあり・なしの変更、
|
244
254
|
|
245
|
-
kernel_initializer='random_normal'
|
255
|
+
kernel_initializer='random_normal'、Discriminatorの変更
|
246
256
|
|
247
257
|
### 補足情報(FW/ツールのバージョンなど)
|
248
258
|
|
8
質問文の変更
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
GAN
|
1
|
+
KerasのGANでGeneratorがモザイク状の画像しか表示せず学習できません
|
test
CHANGED
@@ -4,11 +4,13 @@
|
|
4
4
|
|
5
5
|
皆様こんにちは。Tensorflow 2.0(Keras)のチュートリアルを参考にして画像生成を試みています。
|
6
6
|
|
7
|
-
256 * 256のRGB画像でのDCGANで画像生成をしていますが、
|
7
|
+
256 * 256のRGB画像でのDCGANで画像生成をしていますが、Trainingしてもほとんど更新されず、16種類画像を表示しても同じ画像ばかり現れて新しい画像が生成できません。
|
8
|
-
|
9
|
-
|
8
|
+
|
10
|
-
|
9
|
+
|
10
|
+
|
11
|
-
https://www.tensorflow.org/tutorials/generative/dcgan?hl=ja のMNISTのGANを参考にしています。
|
11
|
+
https://www.tensorflow.org/tutorials/generative/dcgan?hl=ja のMNISTのGANを参考にしています。この場合、出力層などを変えながらciferAの画像を学習することができたため、Generatorの問題だと考えています。
|
12
|
+
|
13
|
+
|
12
14
|
|
13
15
|
問題があるところは、Generatorと画像表示の部分だと思うのですが、その部分だけのコードだけで解決できるでしょうか。
|
14
16
|
|
@@ -16,6 +18,12 @@
|
|
16
18
|
|
17
19
|
|
18
20
|
|
21
|
+
GeneratorとDiscriminatorだけですが、この論文の実装をイメージしています。
|
22
|
+
|
23
|
+
https://www.researchgate.net/publication/331200586_Bidirectional_Face_Aging_Synthesis_Based_on_Improved_Deep_Convolutional_Generative_Adversarial_Networks
|
24
|
+
|
25
|
+
|
26
|
+
|
19
27
|
#Generator
|
20
28
|
|
21
29
|
```python
|
@@ -32,194 +40,196 @@
|
|
32
40
|
|
33
41
|
model.add(layers.Reshape((4, 4, 1024)))
|
34
42
|
|
43
|
+
model.add(layers.Conv2DTranspose(1024, (5, 5), strides=(1, 1), padding='same', use_bias=False,activation='relu',kernel_initializer='random_normal'))
|
44
|
+
|
45
|
+
assert model.output_shape == (None, 4, 4, 1024)
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
model.add(layers.Conv2DTranspose(512, (5, 5), strides=(2, 2), padding='same'))
|
50
|
+
|
51
|
+
model.add(layers.ReLU())
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
model.add(layers.Conv2DTranspose(256, (5, 5), strides=(2, 2), padding='same'))
|
56
|
+
|
57
|
+
model.add(layers.ReLU())
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
model.add(layers.Conv2DTranspose(128, (5, 5), strides=(2, 2), padding='same'))
|
64
|
+
|
65
|
+
model.add(layers.ReLU())
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same'))
|
70
|
+
|
71
|
+
model.add(layers.ReLU())
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
model.add(layers.Conv2DTranspose(32, (5, 5), strides=(2, 2), padding='same'))
|
76
|
+
|
77
|
+
model.add(layers.ReLU())
|
78
|
+
|
79
|
+
assert model.output_shape == (None, 128, 128, 32)
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
model.add(layers.Conv2DTranspose(3, (5, 5), strides=(2, 2), padding='same'))
|
84
|
+
|
85
|
+
model.add(Activation('tanh'))
|
86
|
+
|
87
|
+
assert model.output_shape == (None, 256, 256, 3)
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
return model
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
generator = make_generator_model()
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
noise = tf.random.normal([1, 100])
|
100
|
+
|
101
|
+
generated_image = generator(noise, training=False)
|
102
|
+
|
103
|
+
generated_image[0]
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
plt.imshow(generated_image[0] * 0.5 + 0.5) #matlotlibです
|
108
|
+
|
109
|
+
```
|
110
|
+
|
111
|
+
#Discriminator
|
112
|
+
|
113
|
+
```python
|
114
|
+
|
115
|
+
def make_discriminator_model():
|
116
|
+
|
117
|
+
model = tf.keras.Sequential()
|
118
|
+
|
119
|
+
model.add(layers.Conv2D(16, (5, 5), strides=(2, 2), padding='same',
|
120
|
+
|
121
|
+
input_shape=[256, 256, 3]))
|
122
|
+
|
123
|
+
model.add(layers.LeakyReLU())
|
124
|
+
|
125
|
+
model.add(layers.BatchNormalization())
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
model.add(layers.Conv2D(32, (5, 5), strides=(2, 2), padding='same'))
|
130
|
+
|
131
|
+
model.add(layers.LeakyReLU())
|
132
|
+
|
133
|
+
model.add(layers.BatchNormalization())
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same'))
|
138
|
+
|
139
|
+
model.add(layers.LeakyReLU())
|
140
|
+
|
141
|
+
model.add(layers.BatchNormalization())
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))
|
146
|
+
|
147
|
+
model.add(layers.LeakyReLU())
|
148
|
+
|
149
|
+
model.add(layers.BatchNormalization())
|
150
|
+
|
151
|
+
|
152
|
+
|
153
|
+
model.add(layers.Conv2D(256, (5, 5), strides=(2, 2), padding='same'))
|
154
|
+
|
155
|
+
model.add(layers.LeakyReLU())
|
156
|
+
|
157
|
+
model.add(layers.BatchNormalization())
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
model.add(layers.Conv2D(512, (5, 5), strides=(2, 2), padding='same'))
|
162
|
+
|
163
|
+
model.add(layers.LeakyReLU())
|
164
|
+
|
165
|
+
model.add(layers.BatchNormalization())
|
166
|
+
|
35
167
|
|
36
168
|
|
37
|
-
|
38
|
-
|
39
|
-
model.add(layers.
|
169
|
+
model.add(layers.Dense(1024))
|
40
|
-
|
170
|
+
|
41
|
-
model.add(layers.ReLU())
|
171
|
+
model.add(layers.LeakyReLU())
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
172
|
+
|
46
|
-
|
47
|
-
model.add(layers.ReLU())
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
model.add(layers.Conv2DTranspose(128, (5, 5), strides=(2, 2), padding='same'))
|
54
|
-
|
55
|
-
model.add(layers.ReLU())
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same'))
|
60
|
-
|
61
|
-
model.add(layers.ReLU())
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
model.add(layers.Conv2DTranspose(32, (5, 5), strides=(2, 2), padding='same'))
|
66
|
-
|
67
|
-
model.add(layers.ReLU())
|
68
|
-
|
69
|
-
assert model.output_shape == (None, 128, 128, 32)
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
model.add(layers.Conv2DTranspose(3, (5, 5), strides=(2, 2), padding='same'))
|
74
|
-
|
75
|
-
model.add(Activation('
|
173
|
+
model.add(Activation('sigmoid'))
|
76
|
-
|
174
|
+
|
175
|
+
|
176
|
+
|
77
|
-
|
177
|
+
model.add(layers.Flatten())
|
178
|
+
|
179
|
+
model.add(layers.Dense(1))
|
180
|
+
|
181
|
+
|
78
182
|
|
79
183
|
|
80
184
|
|
81
185
|
return model
|
82
186
|
|
83
|
-
|
84
|
-
|
85
|
-
generator = make_generator_model()
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
noise = tf.random.normal([1, 100])
|
90
|
-
|
91
|
-
generated_image = generator(noise, training=False)
|
92
|
-
|
93
|
-
generated_image[0]
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
plt.imshow(generated_image[0] * 0.5 + 0.5) #matlotlibです
|
98
|
-
|
99
187
|
```
|
100
188
|
|
101
|
-
#
|
189
|
+
###学習無しの状態で表示される画像
|
190
|
+
|
191
|
+
![イメージ説明](f9450a43b1add821672c8124d714533f.png)
|
192
|
+
|
193
|
+
|
194
|
+
|
195
|
+
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
### こちらは、先述の公式MNIST実装のコードをほとんどコピーした、カラー画像が表示できるはずのコードですが、ほとんど同じようなほぼ一色の画像が表示されます。
|
102
200
|
|
103
201
|
```python
|
104
202
|
|
105
|
-
def
|
203
|
+
def generate_and_save_images(model, epoch, test_input):
|
204
|
+
|
106
|
-
|
205
|
+
# Notice `training` is set to False.
|
206
|
+
|
207
|
+
# This is so all layers run in inference mode (batchnorm).
|
208
|
+
|
209
|
+
predictions = model(test_input, training=False)
|
210
|
+
|
211
|
+
|
212
|
+
|
107
|
-
|
213
|
+
fig = plt.figure(figsize=(4,4))
|
108
|
-
|
214
|
+
|
215
|
+
|
216
|
+
|
109
|
-
|
217
|
+
for i in range(predictions.shape[0]):
|
110
|
-
|
218
|
+
|
111
|
-
|
219
|
+
plt.subplot(4, 4, i+1)
|
112
|
-
|
113
|
-
|
220
|
+
|
114
|
-
|
115
|
-
model.add(layers.BatchNormalization())
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
221
|
+
plt.imshow((predictions[i] * 0.5 + 0.5)) #ここは投稿の後から変更しました。
|
120
|
-
|
121
|
-
|
222
|
+
|
122
|
-
|
123
|
-
model.add(layers.BatchNormalization())
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same'))
|
128
|
-
|
129
|
-
model.add(layers.LeakyReLU())
|
130
|
-
|
131
|
-
model.add(layers.BatchNormalization())
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))
|
136
|
-
|
137
|
-
model.add(layers.LeakyReLU())
|
138
|
-
|
139
|
-
model.add(layers.BatchNormalization())
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
model.add(layers.Conv2D(256, (5, 5), strides=(2, 2), padding='same'))
|
144
|
-
|
145
|
-
model.add(layers.LeakyReLU())
|
146
|
-
|
147
|
-
model.add(layers.BatchNormalization())
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
model.add(layers.Conv2D(512, (5, 5), strides=(2, 2), padding='same'))
|
152
|
-
|
153
|
-
model.add(layers.LeakyReLU())
|
154
|
-
|
155
|
-
model.add(layers.BatchNormalization())
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
model.add(layers.Dense(1024))
|
160
|
-
|
161
|
-
model.add(layers.LeakyReLU())
|
162
|
-
|
163
|
-
|
223
|
+
plt.axis('off')
|
164
|
-
|
165
|
-
|
166
|
-
|
224
|
+
|
225
|
+
|
226
|
+
|
167
|
-
|
227
|
+
plt.savefig('image_at_epoch_{:04d}.png'.format(epoch))
|
168
|
-
|
169
|
-
|
228
|
+
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
229
|
+
plt.show()
|
176
230
|
|
177
231
|
```
|
178
232
|
|
179
|
-
###学習無しの状態で表示される画像
|
180
|
-
|
181
|
-
![イメージ説明](f9450a43b1add821672c8124d714533f.png)
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
### こちらは、先述の公式MNIST実装のコードをほとんどコピーした、カラー画像が表示できるはずのコードですが、ほとんど同じようなほぼ一色の画像が表示されます。
|
190
|
-
|
191
|
-
```python
|
192
|
-
|
193
|
-
def generate_and_save_images(model, epoch, test_input):
|
194
|
-
|
195
|
-
# Notice `training` is set to False.
|
196
|
-
|
197
|
-
# This is so all layers run in inference mode (batchnorm).
|
198
|
-
|
199
|
-
predictions = model(test_input, training=False)
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
fig = plt.figure(figsize=(4,4))
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
for i in range(predictions.shape[0]):
|
208
|
-
|
209
|
-
plt.subplot(4, 4, i+1)
|
210
|
-
|
211
|
-
plt.imshow((predictions[i] * 0.5 + 0.5)) #ここは投稿の後から変更しました。
|
212
|
-
|
213
|
-
plt.axis('off')
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
plt.savefig('image_at_epoch_{:04d}.png'.format(epoch))
|
218
|
-
|
219
|
-
plt.show()
|
220
|
-
|
221
|
-
```
|
222
|
-
|
223
233
|
###結果的に表示された画像(140エポック)
|
224
234
|
|
225
235
|
![イメージ説明](65823c15d5250a2aa24cfcfc59aaa91b.png)
|
7
Discriminatorも追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -98,7 +98,83 @@
|
|
98
98
|
|
99
99
|
```
|
100
100
|
|
101
|
-
|
101
|
+
#Discriminator
|
102
|
+
|
103
|
+
```python
|
104
|
+
|
105
|
+
def make_discriminator_model():
|
106
|
+
|
107
|
+
model = tf.keras.Sequential()
|
108
|
+
|
109
|
+
model.add(layers.Conv2D(16, (5, 5), strides=(2, 2), padding='same',
|
110
|
+
|
111
|
+
input_shape=[256, 256, 3]))
|
112
|
+
|
113
|
+
model.add(layers.LeakyReLU())
|
114
|
+
|
115
|
+
model.add(layers.BatchNormalization())
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
model.add(layers.Conv2D(32, (5, 5), strides=(2, 2), padding='same'))
|
120
|
+
|
121
|
+
model.add(layers.LeakyReLU())
|
122
|
+
|
123
|
+
model.add(layers.BatchNormalization())
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same'))
|
128
|
+
|
129
|
+
model.add(layers.LeakyReLU())
|
130
|
+
|
131
|
+
model.add(layers.BatchNormalization())
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))
|
136
|
+
|
137
|
+
model.add(layers.LeakyReLU())
|
138
|
+
|
139
|
+
model.add(layers.BatchNormalization())
|
140
|
+
|
141
|
+
|
142
|
+
|
143
|
+
model.add(layers.Conv2D(256, (5, 5), strides=(2, 2), padding='same'))
|
144
|
+
|
145
|
+
model.add(layers.LeakyReLU())
|
146
|
+
|
147
|
+
model.add(layers.BatchNormalization())
|
148
|
+
|
149
|
+
|
150
|
+
|
151
|
+
model.add(layers.Conv2D(512, (5, 5), strides=(2, 2), padding='same'))
|
152
|
+
|
153
|
+
model.add(layers.LeakyReLU())
|
154
|
+
|
155
|
+
model.add(layers.BatchNormalization())
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
model.add(layers.Dense(1024))
|
160
|
+
|
161
|
+
model.add(layers.LeakyReLU())
|
162
|
+
|
163
|
+
model.add(Activation('sigmoid'))
|
164
|
+
|
165
|
+
|
166
|
+
|
167
|
+
model.add(layers.Flatten())
|
168
|
+
|
169
|
+
model.add(layers.Dense(1))
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
return model
|
176
|
+
|
177
|
+
```
|
102
178
|
|
103
179
|
###学習無しの状態で表示される画像
|
104
180
|
|
6
実際の試行に近づけた
test
CHANGED
File without changes
|
test
CHANGED
@@ -94,31 +94,19 @@
|
|
94
94
|
|
95
95
|
|
96
96
|
|
97
|
-
plt.imshow(
|
97
|
+
plt.imshow(generated_image[0] * 0.5 + 0.5) #matlotlibです
|
98
98
|
|
99
99
|
```
|
100
100
|
|
101
101
|
|
102
102
|
|
103
|
-
###
|
103
|
+
###学習無しの状態で表示される画像
|
104
104
|
|
105
|
-
plt.imshow(tf.cast(255 * (generated_image[0] * 100 / 2 + 1),'uint8'))
|
106
|
-
|
107
|
-
<tf.Tensor: shape=(256, 256, 3), dtype=float32, numpy=
|
108
|
-
|
109
|
-
array([[[ 1.57410329e-06, -3.40866131e-06, 1.24176722e-06],
|
110
|
-
|
111
|
-
|
105
|
+
![イメージ説明](f9450a43b1add821672c8124d714533f.png)
|
112
|
-
|
113
|
-
[ 8.01241185e-06, -7.79011862e-06, -3.61239472e-06],
|
114
106
|
|
115
107
|
|
116
108
|
|
117
109
|
|
118
|
-
|
119
|
-
###この状態ではランダムノイズらしきものが表示されるため、問題はこれ以降かもしれません。
|
120
|
-
|
121
|
-
![イメージ説明](856e00de30841a603784324987876570.png)
|
122
110
|
|
123
111
|
|
124
112
|
|
@@ -156,9 +144,9 @@
|
|
156
144
|
|
157
145
|
```
|
158
146
|
|
159
|
-
###結果的に表示された画像
|
147
|
+
###結果的に表示された画像(140エポック)
|
160
148
|
|
161
|
-
![
|
149
|
+
![イメージ説明](65823c15d5250a2aa24cfcfc59aaa91b.png)
|
162
150
|
|
163
151
|
|
164
152
|
|
5
初投稿の後の修正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
GANのGeneratorの
|
1
|
+
GANのGeneratorがモザイク状の画像しか表示せずに学習できません
|
test
CHANGED
@@ -144,7 +144,7 @@
|
|
144
144
|
|
145
145
|
plt.subplot(4, 4, i+1)
|
146
146
|
|
147
|
-
plt.imshow(
|
147
|
+
plt.imshow((predictions[i] * 0.5 + 0.5)) #ここは投稿の後から変更しました。
|
148
148
|
|
149
149
|
plt.axis('off')
|
150
150
|
|
@@ -168,7 +168,7 @@
|
|
168
168
|
|
169
169
|
重みの初期値の変更、Generatorの出力のバイアスのあり・なしの変更、
|
170
170
|
|
171
|
-
|
171
|
+
kernel_initializer='random_normal'
|
172
172
|
|
173
173
|
### 補足情報(FW/ツールのバージョンなど)
|
174
174
|
|
4
100倍した時のテンソル
test
CHANGED
File without changes
|
test
CHANGED
@@ -100,7 +100,9 @@
|
|
100
100
|
|
101
101
|
|
102
102
|
|
103
|
-
###結果的に出力されるテンソル(一部)
|
103
|
+
###出力を100倍して結果的に出力されるテンソル(一部)
|
104
|
+
|
105
|
+
plt.imshow(tf.cast(255 * (generated_image[0] * 100 / 2 + 1),'uint8'))
|
104
106
|
|
105
107
|
<tf.Tensor: shape=(256, 256, 3), dtype=float32, numpy=
|
106
108
|
|
3
ランダムノイズの表示方法の追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -92,6 +92,10 @@
|
|
92
92
|
|
93
93
|
generated_image[0]
|
94
94
|
|
95
|
+
|
96
|
+
|
97
|
+
plt.imshow(tf.cast(255 * (generated_image[0] / 2 + 1),'uint8')) #matlotlibです
|
98
|
+
|
95
99
|
```
|
96
100
|
|
97
101
|
|
2
tensorflow 2.0とランダムノイズらしい画像
test
CHANGED
File without changes
|
test
CHANGED
@@ -108,6 +108,14 @@
|
|
108
108
|
|
109
109
|
|
110
110
|
|
111
|
+
|
112
|
+
|
113
|
+
###この状態ではランダムノイズらしきものが表示されるため、問題はこれ以降かもしれません。
|
114
|
+
|
115
|
+
![イメージ説明](856e00de30841a603784324987876570.png)
|
116
|
+
|
117
|
+
|
118
|
+
|
111
119
|
### こちらは、先述の公式MNIST実装のコードをほとんどコピーした、カラー画像が表示できるはずのコードですが、ほとんど同じようなほぼ一色の画像が表示されます。
|
112
120
|
|
113
121
|
```python
|
@@ -160,4 +168,4 @@
|
|
160
168
|
|
161
169
|
|
162
170
|
|
163
|
-
ColaboratoryのGPUで実行しています。
|
171
|
+
tensorflow2.0とKeras、ColaboratoryのGPUで実行しています。
|
1
気になっていることがKerasであることの追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
皆様こんにちは。Tensorflow 2.0のチュートリアルを参考にして画像生成を試みています。
|
5
|
+
皆様こんにちは。Tensorflow 2.0(Keras)のチュートリアルを参考にして画像生成を試みています。
|
6
6
|
|
7
7
|
256 * 256のRGB画像でのDCGANで画像生成をしていますが、Generatorの出力のテンソルのそれぞれの値が1e-06など小さな数字になります。目的は1e-02などの大きさのテンソルがGeneratorから出力され、学習が進むことです。
|
8
8
|
|