質問編集履歴

1

長いので短くしました。

2023/03/16 08:19

投稿

hyo-medsoh
hyo-medsoh

スコア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
-