質問編集履歴
1
長いので短くしました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -2,271 +2,7 @@
|
|
2
2
|
|
3
3
|
Githubの6.0-VAE-GAN-fashion-mnist.ipynbをそのまま実行しようとしても動きません。(tensorflowのバージョン違い?)
|
4
4
|
|
5
|
-
Google colabで6.0-VAE-GAN-fashion-mnist.ipynb(https://colab.research.google.com/github/timsainb/tensorflow2-generative-models/blob/master/6.0-VAE-GAN-fashion-mnist.ipynb#scrollTo=HQAi3QxwTScl)を
|
5
|
+
Google colabで6.0-VAE-GAN-fashion-mnist.ipynb(https://colab.research.google.com/github/timsainb/tensorflow2-generative-models/blob/master/6.0-VAE-GAN-fashion-mnist.ipynb#scrollTo=HQAi3QxwTScl)を順番に実行してゆくとmodel作成時に
|
6
6
|
エラーが出ます。
|
7
7
|
|
8
8
|
|
9
|
-
TRAIN_BUF=60000
|
10
|
-
BATCH_SIZE=64
|
11
|
-
TEST_BUF=10000
|
12
|
-
DIMS = (28,28,1)
|
13
|
-
|
14
|
-
class VAEGAN(tf.keras.Model):
|
15
|
-
"""a VAEGAN class for tensorflow
|
16
|
-
|
17
|
-
Extends:
|
18
|
-
tf.keras.Model
|
19
|
-
"""
|
20
|
-
|
21
|
-
def __init__(self, **kwargs):
|
22
|
-
super(VAEGAN, self).__init__()
|
23
|
-
self.__dict__.update(kwargs)
|
24
|
-
|
25
|
-
self.enc = tf.keras.Sequential(self.enc)
|
26
|
-
self.dec = tf.keras.Sequential(self.dec)
|
27
|
-
inputs, disc_l, outputs = self.vae_disc_function()
|
28
|
-
self.disc = tf.keras.Model(inputs=[inputs], outputs=[outputs, disc_l])
|
29
|
-
|
30
|
-
self.enc_optimizer = tf.keras.optimizers.Adam(self.lr_base_gen, beta_1=0.5)
|
31
|
-
self.dec_optimizer = tf.keras.optimizers.Adam(self.lr_base_gen, beta_1=0.5)
|
32
|
-
self.disc_optimizer = tf.keras.optimizers.Adam(self.get_lr_d, beta_1=0.5)
|
33
|
-
|
34
|
-
def encode(self, x):
|
35
|
-
mu, sigma = tf.split(self.enc(x), num_or_size_splits=2, axis=1)
|
36
|
-
return mu, sigma
|
37
|
-
|
38
|
-
def dist_encode(self, x):
|
39
|
-
mu, sigma = self.encode(x)
|
40
|
-
return ds.MultivariateNormalDiag(loc=mu, scale_diag=sigma)
|
41
|
-
|
42
|
-
def get_lr_d(self):
|
43
|
-
return self.lr_base_disc * self.D_prop
|
44
|
-
|
45
|
-
def decode(self, z):
|
46
|
-
return self.dec(z)
|
47
|
-
|
48
|
-
def discriminate(self, x):
|
49
|
-
return self.disc(x)
|
50
|
-
|
51
|
-
def reconstruct(self, x):
|
52
|
-
mean, _ = self.encode(x)
|
53
|
-
return self.decode(mean)
|
54
|
-
|
55
|
-
def reparameterize(self, mean, logvar):
|
56
|
-
eps = tf.random.normal(shape=mean.shape)
|
57
|
-
return eps * tf.exp(logvar * 0.5) + mean
|
58
|
-
|
59
|
-
# @tf.function
|
60
|
-
def compute_loss(self, x):
|
61
|
-
# pass through network
|
62
|
-
q_z = self.dist_encode(x)
|
63
|
-
z = q_z.sample()
|
64
|
-
p_z = ds.MultivariateNormalDiag(
|
65
|
-
loc=[0.0] * z.shape[-1], scale_diag=[1.0] * z.shape[-1]
|
66
|
-
)
|
67
|
-
xg = self.decode(z)
|
68
|
-
z_samp = tf.random.normal([x.shape[0], 1, 1, z.shape[-1]])
|
69
|
-
xg_samp = self.decode(z_samp)
|
70
|
-
d_xg, ld_xg = self.discriminate(xg)
|
71
|
-
d_x, ld_x = self.discriminate(x)
|
72
|
-
d_xg_samp, ld_xg_samp = self.discriminate(xg_samp)
|
73
|
-
|
74
|
-
# GAN losses
|
75
|
-
disc_real_loss = gan_loss(logits=d_x, is_real=True)
|
76
|
-
disc_fake_loss = gan_loss(logits=d_xg_samp, is_real=False)
|
77
|
-
gen_fake_loss = gan_loss(logits=d_xg_samp, is_real=True)
|
78
|
-
|
79
|
-
discrim_layer_recon_loss = (
|
80
|
-
tf.reduce_mean(tf.reduce_mean(tf.math.square(ld_x - ld_xg), axis=0))
|
81
|
-
/ self.recon_loss_div
|
82
|
-
)
|
83
|
-
|
84
|
-
self.D_prop = sigmoid(
|
85
|
-
disc_fake_loss - gen_fake_loss, shift=0.0, mult=self.sig_mult
|
86
|
-
)
|
87
|
-
|
88
|
-
kl_div = ds.kl_divergence(q_z, p_z)
|
89
|
-
latent_loss = tf.reduce_mean(tf.maximum(kl_div, 0)) / self.latent_loss_div
|
90
|
-
|
91
|
-
return (
|
92
|
-
self.D_prop,
|
93
|
-
latent_loss,
|
94
|
-
discrim_layer_recon_loss,
|
95
|
-
gen_fake_loss,
|
96
|
-
disc_fake_loss,
|
97
|
-
disc_real_loss,
|
98
|
-
)
|
99
|
-
|
100
|
-
# @tf.function
|
101
|
-
def compute_gradients(self, x):
|
102
|
-
with tf.GradientTape() as enc_tape, tf.GradientTape() as dec_tape, tf.GradientTape() as disc_tape:
|
103
|
-
(
|
104
|
-
_,
|
105
|
-
latent_loss,
|
106
|
-
discrim_layer_recon_loss,
|
107
|
-
gen_fake_loss,
|
108
|
-
disc_fake_loss,
|
109
|
-
disc_real_loss,
|
110
|
-
) = self.compute_loss(x)
|
111
|
-
|
112
|
-
enc_loss = latent_loss + discrim_layer_recon_loss
|
113
|
-
dec_loss = gen_fake_loss + discrim_layer_recon_loss
|
114
|
-
disc_loss = disc_fake_loss + disc_real_loss
|
115
|
-
|
116
|
-
enc_gradients = enc_tape.gradient(enc_loss, self.enc.trainable_variables)
|
117
|
-
dec_gradients = dec_tape.gradient(dec_loss, self.dec.trainable_variables)
|
118
|
-
disc_gradients = disc_tape.gradient(disc_loss, self.disc.trainable_variables)
|
119
|
-
|
120
|
-
return enc_gradients, dec_gradients, disc_gradients
|
121
|
-
|
122
|
-
@tf.function
|
123
|
-
def apply_gradients(self, enc_gradients, dec_gradients, disc_gradients):
|
124
|
-
self.enc_optimizer.apply_gradients(
|
125
|
-
zip(enc_gradients, self.enc.trainable_variables)
|
126
|
-
)
|
127
|
-
self.dec_optimizer.apply_gradients(
|
128
|
-
zip(dec_gradients, self.dec.trainable_variables)
|
129
|
-
)
|
130
|
-
self.disc_optimizer.apply_gradients(
|
131
|
-
zip(disc_gradients, self.disc.trainable_variables)
|
132
|
-
)
|
133
|
-
|
134
|
-
def train(self, x):
|
135
|
-
enc_gradients, dec_gradients, disc_gradients = self.compute_gradients(x)
|
136
|
-
self.apply_gradients(enc_gradients, dec_gradients, disc_gradients)
|
137
|
-
|
138
|
-
|
139
|
-
def gan_loss(logits, is_real=True):
|
140
|
-
"""Computes standard gan loss between logits and labels
|
141
|
-
|
142
|
-
Arguments:
|
143
|
-
logits {[type]} -- output of discriminator
|
144
|
-
|
145
|
-
Keyword Arguments:
|
146
|
-
isreal {bool} -- whether labels should be 0 (fake) or 1 (real) (default: {True})
|
147
|
-
"""
|
148
|
-
if is_real:
|
149
|
-
labels = tf.ones_like(logits)
|
150
|
-
else:
|
151
|
-
labels = tf.zeros_like(logits)
|
152
|
-
|
153
|
-
return tf.compat.v1.losses.sigmoid_cross_entropy(
|
154
|
-
multi_class_labels=labels, logits=logits
|
155
|
-
)
|
156
|
-
|
157
|
-
|
158
|
-
def sigmoid(x, shift=0.0, mult=20):
|
159
|
-
""" squashes a value with a sigmoid
|
160
|
-
"""
|
161
|
-
return tf.constant(1.0) / (
|
162
|
-
tf.constant(1.0) + tf.exp(-tf.constant(1.0) * (x * mult))
|
163
|
-
)
|
164
|
-
|
165
|
-
N_Z = 128
|
166
|
-
|
167
|
-
encoder = [
|
168
|
-
tf.keras.layers.InputLayer(input_shape=DIMS),
|
169
|
-
tf.keras.layers.Conv2D(
|
170
|
-
filters=32, kernel_size=3, strides=(2, 2), activation="relu"
|
171
|
-
),
|
172
|
-
tf.keras.layers.Conv2D(
|
173
|
-
filters=64, kernel_size=3, strides=(2, 2), activation="relu"
|
174
|
-
),
|
175
|
-
tf.keras.layers.Flatten(),
|
176
|
-
tf.keras.layers.Dense(units=N_Z*2),
|
177
|
-
]
|
178
|
-
|
179
|
-
decoder = [
|
180
|
-
tf.keras.layers.Dense(units=7 * 7 * 64, activation="relu"),
|
181
|
-
tf.keras.layers.Reshape(target_shape=(7, 7, 64)),
|
182
|
-
tf.keras.layers.Conv2DTranspose(
|
183
|
-
filters=64, kernel_size=3, strides=(2, 2), padding="SAME", activation="relu"
|
184
|
-
),
|
185
|
-
tf.keras.layers.Conv2DTranspose(
|
186
|
-
filters=32, kernel_size=3, strides=(2, 2), padding="SAME", activation="relu"
|
187
|
-
),
|
188
|
-
tf.keras.layers.Conv2DTranspose(
|
189
|
-
filters=1, kernel_size=3, strides=(1, 1), padding="SAME", activation="sigmoid"
|
190
|
-
),
|
191
|
-
]
|
192
|
-
|
193
|
-
def vaegan_discrim():
|
194
|
-
inputs = tf.keras.layers.Input(shape=(28, 28, 1))
|
195
|
-
conv1 = tf.keras.layers.Conv2D(
|
196
|
-
filters=32, kernel_size=3, strides=(2, 2), activation="relu"
|
197
|
-
)(inputs)
|
198
|
-
conv2 = tf.keras.layers.Conv2D(
|
199
|
-
filters=64, kernel_size=3, strides=(2, 2), activation="relu"
|
200
|
-
)(conv1)
|
201
|
-
flatten = tf.keras.layers.Flatten()(conv2)
|
202
|
-
lastlayer = tf.keras.layers.Dense(units=512, activation="relu")(flatten)
|
203
|
-
outputs = tf.keras.layers.Dense(units=1, activation = None)(lastlayer)
|
204
|
-
return inputs, lastlayer, outputs
|
205
|
-
|
206
|
-
# the unet function
|
207
|
-
gen_optimizer = tf.keras.optimizers.Adam(1e-3, beta_1=0.5)
|
208
|
-
disc_optimizer = tf.keras.optimizers.RMSprop(1e-3)
|
209
|
-
|
210
|
-
# model
|
211
|
-
model = VAEGAN(
|
212
|
-
enc = encoder,
|
213
|
-
dec = decoder,
|
214
|
-
vae_disc_function = vaegan_discrim,
|
215
|
-
lr_base_gen = 1e-3, #
|
216
|
-
lr_base_disc = 1e-4, # the discriminator's job is easier than the generators so make the learning rate lower
|
217
|
-
latent_loss_div=1, # this variable will depend on your dataset - choose a number that will bring your latent loss to ~1-10
|
218
|
-
sig_mult = 10, # how binary the discriminator's learning rate is shifted (we squash it with a sigmoid)
|
219
|
-
recon_loss_div = .001, # this variable will depend on your dataset - choose a number that will bring your latent loss to ~1-10
|
220
|
-
)
|
221
|
-
|
222
|
-
順番に実行してゆくとmodelの構築中に以下のエラーメッセージが発生しました。
|
223
|
-
|
224
|
-
### 発生している問題・エラーメッセージ
|
225
|
-
AttributeError Traceback (most recent call last)
|
226
|
-
<ipython-input-22-7e2e55ad1dd0> in <module>
|
227
|
-
4
|
228
|
-
5 # model
|
229
|
-
----> 6 model = VAEGAN(
|
230
|
-
7 enc = encoder,
|
231
|
-
8 dec = decoder,
|
232
|
-
|
233
|
-
4 frames
|
234
|
-
<ipython-input-20-386abcfd519d> in __init__(self, **kwargs)
|
235
|
-
17 self.enc_optimizer = tf.keras.optimizers.Adam(self.lr_base_gen, beta_1=0.5)
|
236
|
-
18 self.dec_optimizer = tf.keras.optimizers.Adam(self.lr_base_gen, beta_1=0.5)
|
237
|
-
---> 19 self.disc_optimizer = tf.keras.optimizers.Adam(self.get_lr_d, beta_1=0.5)
|
238
|
-
20
|
239
|
-
21 def encode(self, x):
|
240
|
-
|
241
|
-
/usr/local/lib/python3.9/dist-packages/keras/optimizers/optimizer_experimental/adam.py in __init__(self, learning_rate, beta_1, beta_2, epsilon, amsgrad, weight_decay, clipnorm, clipvalue, global_clipnorm, use_ema, ema_momentum, ema_overwrite_frequency, jit_compile, name, **kwargs)
|
242
|
-
114 **kwargs
|
243
|
-
115 )
|
244
|
-
--> 116 self._learning_rate = self._build_learning_rate(learning_rate)
|
245
|
-
117 self.beta_1 = beta_1
|
246
|
-
118 self.beta_2 = beta_2
|
247
|
-
/usr/local/lib/python3.9/dist-packages/keras/optimizers/optimizer_experimental/optimizer.py in _build_learning_rate(self, learning_rate)
|
248
|
-
376 return learning_rate
|
249
|
-
377
|
250
|
-
--> 378 return tf.Variable(
|
251
|
-
379 learning_rate,
|
252
|
-
380 name="learning_rate",
|
253
|
-
/usr/local/lib/python3.9/dist-packages/tensorflow/python/util/traceback_utils.py in error_handler(*args, **kwargs)
|
254
|
-
151 except Exception as e:
|
255
|
-
152 filtered_tb = _process_traceback_frames(e.__traceback__)
|
256
|
-
--> 153 raise e.with_traceback(filtered_tb) from None
|
257
|
-
154 finally:
|
258
|
-
155 del filtered_tb
|
259
|
-
<ipython-input-20-386abcfd519d> in get_lr_d(self)
|
260
|
-
28
|
261
|
-
29 def get_lr_d(self):
|
262
|
-
---> 30 return self.lr_base_disc * self.D_prop
|
263
|
-
31
|
264
|
-
32 def decode(self, z):
|
265
|
-
AttributeError: 'VAEGAN' object has no attribute 'D_prop'
|
266
|
-
|
267
|
-
### 試したこと
|
268
|
-
もともとのtensorflowのバージョンは2.0.0-dev20190510
|
269
|
-
tfp.__version__ 0.7.0-dev20190510でした。
|
270
|
-
google colabでtensorflowのバージョンを戻そうとしましたが2.5.0までとのことで、それ以前のバージョンに戻せませんでした。
|
271
|
-
現在のバージョン(2.11.0)で実行させることはできないのでしょうか?
|
272
|
-
|