[R] Replace VAE dense layer with 1x1x1 Convolutional layer
Hi!
I have a Variational autoencoder model created in Keras.Encoder is built with three 3D Convolutional layers + Flatten + Dense layer. Decoder is built with three 3D Transposed Convolutional layers to reconstruct the input 3D images.
My goal is to replace Flatten and Dense layer in Encoder with 1x1x1 Convolutional layer. Any ideas how to do that?
My model structure looks like this:
original_dim = np.prod(np.array(original_shape)) input_shape = ( original_shape[0], original_shape[1], original_shape[2], 1) latent_dim = 100 def sampling(args): """Reparameterization trick by sampling fr an isotropic unit Gaussian. Arguments: args {tensor} -- mean and log of variance of Q(z|X) Returns: z {tensor} -- sampled latent vector """ z_mean, z_log_var = args batch = K.shape(z_mean)[0] dim = K.int_shape(z_mean)[1] epsilon = K.random_normal(shape=(batch, dim)) return z_mean + K.exp(0.5 * z_log_var) * epsilon # Encoder inputs = Input(shape=input_shape, name='encoder_input') x = inputs x = Conv3D(filters=32, kernel_size=3, activation='relu', strides=1, padding='same')(x) x = Conv3D(filters=64, kernel_size=3, activation='relu', strides=2, padding='same')(x) x = Conv3D(filters=128, kernel_size=3, activation='relu', strides=2, padding='same')(x) shape = K.int_shape(x) x = Flatten()(x) x = Dense(latent_dim, activation='relu')(x) z_mean = Dense(latent_dim, name='z_mean')(x) z_log_var = Dense(latent_dim, name='z_log_var')(x) z = Lambda(sampling, output_shape=(latent_dim,), name='z')([z_mean, z_log_var]) encoder = Model(inputs, [z_mean, z_log_var, z], name='encoder') # Decoder latent_inputs = Input(shape=(latent_dim,), name='z_sampling') x = Dense(shape[1] * shape[2] * shape[3] * shape[4], activation='relu')(latent_inputs) x = Reshape((shape[1], shape[2], shape[3], shape[4]))(x) x = Conv3DTranspose(filters=128, kernel_size=3, activation='relu', strides=2, padding='same')(x) x = Conv3DTranspose(filters=64, kernel_size=3, activation='relu', strides=2, padding='same')(x) x = Conv3DTranspose(filters=32, kernel_size=3, activation='relu', strides=1, padding='same')(x) outputs = Conv3DTranspose(filters=1, kernel_size=3, strides=1, activation='sigmoid', padding='same', name='decoder_output')(x) decoder = Model(latent_inputs, outputs, name='decoder') decoder.summary() outputs = decoder(encoder(inputs)[2]) vae = Model(inputs, outputs, name='vae') reconstruction_loss = mse(K.flatten(inputs), K.flatten(outputs)) reconstruction_loss *= original_dim kl_loss = 1 + z_log_var - K.square(z_mean) - K.exp(z_log_var) kl_loss = K.sum(kl_loss, axis=-1) kl_loss *= -0.5 vae_loss = K.mean(reconstruction_loss + kl_loss) vae.add_loss(vae_loss) vae.compile(optimizer='rmsprop')
Thank you for any help
submitted by /u/Pubec
[link] [comments]