From 213eddd782c41ef3dca07bae3839b0e8887d7dd0 Mon Sep 17 00:00:00 2001 From: blake Date: Mon, 6 Oct 2025 13:41:39 +1000 Subject: [PATCH 01/15] Initial commit --- reconstruction.jpg | Bin 0 -> 38175 bytes requirements.txt | 6 + vq-vae.py | 467 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 473 insertions(+) create mode 100644 reconstruction.jpg create mode 100644 requirements.txt create mode 100644 vq-vae.py diff --git a/reconstruction.jpg b/reconstruction.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d9cbc176534c04c49b26fe11aa38bf7915fd9f34 GIT binary patch literal 38175 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%0DSIm5b80i%acCftK6n} zw_Y}lc->l{4GlSw?7+1o$f?Kcx4K*4wb5X{(Z{>6QQ%XAziH=f(TVwu`~2kj%|U^8 z{{Rdo=Q|$XtYT#lgVFhYM9F9@um1eS%rVmIxBh(T`x+5+?E(|ISC4F_i7LH*@7Y%X z9i@?fF168<&F`Y^)zEod4Q!hR%>T}|>3W3y~v`t4~yX(&b_qQKS>;qe&1P;jn9tmK@p4A^K*q z$NcIgUB-Bb>0leLW?TmPLoIkGvC--k*LbnPSh6;-;5hd*tUOpAsn+;rsm|SGt;x?2~3o~944Q%i27_C@e*3^EfovWWW-Az2w`PQy=GP1y;$H2WK z+oRr?xzyWvlV0LO*+j)r5F9w1Qz(z7eaFgt}xPfM?Up8wCrZWg>F zbsz5cl%gM`m1d)3Z)~ve*|QH`vA=qo-H|Kx_!G3C3wTzNr_GG)Qcfp3g{1zCv3=mF z|Mq`wz|X_HziY?-1l`{G2|8b;oKLnt9lcDj`R`+M_x4BH!#5Q-_EMx+vx3$_Mar6v zo`7+j8pufqjxL7&ak09G{`z(O8$%~hH~rrZek|EttXo{I6_EY;#9_%z`dIFM%@h1v zTL>$yPf-;Qc4MB;m37tZa&*j7SmB6k$`HM7uaoK~dVTUs+<{B|SIlJ!=-UB2F@6Ah z<8-_*$C4wge3laj`by$XsAoN9XPx7%1)K>R&9ixe{rM~pI^Z@BJkG1h;i$LRP79v_ z-HM^12i-bX#CZOZ+gMj#*K(#c?R9neNGr=4t@6{x-llZiyG_C$DEY_r;&WI_m%Q(7 z!bTsyV7(Hd9TaE(L1bzk?Ca(>DOo>zIbr6qIER1Xo>e<^d>Qmru~-^XB0x=XJAxB* znsaiWO@0j7R-g99$^&H3Ebv8L9CHE(s}JP#4HsA(&9s6EUY~X1I49`EGW{NvJZz${gY+f7I6k9<4`XgH zI$8=^Q6c|%kCCUxV%@VTXkCkVZd;XF6jh=g-DNAT-YcrG3|*e65wEU@TBx8qsTF~C z!@i&U#Erja@)b6aGA@^SH{V;kHOd{W{o66qtoMQ%uv{pzPT*dB0_<&DCiOctFR6LF7M&12_YaC3=5X zuLR;$p7)J_2EUf#)t~UB?YN5VsGe-L9x9AstuniGQ4y z`32BTX=dB8<_jrKnC`uEfwte4%3_VLi=YCx!*wcN+=CROWUk-V3gB_FUs!7eNJ{?s z|AdQWEA=~9TQ~^Q>*ZX~7J>7Tyz2hrN1F?S4hpZa|M~W!O?c65a<#Vow$EOY)vp=w z`fXN4_8ET#&SCH7hJ%WK8_&AvP4neP`LL~l6@b-zKx=O}X43h`^rZhbgTJoIKmLB` z1g_h>SKRZ+N#-88OF{At_zajGjX!2bo)UBbBv5gBKtg*P*v*{pP-$k&l5K}-u-;AU zwRX@|xMBkGL12pibw%>D-JiF`M$R>12JBMGO26U?D|^AiCvMLdnH)WOu=Q)g@6~6o zxA1sm-JaD@0K(<3EcV94GwcfcS9mOI*!TH$BU%0N-per7f#;HZ&9^_;jdFinl}g$aVHW&UB}siKaGY{)0^w43(ihU&6dc19x7gH9-hObj zb=Wy(TN|dNzfHXNmeYBMNx`bB?6k6GD21nouB<{>C6I(p^KFYj7%ogh<*VlOcl`$t z3K|)Io8$EngKAIn^H9Fm5lNA__N9^u=emp=% zYizo_MS6qk+(4LQh8;YI>hg>|;ru>+R9&DD_ZaauLP6Ocb5WBNl314%wBY>^8hKrs zGuK=(ArR#GmDzSU?J`Fo z)?*L1H|FbXeg4-~{G9BK@r#TS?b!g1^aFXGgtrHsC2Ti>smKX}91B-Hn)6S>@%fDv z>gv_6RkUY1<@@%S;fJ@b7aoFyB;4E0(aKY+3Ioqn=G`C3BG$~3+3nuKFZK3XZ;S$CFzALLyWXQNGz$<*3XiK4O*<}0-P zNqiR}b*b?S`<1$-E*shi5|O$9#TF4a;zE^_+ka`(37C}rZ^q?p!qj3)4acD$ZkrPa zOiL>hlLy=}$hl+uKosl<2YpTdUi~i6^7P^@25oq61eesXU?{9q0KeCrJOYN@0CW%e zua$H)o0kgZW6Z{-H5%r$?F$jyHcfXPbc*|~-@O7=tjvo@2b)yr?Oz7(L}(~WrQU9WU^ z`oqdfHc1z<`WYI*%|i+-E0O7jH&j+fwE%WfxcZ~ABW`sa00d5plVLM|TGjv4#_P|= znCLb4$0G{`l`V;S4`1a6(W(e4po*(xX>O}7m?&Tlqq0-5kjRu$6nuP|HULXelH8m< zJH-Gb#GyR&?`=Q9@p z)l=pSRLk literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000..074bfa16f5 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,6 @@ +tensorflow +keras +numpy +scikit-image +nibabel +matplotlib \ No newline at end of file diff --git a/vq-vae.py b/vq-vae.py new file mode 100644 index 0000000000..49efefb480 --- /dev/null +++ b/vq-vae.py @@ -0,0 +1,467 @@ +import tensorflow as tf +import keras +from keras import layers + +# for data +import os +import nibabel as nib +import numpy as np + +# testing +import matplotlib.pyplot as plt +from skimage.transform import resize +import json + +""" +Based on example: 'Vector-Quantized Variational Autoencoders' by Sayak Paul +href: https://keras.io/examples/generative/vq_vae/ +""" + +# TRAIN_FOLDER = "data/keras_slices_data/keras_slices_train/" +TRAIN_FOLDER = "/home/groups/comp3710/HipMRI_Study_open/keras_slices_data/keras_slices_train" +HISTORY_PATH = "history.json" +LATENT_DIM = 32 # WAS 128 +CODEBOOK_SIZE = 1024 + +class VectorQuantizerLayer(layers.Layer): + + def __init__( + self, + num_embeddings, # number of vectors in codebook + embedding_dim, + commitment_weight=6, # coefficient of commitment loss + **kwargs + ): + super().__init__(**kwargs) + + self.commitment_weight=commitment_weight + self.embedding_dim = embedding_dim + self.num_embeddings = num_embeddings + + # Initialise codebook + rand_field = tf.random_uniform_initializer() + self.codebook = tf.Variable( + initial_value=rand_field( + shape=(self.embedding_dim, self.num_embeddings), dtype="float32" + ), + trainable=True, # let the values be learnable + name="VQ-CODEBOOK" + ) + + + def call(self, x): + """ + Given a layer of network, replace each vector in the layer with a + vector from the codebook - quantize the layer + """ + + # store starting shape + start_shape = tf.shape(x) + + # flatten to single row of embedding_dim vectors + flattened = tf.reshape(x, [-1, self.embedding_dim]) + + # actually quantize + # indices of closest code vectors + indices = self.get_code_indices(flattened) + + # one-hot the needed vector + one_hot_indices = tf.one_hot(indices, self.num_embeddings) + + # extract the given index from the codebook - one hot selects correct + # codebook vector + quantized = tf.matmul(one_hot_indices, self.codebook, transpose_b=True) + quantized = tf.reshape(quantized, start_shape) + + # loss definitions + loss_commitment = tf.reduce_mean( + # dont let this loss flow to the codebook - only to update encoder + # so detach with stop_gradient + + # MSE to get encoder to give vectors close to codebook vectors + (tf.stop_gradient(quantized) - x)**2 + ) + + loss_codebook = tf.reduce_mean( + # for codebook only, stop gradient from flowing to encoder + (quantized - tf.stop_gradient(x)) ** 2 + ) + + # add to model + loss_total = self.commitment_weight * loss_commitment + loss_codebook + self.add_loss(loss_total) + + # trick to stop gradient flowing from rest of model going through + # the codebook - quantized is gradient stopped but we're still passing + # the quantized output -- gradient flows through x + gradient_skipped_quantized = x + tf.stop_gradient(quantized - x) + return gradient_skipped_quantized + + def get_code_indices(self, flattened): + """ + calculate L2 distance to all codebook vectors and return the index + of the closest one for each vector in flattened + """ + + ab = tf.matmul( + flattened, self.codebook + ) + + distances = (#L2 + tf.reduce_sum(flattened ** 2, axis=1, keepdims=True) + + tf.reduce_sum(self.codebook ** 2, axis=0) + -2*ab + ) + + smallest_indices = tf.argmin( + distances, axis=1 + ) + + return smallest_indices + + +def get_encoder( + input_shape, + layers_filters, + latent_dim=64, + ): + """ + returns an encoder + + layers: list of kernal sizes to iterate over + """ + + inputs = keras.Input(shape=input_shape) + + x = inputs + for num_filters in layers_filters: + x = keras.layers.Conv2D( + num_filters, + 3, + strides=2, + padding="same" + )(x) + + x = keras.activations.relu(x) + + # use 1x1 kernel to convert to latent dim size + outputs = keras.layers.Conv2D( + latent_dim, 1, padding="same" + )(x) + + return keras.Model(inputs, outputs, name='encoder') + +def get_decoder( + layers_filters, + input_shape, # shape of encoder output + latent_dim = 64 +): + """ + layers_filters should be the same as the encoder but reversed + """ + + inputs = keras.Input( + shape=input_shape + ) + x = inputs + for num_filters in layers_filters: + + x = keras.layers.Conv2DTranspose( + num_filters, 3, strides=2, padding="same" + )(x) + + x = keras.activations.relu(x) + + # 1x1 kernel to bring to a single layer + x = layers.Conv2DTranspose(1, 3, padding="same")(x) + outputs = keras.activations.sigmoid(x) # scale to [0,1] + return keras.Model( + inputs, outputs, name="decoder" + ) + +def vq_vae( + input_shape, + latent_dim=64, + num_embeddings=128, +): + quantize_layer = VectorQuantizerLayer( + num_embeddings, latent_dim, name="quantizer" + ) + + filter_layers = [ + 64, 128, 256, 512 + ] + + encoder = get_encoder( + latent_dim=latent_dim, + input_shape=input_shape, + layers_filters=filter_layers + ) + + decoder = get_decoder( + filter_layers[::-1], # reverse order to encoder to end in same shape + encoder.output.shape[1:], + latent_dim=latent_dim + ) + + inputs = keras.Input(shape=input_shape) + encoder_out = encoder(inputs) + quantized_out = quantize_layer(encoder_out) + reconstruction = decoder(quantized_out) + + return keras.Model( + inputs, reconstruction, name="vq-vae" + ) + +class trainer(keras.models.Model): + """ + Class to train a vq-vae + """ + def __init__( + self, + train_variance, + latent_dim, + codebook_size, + input_shape, + **kwargs + ): + # init + super().__init__(**kwargs) + self.train_variance = train_variance + self.latent_dim = latent_dim + self.codebook_size = codebook_size + + + # actual model + self.vqvae = vq_vae( + input_shape, latent_dim, codebook_size + ) + + # initialise losses - all mean to average over batch + self.total_loss = keras.metrics.Mean("total_loss") + self.reconstruction_loss = keras.metrics.Mean("reconstruction_loss") + self.vqvae_loss = keras.metrics.Mean("vqvae_loss") + + def call(self, x): + return self.vqvae(x) + + # override metrics so our custom metrics are reset on epochs/tracked + @property + def metrics(self): + return [ + self.total_loss, self.reconstruction_loss, self.vqvae_loss + ] + + def train_step(self, x): + + with tf.GradientTape() as tape: + # get output + reconstruction = self.vqvae(x) + + # calculate loss - reconstrution normalised to dataset variance + recon_loss = tf.reduce_mean((x-reconstruction)**2) #/ self.train_variance + + total_loss = ( + recon_loss + + sum(self.vqvae.losses) + ) + + # now backpropegate + grad = tape.gradient( + # derivative of total_loss w.r.t all trainable variables + total_loss, self.vqvae.trainable_variables + ) + self.optimizer.apply_gradients( # run gradient descent + zip(grad, self.vqvae.trainable_variables) + ) + + # track losses + self.total_loss.update_state(total_loss) + self.reconstruction_loss.update_state(recon_loss) + self.vqvae_loss.update_state(sum(self.vqvae.losses)) + + # return result + return { + "loss" : self.total_loss.result(), + "reconstruction loss": self.reconstruction_loss.result(), + "vqvae loss": self.vqvae_loss.result() + } + +def __NUMPY__load_image_to_tensor(filepath: str): + """ + loads the image at filepath and returns it as a greyscale numpy array + with values between [0,1] + """ + filepath = filepath.decode("utf-8") + # load into greyscale + img = nib.load(filepath) + + # as np array + data = img.get_fdata().astype(np.float32) + zoom = img.header.get_zooms() + + # Normalize to [0,1] + data = (data - np.min(data)) / (np.max(data) - np.min(data) + 1e-8) + + data_resized = resize( + data, (256, 128), order=1, preserve_range=True, anti_aliasing=True + ).astype(np.float32) + + # expand channels on end to 1 + data = np.expand_dims(data_resized, axis=-1) + + return data # returns as numpy + +def load_image_to_tensor(filepath): + data = tf.numpy_function( # execute and cast to tensor + __NUMPY__load_image_to_tensor, [filepath], tf.float32 + ) + # define the shape + data.set_shape([256, 128, 1]) + print(data) + + return data + + +def get_dataset(folder): + train_files = [ + os.path.join(TRAIN_FOLDER, f) + for f in os.listdir(folder) + if f.endswith(".nii.gz") + ] + + train_data = tf.data.Dataset.from_tensor_slices( + train_files + ) + + train_files = train_data.map(load_image_to_tensor) + + return train_files + +def get_variance(dataset): + """ + Compute variance of all elements in a tf.data.Dataset. + Assumes dataset yields numeric tensors (scalars or arrays). + """ + # First pass: compute mean + count = 0 + total = 0.0 + for x in dataset: + total += tf.reduce_sum(tf.cast(x, tf.float32)) + count += tf.size(x).numpy() + mean = total / count + + # Second pass: compute squared differences + sq_diff_sum = 0.0 + for x in dataset: + sq_diff_sum += tf.reduce_sum((tf.cast(x, tf.float32) - mean) ** 2) + + variance = sq_diff_sum / count + return variance.numpy() + + +def get_image_shape(): + """ + returns the shape of an image in the train dataset + """ + # fetch the shape of the output + for batch in get_dataset(TRAIN_FOLDER): + img_shape = batch.shape + return img_shape + + +def plot_reconstruction(original, reconstruction): + """ + Plots side by side the two greyscale tensors + """ + fig, axes = plt.subplots(1, 2, figsize=(10, 5)) + + axes[0].imshow(original) + axes[1].imshow(reconstruction) + + plt.tight_layout() + plt.savefig("reconstruction.jpg") + + +def main(): + + train_variance = get_variance( + get_dataset(TRAIN_FOLDER) + ) + + train_dataset = get_dataset(TRAIN_FOLDER).batch(128) + + data_augmentation = keras.Sequential([ + layers.RandomRotation(0.05), # ±10% rotation + layers.RandomZoom(0.1), # zoom in/out + layers.RandomTranslation(0.05, 0.05), # shift + layers.RandomContrast(0.1), + ]) + + train_dataset.map(lambda x: data_augmentation(x, training=True)) + + img_shape = get_image_shape() + print(f"Image shape: {img_shape}") + + # actuall train the model + + vq_trainer = trainer( + train_variance, LATENT_DIM, CODEBOOK_SIZE, img_shape + ) + + vq_trainer.compile( + optimizer=keras.optimizers.Adam(learning_rate=0.0005), + ) + + history = vq_trainer.fit( + train_dataset, + epochs=40, + + ) + + model = vq_trainer.vqvae + + ### Test save/load + weights_path = "trainer.weights.h5" + model.save_weights(weights_path) + model = load_model(weights_path) + + + ####### PLOT RECONSTRUCTION + + for batch in get_dataset(TRAIN_FOLDER): + img = batch # just fetch one image + break + + img_batched = tf.expand_dims(img, axis=0) + img_batched = tf.expand_dims(img_batched, axis=-1) + reconstruction = tf.squeeze(model(img_batched), axis=0) + + plot_reconstruction( + img, reconstruction + ) + + # save loss + with open(HISTORY_PATH, 'w+') as f: + json.dump(history.history['loss'], f) + +def load_model(path): + """ + loads the vqvae weights stored at the path into a new vqvae model + + to save weights for use by this helper. trainer.vqvae.save_weights(path) + """ + + new_vq_vae = vq_vae( + get_image_shape(), + LATENT_DIM, + CODEBOOK_SIZE + ) + + new_vq_vae.compile(optimizer="adam") + new_vq_vae.load_weights(path) + + return new_vq_vae + +if __name__ == "__main__": + main() \ No newline at end of file From c0bf7ce53199e494fadae588f57fe7d3f6fcb7ed Mon Sep 17 00:00:00 2001 From: blake Date: Mon, 6 Oct 2025 17:10:10 +1000 Subject: [PATCH 02/15] added residual blocks after downconvolving and before upconvolving. Tweaked hyperparameters --- .gitignore | 2 +- vq-vae.py | 44 ++++++++++++++++++++++++++++++++++++-------- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 2c77d23001..1b8ac43200 100644 --- a/.gitignore +++ b/.gitignore @@ -128,4 +128,4 @@ dmypy.json .vscode/ # no tracking mypy config file -mypy.ini \ No newline at end of file +mypy.ini diff --git a/vq-vae.py b/vq-vae.py index 49efefb480..832d2f2d6c 100644 --- a/vq-vae.py +++ b/vq-vae.py @@ -20,8 +20,8 @@ # TRAIN_FOLDER = "data/keras_slices_data/keras_slices_train/" TRAIN_FOLDER = "/home/groups/comp3710/HipMRI_Study_open/keras_slices_data/keras_slices_train" HISTORY_PATH = "history.json" -LATENT_DIM = 32 # WAS 128 -CODEBOOK_SIZE = 1024 +LATENT_DIM = 3 +CODEBOOK_SIZE = 512 class VectorQuantizerLayer(layers.Layer): @@ -29,7 +29,7 @@ def __init__( self, num_embeddings, # number of vectors in codebook embedding_dim, - commitment_weight=6, # coefficient of commitment loss + commitment_weight=0.25, # coefficient of commitment loss **kwargs ): super().__init__(**kwargs) @@ -120,6 +120,27 @@ def get_code_indices(self, flattened): return smallest_indices +def residual_block(x, num_filters): + """ + standard residual block. used for encoder and decoder both + """ + start = x + x = keras.layers.Conv2D( + num_filters, 3, 1, padding="same" + )(x) + + x = keras.activations.relu(x) + + x = keras.layers.Conv2D( + num_filters, 1, 1, padding="same" + )(x) + + x = keras.layers.Add()([x, start]) + x = keras.activations.relu(x) + + return x + + def get_encoder( input_shape, layers_filters, @@ -137,13 +158,17 @@ def get_encoder( for num_filters in layers_filters: x = keras.layers.Conv2D( num_filters, - 3, + 4, strides=2, padding="same" )(x) x = keras.activations.relu(x) + # down sampling followed by residual blocks + x = residual_block(x, num_filters) + x = residual_block(x, num_filters) + # use 1x1 kernel to convert to latent dim size outputs = keras.layers.Conv2D( latent_dim, 1, padding="same" @@ -167,11 +192,14 @@ def get_decoder( for num_filters in layers_filters: x = keras.layers.Conv2DTranspose( - num_filters, 3, strides=2, padding="same" + num_filters, 4, strides=2, padding="same" )(x) x = keras.activations.relu(x) + x = residual_block(x, num_filters) + x = residual_block(x, num_filters) + # 1x1 kernel to bring to a single layer x = layers.Conv2DTranspose(1, 3, padding="same")(x) outputs = keras.activations.sigmoid(x) # scale to [0,1] @@ -189,7 +217,7 @@ def vq_vae( ) filter_layers = [ - 64, 128, 256, 512 + 128, 256, 512 ] encoder = get_encoder( @@ -410,12 +438,12 @@ def main(): ) vq_trainer.compile( - optimizer=keras.optimizers.Adam(learning_rate=0.0005), + optimizer=keras.optimizers.Adam(learning_rate=0.001), ) history = vq_trainer.fit( train_dataset, - epochs=40, + epochs=10, ) From 19b1fa9b397b127f82f931ab54219582c32355a6 Mon Sep 17 00:00:00 2001 From: blake Date: Fri, 17 Oct 2025 11:25:37 +1000 Subject: [PATCH 03/15] tweaked structure and hyperparameters of vq vae model --- vq-vae.py | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/vq-vae.py b/vq-vae.py index 832d2f2d6c..a9dcb7985d 100644 --- a/vq-vae.py +++ b/vq-vae.py @@ -17,6 +17,10 @@ href: https://keras.io/examples/generative/vq_vae/ """ +""" +IDEAS: Could increase the number of hidden units across the board +""" + # TRAIN_FOLDER = "data/keras_slices_data/keras_slices_train/" TRAIN_FOLDER = "/home/groups/comp3710/HipMRI_Study_open/keras_slices_data/keras_slices_train" HISTORY_PATH = "history.json" @@ -40,12 +44,19 @@ def __init__( # Initialise codebook rand_field = tf.random_uniform_initializer() - self.codebook = tf.Variable( - initial_value=rand_field( - shape=(self.embedding_dim, self.num_embeddings), dtype="float32" - ), - trainable=True, # let the values be learnable - name="VQ-CODEBOOK" + # self.codebook = tf.Variable( + # initial_value=rand_field( + # shape=(self.embedding_dim, self.num_embeddings), dtype="float32" + # ), + # trainable=True, # let the values be learnable + # name="VQ-CODEBOOK" + # ) + + self.codebook = self.add_weight( + name="VQ-CODEBOOK", + shape=(self.embedding_dim, self.num_embeddings), + initializer=tf.random_uniform_initializer(), + trainable=True ) @@ -353,7 +364,7 @@ def load_image_to_tensor(filepath): def get_dataset(folder): train_files = [ - os.path.join(TRAIN_FOLDER, f) + os.path.join(folder, f) for f in os.listdir(folder) if f.endswith(".nii.gz") ] @@ -420,7 +431,7 @@ def main(): train_dataset = get_dataset(TRAIN_FOLDER).batch(128) data_augmentation = keras.Sequential([ - layers.RandomRotation(0.05), # ±10% rotation + layers.RandomRotation(0.05), # 10% rotation layers.RandomZoom(0.1), # zoom in/out layers.RandomTranslation(0.05, 0.05), # shift layers.RandomContrast(0.1), @@ -487,9 +498,15 @@ def load_model(path): ) new_vq_vae.compile(optimizer="adam") + new_vq_vae.build(get_image_shape()) new_vq_vae.load_weights(path) return new_vq_vae +def test_load(): + model = load_model("trained_models/trainer.weights.h5") + model.summary() + if __name__ == "__main__": - main() \ No newline at end of file + # main() + test_load() \ No newline at end of file From f707a2548cc6ea2311581e04e65066c0d6d64f75 Mon Sep 17 00:00:00 2001 From: blake Date: Fri, 17 Oct 2025 11:26:00 +1000 Subject: [PATCH 04/15] Added script to run ssim evalution of loaded model --- ssim-evaluation.py | 54 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 ssim-evaluation.py diff --git a/ssim-evaluation.py b/ssim-evaluation.py new file mode 100644 index 0000000000..e71c312745 --- /dev/null +++ b/ssim-evaluation.py @@ -0,0 +1,54 @@ +import tensorflow as tf + +import importlib +vqvae = importlib.import_module("vq-vae") + +""" +EVALUATED: 0.78039 +""" + +def evaluate_ssim(model, test_dataset, max_val=1.0): + """ + Compute average SSIM over a test dataset for a VQ-VAE model. + + Args: + model: a trained VQ-VAE model with .predict or __call__ method + test_dataset: a tf.data.Dataset yielding batches of images in [0, 1] range + max_val: maximum pixel value (default assumes images scaled to [0,1]) + + Returns: + float: average SSIM score across the dataset + """ + ssim_scores = [] + + for batch in test_dataset: + # Ensure batch is float32 + batch = tf.cast(batch, tf.float32) + + # Get reconstructions from model + recon = model(batch, training=False) + + # Compute SSIM for each image in the batch + batch_ssim = tf.image.ssim(batch, recon, max_val=max_val) + + # Collect as numpy values + ssim_scores.extend(batch_ssim.numpy()) + + return float(tf.reduce_mean(ssim_scores).numpy()) + +if __name__ == "__main__": + # fetch test set + test = vqvae.get_dataset( + # "data/keras_slices_data/keras_slices_train/" + "/home/groups/comp3710/HipMRI_Study_open/keras_slices_data/keras_slices_test" + ).batch(10) + + vae = vqvae.load_model( + "trainer.weights.h5" + ) + + ssim = evaluate_ssim( + vae, test + ) + + print(ssim) \ No newline at end of file From 69dcd0c7dd5b841c6a7ec5210267f88de25ba573 Mon Sep 17 00:00:00 2001 From: blake Date: Fri, 17 Oct 2025 11:26:52 +1000 Subject: [PATCH 05/15] updated gitignore to ignore trained models --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1b8ac43200..e744ba9f61 100644 --- a/.gitignore +++ b/.gitignore @@ -129,3 +129,4 @@ dmypy.json # no tracking mypy config file mypy.ini + From 1e098c0487511decb173da56c0dd924f95501203 Mon Sep 17 00:00:00 2001 From: blake Date: Sun, 19 Oct 2025 09:40:53 +1000 Subject: [PATCH 06/15] created pixelCNN model to learn latent distribution of vq-vae and generate novel images --- pixel-cnn-generator.py | 331 +++++++++++++++++++++++++++++++++++++++++ requirements.txt | 2 + 2 files changed, 333 insertions(+) create mode 100644 pixel-cnn-generator.py diff --git a/pixel-cnn-generator.py b/pixel-cnn-generator.py new file mode 100644 index 0000000000..8a44700dc5 --- /dev/null +++ b/pixel-cnn-generator.py @@ -0,0 +1,331 @@ +""" +Based on PixelCNN by ADMoreau available at +https://keras.io/examples/generative/pixelcnn/ + +PixelCNN to mimic latent space of the encoders output. For generation +""" + +import keras +import numpy as np +from keras import layers +from keras import ops +import tensorflow as tf +import tensorflow_probability as tfp + +# for displaying +import matplotlib.pyplot as plt +import math + +import importlib +vqvae = importlib.import_module("vq-vae") + +class PixelConvLayer(layers.Layer): + + """ + a convolution layer that masks the kernel to only influence pixels behind + the current pixel - allows for conditional generation of the output + """ + + def __init__( + self, + mask_type, # A includes the pixel itself, B does not + **kwargs, # arguments for convolution layer + ): + super().__init__() + self.mask_type=mask_type + self.conv = layers.Conv2D(**kwargs) + + def build( + self, input_shape + ): + # initialise kernels + self.conv.build(input_shape) + + # now mask the kernel + kernel_shape = ops.shape(self.conv.kernel) + self.mask = np.zeros(shape=kernel_shape) # initialise to zero + + self.mask[: kernel_shape[0] // 2, ...] = 1.0 # above pixels + + # same row + self.mask[kernel_shape[0] // 2, : kernel_shape[1] // 2, ...] = 1.0 + + # center pixel (if type B) + if self.mask_type == "B": + self.mask[kernel_shape[0] // 2, kernel_shape[1] // 2, ...] = 1.0 + + def call( + self, x + ): + # mask the kernel with the mask + self.conv.kernel.assign(self.conv.kernel * self.mask) + + # return + return self.conv(x) + + +def residual_pixel_layer( + x, + num_filters, +): + + """ + a residual layer with 2 1x1 convolutions around a 3x3 pixel convolution. + """ + start = x + + x = layers.Conv2D( + num_filters, 1, 1 + )(x) + x = keras.activations.relu(x) + + x = PixelConvLayer( + "B", filters=num_filters//2, kernel_size=3, padding="same" + )(x) + + x = keras.activations.relu(x) + + + x = layers.Conv2D( + num_filters, 1, 1 + )(x) + + x = keras.layers.add([x, start]) + x = keras.activations.relu(x) # tutorial does relu THEN add + + return x + + +def pixel_cnn_model( + input_shape, + num_residuals, + latent_dim, + num_filters=128 +): + """ + returns a pixelCNN model + """ + + inputs = layers.Input(shape=input_shape) + + # initial convolution + x = PixelConvLayer( + "A", + filters=num_filters, + kernel_size=7, + padding="same" + )(inputs) + + x = keras.activations.relu(x) + + for _ in range(num_residuals): + x = residual_pixel_layer( + x, num_filters + ) + + # end on 2 more pixelconvolutions + for _ in range(2): + x = PixelConvLayer( + "B", filters=num_filters, kernel_size=1, strides=1, padding='valid' + )(x) + + x = keras.activations.relu(x) + + output = layers.Conv2D( + filters=latent_dim, + kernel_size=1, + strides=1, + activation="sigmoid", + padding="valid" + )(x) + + return keras.Model(inputs=inputs, outputs=output) + + +class CategoricalLayer(layers.Layer): + """ + Wraps tfp.distributions.Categorical for use in sampler + """ + def call(self, logits): + dist = tfp.distributions.Categorical(logits=logits) + return dist.sample() + + +class sampler: + + """ + Wraps pixel_cnn model in Distribution object that allows random sampling + """ + + def __init__(self, pixel_cnn, quantizer, decoder): + + self.quantizer = quantizer + self.decoder = decoder + self.pixel_cnn = pixel_cnn + + self._build_sampler() + + def _build_sampler(self): + inputs = layers.Input(shape=self.pixel_cnn.input_shape[1:]) + logits = self.pixel_cnn(inputs, training=False) + + outputs = CategoricalLayer()(logits) + + self.sampler = keras.Model(inputs, outputs) + + def sample(self, batch_size): + priors = np.zeros( + shape=(batch_size,) + (self.pixel_cnn.input_shape)[1:-1] + ) + + batch, rows, cols = priors.shape + + for row in range(rows): + for col in range(cols): + probabilities = self.sampler.predict(priors, verbose=0) + priors[:, row, col] = probabilities[:, row, col] + + # convert to one hot to extract from codebook + one_hot = tf.one_hot(priors.astype("int32"), quantizer.num_embeddings) + codebook_vectors = tf.matmul( + tf.cast(one_hot, tf.float32), # convert bc we are mult by floats + quantizer.codebook, transpose_b=True + ) + codebook_vectors = tf.reshape( + codebook_vectors, (-1, *(self.decoder.input.shape[1:])) + ) + + # actually generate now + generated = self.decoder.predict( + codebook_vectors + ) + + return generated + + + # pass image dataset through new pipeline +def dataset_pipeline(img): + # add batch and channel dimension + img = tf.expand_dims(img, axis=0) # batch + img = tf.expand_dims(img, axis=-1) # channel + + prediction = encoder(img, training=False) + flattened = tf.reshape(prediction, (-1, prediction.shape[-1])) + + # quantize + indices = quantizer.get_code_indices(flattened) + + indices = tf.reshape(indices, prediction.shape[:-1]) + indices = tf.expand_dims(indices, -1) # channel dim + return (indices, indices) + + +def load_model(path): + shape = ( + vqvae.get_dataset(vqvae.TRAIN_FOLDER) + .map(dataset_pipeline) + .element_spec[0].shape[1:] + ) + + new_pixel = pixel_cnn_model( + shape, + 4, + vqvae.CODEBOOK_SIZE, + num_filters=256 + ) # new model with same parameters + + new_pixel.compile("adam") + new_pixel.build(shape) + new_pixel.load_weights(path) + + return new_pixel + + +def show_generated_images(batch, title="Generated Images"): + """ + Display a batch of generated grayscale images as a square grid. + + Args: + batch: np.ndarray or tf.Tensor of shape (N, H, W, 1) or (N, H, W) + N = number of images + title: optional string for figure title + """ + + # Convert to numpy + batch = np.array(batch) + + # Drop channel dimension if present + if batch.ndim == 4 and batch.shape[-1] == 1: + batch = batch[..., 0] + + n = batch.shape[0] + grid_size = math.ceil(math.sqrt(n)) + + fig, axes = plt.subplots(grid_size, grid_size, figsize=(grid_size * 2, grid_size * 2)) + axes = axes.flatten() + + for i, ax in enumerate(axes): + ax.axis("off") + if i < n: + ax.imshow(batch[i], cmap="gray") + plt.suptitle(title) + plt.tight_layout() + # plt.show() # show doesnt work on ranpur + plt.savefig("novel_generation.jpg") + + +if __name__ == "__main__": + + vae_model = vqvae.load_model( + "trained_models/trainer.weights.h5" + ) + + encoder = vae_model.get_layer("encoder") + decoder = vae_model.get_layer("decoder") + quantizer = vae_model.get_layer("quantizer") + + image_dataset = vqvae.get_dataset( + vqvae.TRAIN_FOLDER + ) + + pixelcnn_dataset = image_dataset.map(dataset_pipeline) + io_shape = pixelcnn_dataset.element_spec[0].shape[1:] # it adds batch dim auto + pcnn = pixel_cnn_model( + io_shape, 4, vqvae.CODEBOOK_SIZE, num_filters=256 + ) + + pcnn.compile( + "adam", + loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True) + ) + + pcnn.fit( + pixelcnn_dataset, + epochs=10 + ) + + # now use it to predict + slice_sampler = sampler( + pcnn, quantizer, decoder + ) + + generated_outputs = slice_sampler.sample( + 9 + ) + + show_generated_images(generated_outputs, title="Novel Generated Outputs") + + # save model + pcnn.save_weights( + "trained_models/pixel.weights.h5" + ) + + # # reload and test + # pcnn = load_model("trained_models/pixel.weights.h5") + # slice_sampler = sampler(pcnn, quantizer, decoder) + # generated_outputs = slice_sampler.sample(4) + # show_generated_images( + # generated_outputs, "reloaded, novel generation" + # ) + + diff --git a/requirements.txt b/requirements.txt index 074bfa16f5..8420564af5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,7 @@ tensorflow +tensorflow_probability keras +tf-keras numpy scikit-image nibabel From 22fb4cd14c3566a0ac9b88417d76516f6dafa0d8 Mon Sep 17 00:00:00 2001 From: blake Date: Mon, 20 Oct 2025 18:30:52 +1000 Subject: [PATCH 07/15] made code compatible with tensorflow 2.15 as used on the slurm server and fixed bugs related to masking in pcnn model and sampling in the sampler wrapper --- pixel-cnn-generator.py | 69 ++++++++++++++++++++++++++++++------------ requirements.txt | 6 ++-- 2 files changed, 53 insertions(+), 22 deletions(-) diff --git a/pixel-cnn-generator.py b/pixel-cnn-generator.py index 8a44700dc5..ba1c1fd890 100644 --- a/pixel-cnn-generator.py +++ b/pixel-cnn-generator.py @@ -8,9 +8,11 @@ import keras import numpy as np from keras import layers -from keras import ops + import tensorflow as tf -import tensorflow_probability as tfp +# from keras import mixed_precision +# mixed_precision.set_global_policy("mixed_float16") # speed up + # for displaying import matplotlib.pyplot as plt @@ -19,6 +21,10 @@ import importlib vqvae = importlib.import_module("vq-vae") +class MaskConstraint(keras.constraints.Constraint): + def __init__(self, mask): self.mask = tf.constant(mask, dtype=tf.float32) + def __call__(self, w): return w * self.mask + class PixelConvLayer(layers.Layer): """ @@ -42,7 +48,7 @@ def build( self.conv.build(input_shape) # now mask the kernel - kernel_shape = ops.shape(self.conv.kernel) + kernel_shape = self.conv.kernel.shape self.mask = np.zeros(shape=kernel_shape) # initialise to zero self.mask[: kernel_shape[0] // 2, ...] = 1.0 # above pixels @@ -54,11 +60,13 @@ def build( if self.mask_type == "B": self.mask[kernel_shape[0] // 2, kernel_shape[1] // 2, ...] = 1.0 + self.conv.kernel_constraint = MaskConstraint(self.mask) + def call( self, x ): # mask the kernel with the mask - self.conv.kernel.assign(self.conv.kernel * self.mask) + # self.conv.kernel.assign(self.conv.kernel * self.mask) # return return self.conv(x) @@ -99,7 +107,7 @@ def residual_pixel_layer( def pixel_cnn_model( input_shape, num_residuals, - latent_dim, + num_embeddings, num_filters=128 ): """ @@ -132,10 +140,9 @@ def pixel_cnn_model( x = keras.activations.relu(x) output = layers.Conv2D( - filters=latent_dim, + filters=num_embeddings, kernel_size=1, strides=1, - activation="sigmoid", padding="valid" )(x) @@ -147,8 +154,19 @@ class CategoricalLayer(layers.Layer): Wraps tfp.distributions.Categorical for use in sampler """ def call(self, logits): - dist = tfp.distributions.Categorical(logits=logits) - return dist.sample() + shape = tf.shape(logits) + batch, height, width, num_embeddings = ( + shape[0], shape[1], shape[2], shape[3] + ) + + # Flatten spatial dims + flat_logits = tf.reshape(logits, [batch * height * width, num_embeddings]) + + # Sample one index per spatial location + samples = tf.random.categorical(flat_logits, num_samples=1) + samples = tf.reshape(samples, [batch, height, width]) + + return tf.cast(samples, tf.int32) class sampler: @@ -168,7 +186,6 @@ def __init__(self, pixel_cnn, quantizer, decoder): def _build_sampler(self): inputs = layers.Input(shape=self.pixel_cnn.input_shape[1:]) logits = self.pixel_cnn(inputs, training=False) - outputs = CategoricalLayer()(logits) self.sampler = keras.Model(inputs, outputs) @@ -214,8 +231,8 @@ def dataset_pipeline(img): # quantize indices = quantizer.get_code_indices(flattened) - - indices = tf.reshape(indices, prediction.shape[:-1]) + indices = tf.cast(indices, tf.int32) + indices = tf.reshape(indices, prediction.shape[1:-1]) indices = tf.expand_dims(indices, -1) # channel dim return (indices, indices) @@ -275,9 +292,10 @@ def show_generated_images(batch, title="Generated Images"): if __name__ == "__main__": + print("Num GPUs Available:", len(tf.config.list_physical_devices('GPU'))) vae_model = vqvae.load_model( - "trained_models/trainer.weights.h5" + "trainer.weights.h5" ) encoder = vae_model.get_layer("encoder") @@ -289,19 +307,32 @@ def show_generated_images(batch, title="Generated Images"): ) pixelcnn_dataset = image_dataset.map(dataset_pipeline) - io_shape = pixelcnn_dataset.element_spec[0].shape[1:] # it adds batch dim auto + io_shape = pixelcnn_dataset.element_spec[0].shape#[1:] # it adds batch dim auto pcnn = pixel_cnn_model( - io_shape, 4, vqvae.CODEBOOK_SIZE, num_filters=256 + io_shape, 4, vqvae.CODEBOOK_SIZE, num_filters=32 ) + pcnn.compile( - "adam", + keras.optimizers.Adam( + # dtype_policy="mixed_float16" + ), loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True) ) + pcnn.summary() + + checkpoint_cb = tf.keras.callbacks.ModelCheckpoint( + filepath='checkpoints/pcnn_epoch_{epoch:02d}.keras', # filename pattern + save_weights_only=True, # save full model (set True to save only weights) + save_freq='epoch', # save at end of each epoch + verbose=1 # print when saving + ) + pcnn.fit( - pixelcnn_dataset, - epochs=10 + pixelcnn_dataset.batch(32), # batch + epochs=10, + callbacks=[checkpoint_cb] ) # now use it to predict @@ -317,7 +348,7 @@ def show_generated_images(batch, title="Generated Images"): # save model pcnn.save_weights( - "trained_models/pixel.weights.h5" + "pixel.weights.h5" ) # # reload and test diff --git a/requirements.txt b/requirements.txt index 8420564af5..6ac0faa5db 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ -tensorflow +tensorflow==2.15 tensorflow_probability -keras -tf-keras +keras==2.15 +tf-keras==2.15 numpy scikit-image nibabel From 0ed5db6bbfa0cf849b22b9aac2dfc1c32c11eed9 Mon Sep 17 00:00:00 2001 From: blake Date: Fri, 24 Oct 2025 18:30:58 +1000 Subject: [PATCH 08/15] reworked latent sampling --- pixel-cnn-generator.py | 174 +++++++++++++++++------------------------ 1 file changed, 71 insertions(+), 103 deletions(-) diff --git a/pixel-cnn-generator.py b/pixel-cnn-generator.py index ba1c1fd890..73e0a17c2c 100644 --- a/pixel-cnn-generator.py +++ b/pixel-cnn-generator.py @@ -99,7 +99,7 @@ def residual_pixel_layer( )(x) x = keras.layers.add([x, start]) - x = keras.activations.relu(x) # tutorial does relu THEN add + x = keras.activations.relu(x) return x @@ -114,7 +114,10 @@ def pixel_cnn_model( returns a pixelCNN model """ - inputs = layers.Input(shape=input_shape) + inputs = layers.Input(shape=input_shape, dtype=tf.int32) + + # one hot + one_hot = tf.one_hot(inputs, num_embeddings) # initial convolution x = PixelConvLayer( @@ -122,7 +125,7 @@ def pixel_cnn_model( filters=num_filters, kernel_size=7, padding="same" - )(inputs) + )(one_hot) x = keras.activations.relu(x) @@ -148,79 +151,47 @@ def pixel_cnn_model( return keras.Model(inputs=inputs, outputs=output) +def generate_images( + pixelcnn, + quantizer, + decoder, + image_shape, # (rows, cols) + num_samples=16, +): -class CategoricalLayer(layers.Layer): - """ - Wraps tfp.distributions.Categorical for use in sampler - """ - def call(self, logits): - shape = tf.shape(logits) - batch, height, width, num_embeddings = ( - shape[0], shape[1], shape[2], shape[3] - ) - - # Flatten spatial dims - flat_logits = tf.reshape(logits, [batch * height * width, num_embeddings]) - - # Sample one index per spatial location - samples = tf.random.categorical(flat_logits, num_samples=1) - samples = tf.reshape(samples, [batch, height, width]) - - return tf.cast(samples, tf.int32) - - -class sampler: - - """ - Wraps pixel_cnn model in Distribution object that allows random sampling - """ - - def __init__(self, pixel_cnn, quantizer, decoder): - - self.quantizer = quantizer - self.decoder = decoder - self.pixel_cnn = pixel_cnn - - self._build_sampler() + rows, cols = image_shape + batch_size = num_samples + num_embeddings = quantizer.num_embeddings - def _build_sampler(self): - inputs = layers.Input(shape=self.pixel_cnn.input_shape[1:]) - logits = self.pixel_cnn(inputs, training=False) - outputs = CategoricalLayer()(logits) + # initialise latent index grid + priors = np.random.random_integers(0, num_embeddings-1, (batch_size, rows, cols, 1)) + # priors = np.zeros((batch_size, rows, cols, 1)) - self.sampler = keras.Model(inputs, outputs) + for r in range(rows): + for c in range(cols): + logits = pixelcnn(priors) / 0.001 - def sample(self, batch_size): - priors = np.zeros( - shape=(batch_size,) + (self.pixel_cnn.input_shape)[1:-1] - ) + B, H, W, K = logits.shape + flat_logits = tf.reshape(logits, [B * H * W, K]) + samples = tf.random.categorical(flat_logits, num_samples=1) + indices = tf.reshape(samples, [B, H, W]) - batch, rows, cols = priors.shape + priors[:, r, c, 0] = indices[:,r,c] - for row in range(rows): - for col in range(cols): - probabilities = self.sampler.predict(priors, verbose=0) - priors[:, row, col] = probabilities[:, row, col] + # back to one-hot + priors = priors.squeeze(-1) + indices = tf.one_hot(priors, num_embeddings) - # convert to one hot to extract from codebook - one_hot = tf.one_hot(priors.astype("int32"), quantizer.num_embeddings) - codebook_vectors = tf.matmul( - tf.cast(one_hot, tf.float32), # convert bc we are mult by floats - quantizer.codebook, transpose_b=True - ) - codebook_vectors = tf.reshape( - codebook_vectors, (-1, *(self.decoder.input.shape[1:])) - ) + codebook = tf.convert_to_tensor(quantizer.codebook, dtype=tf.float32) + quantized = tf.matmul(indices, tf.transpose(codebook)) - # actually generate now - generated = self.decoder.predict( - codebook_vectors - ) + # decode to image space + generated = decoder(quantized, training=False) - return generated + return generated - # pass image dataset through new pipeline +# pass image dataset through new pipeline def dataset_pipeline(img): # add batch and channel dimension img = tf.expand_dims(img, axis=0) # batch @@ -234,6 +205,7 @@ def dataset_pipeline(img): indices = tf.cast(indices, tf.int32) indices = tf.reshape(indices, prediction.shape[1:-1]) indices = tf.expand_dims(indices, -1) # channel dim + return (indices, indices) @@ -241,16 +213,17 @@ def load_model(path): shape = ( vqvae.get_dataset(vqvae.TRAIN_FOLDER) .map(dataset_pipeline) - .element_spec[0].shape[1:] + .element_spec[0].shape#[1:] ) new_pixel = pixel_cnn_model( shape, 4, vqvae.CODEBOOK_SIZE, - num_filters=256 + num_filters=32 ) # new model with same parameters + new_pixel.compile("adam") new_pixel.build(shape) new_pixel.load_weights(path) @@ -258,7 +231,7 @@ def load_model(path): return new_pixel -def show_generated_images(batch, title="Generated Images"): +def show_generated_images(batch, title="Generated_Images"): """ Display a batch of generated grayscale images as a square grid. @@ -288,31 +261,46 @@ def show_generated_images(batch, title="Generated Images"): plt.suptitle(title) plt.tight_layout() # plt.show() # show doesnt work on ranpur - plt.savefig("novel_generation.jpg") + plt.savefig(title+".jpg") if __name__ == "__main__": - print("Num GPUs Available:", len(tf.config.list_physical_devices('GPU'))) - + # load existing vqvae model vae_model = vqvae.load_model( "trainer.weights.h5" ) + # get components encoder = vae_model.get_layer("encoder") decoder = vae_model.get_layer("decoder") quantizer = vae_model.get_layer("quantizer") - image_dataset = vqvae.get_dataset( - vqvae.TRAIN_FOLDER - ) + print("Codebook shape:", quantizer.codebook.shape) + + + # load the dataset if it already exists + dataset_save_path = "pixelcnn_dataset" + try: + pixelcnn_dataset = tf.data.Dataset.load(dataset_save_path) + except: + print("Dataset not found, creating now...") + # create pixelcnn dataset + image_dataset = vqvae.get_dataset( + vqvae.TRAIN_FOLDER + ) + + pixelcnn_dataset = image_dataset.map(dataset_pipeline) + pixelcnn_dataset = pixelcnn_dataset.cache().batch(64) + + # save so it isnt used again + pixelcnn_dataset.save(dataset_save_path) - pixelcnn_dataset = image_dataset.map(dataset_pipeline) + # initialise pixelcnn object io_shape = pixelcnn_dataset.element_spec[0].shape#[1:] # it adds batch dim auto pcnn = pixel_cnn_model( io_shape, 4, vqvae.CODEBOOK_SIZE, num_filters=32 ) - pcnn.compile( keras.optimizers.Adam( # dtype_policy="mixed_float16" @@ -320,43 +308,23 @@ def show_generated_images(batch, title="Generated Images"): loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True) ) - pcnn.summary() - - checkpoint_cb = tf.keras.callbacks.ModelCheckpoint( - filepath='checkpoints/pcnn_epoch_{epoch:02d}.keras', # filename pattern - save_weights_only=True, # save full model (set True to save only weights) - save_freq='epoch', # save at end of each epoch - verbose=1 # print when saving - ) + # load in existing weights + # pcnn = load_model("pixel.weights.h5") pcnn.fit( pixelcnn_dataset.batch(32), # batch - epochs=10, - callbacks=[checkpoint_cb] - ) - - # now use it to predict - slice_sampler = sampler( - pcnn, quantizer, decoder + epochs=6 ) - generated_outputs = slice_sampler.sample( - 9 + generated_outputs = generate_images( + pcnn, quantizer, decoder, io_shape[:-1] ) - show_generated_images(generated_outputs, title="Novel Generated Outputs") + show_generated_images(generated_outputs, title="Novel_Generated_Outputs_3") # save model pcnn.save_weights( - "pixel.weights.h5" + "pixel_round_2.weights.h5" ) - # # reload and test - # pcnn = load_model("trained_models/pixel.weights.h5") - # slice_sampler = sampler(pcnn, quantizer, decoder) - # generated_outputs = slice_sampler.sample(4) - # show_generated_images( - # generated_outputs, "reloaded, novel generation" - # ) - From 65b1e231182c4d321aee95a3689ad78556faea3d Mon Sep 17 00:00:00 2001 From: blake Date: Sat, 25 Oct 2025 15:07:12 +1000 Subject: [PATCH 09/15] fixed convolution masking, tweaked hyperparameters and architecture to maximise performance --- pixel-cnn-generator.py | 74 ++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 35 deletions(-) diff --git a/pixel-cnn-generator.py b/pixel-cnn-generator.py index 73e0a17c2c..ac42254cb3 100644 --- a/pixel-cnn-generator.py +++ b/pixel-cnn-generator.py @@ -44,29 +44,31 @@ def __init__( def build( self, input_shape ): - # initialise kernels self.conv.build(input_shape) + k = self.conv.kernel - # now mask the kernel - kernel_shape = self.conv.kernel.shape - self.mask = np.zeros(shape=kernel_shape) # initialise to zero + # get dimensions + kh, kw, cin, cout = k.shape - self.mask[: kernel_shape[0] // 2, ...] = 1.0 # above pixels + mask = np.zeros((kh, kw, cin, cout), dtype=np.float32) + mask[: kh // 2, :, :, :] = 1.0 # rows above + mask[kh // 2, : kw // 2, :, :] = 1.0 # same row, left - # same row - self.mask[kernel_shape[0] // 2, : kernel_shape[1] // 2, ...] = 1.0 - - # center pixel (if type B) if self.mask_type == "B": - self.mask[kernel_shape[0] // 2, kernel_shape[1] // 2, ...] = 1.0 + mask[kh // 2, kw // 2, ...] = 1.0 # center (only for B) + self.mask = tf.constant(mask, dtype=tf.float32) + # Hard-apply once at init to eliminate any initial leakage + self.conv.kernel.assign(self.conv.kernel * self.mask) + # Keep enforcing after each optimizer step self.conv.kernel_constraint = MaskConstraint(self.mask) + print(self.mask_type, self.mask[..., 0, 0][k.shape[0]//2]) def call( self, x ): # mask the kernel with the mask - # self.conv.kernel.assign(self.conv.kernel * self.mask) + self.conv.kernel.assign(self.conv.kernel * self.mask) # return return self.conv(x) @@ -88,7 +90,8 @@ def residual_pixel_layer( x = keras.activations.relu(x) x = PixelConvLayer( - "B", filters=num_filters//2, kernel_size=3, padding="same" + # "B", filters=num_filters//2, kernel_size=3, padding="same" + "B", filters=num_filters, kernel_size=3, padding="same" )(x) x = keras.activations.relu(x) @@ -115,9 +118,10 @@ def pixel_cnn_model( """ inputs = layers.Input(shape=input_shape, dtype=tf.int32) - + # x = tf.cast(inputs, tf.float32) / 511 # one hot - one_hot = tf.one_hot(inputs, num_embeddings) + # x = layers.Embedding(num_embeddings, 3)(tf.squeeze(inputs, -1)) + x = tf.one_hot(tf.squeeze(inputs, -1), num_embeddings) # initial convolution x = PixelConvLayer( @@ -125,7 +129,7 @@ def pixel_cnn_model( filters=num_filters, kernel_size=7, padding="same" - )(one_hot) + )(x) x = keras.activations.relu(x) @@ -140,8 +144,6 @@ def pixel_cnn_model( "B", filters=num_filters, kernel_size=1, strides=1, padding='valid' )(x) - x = keras.activations.relu(x) - output = layers.Conv2D( filters=num_embeddings, kernel_size=1, @@ -164,19 +166,15 @@ def generate_images( num_embeddings = quantizer.num_embeddings # initialise latent index grid - priors = np.random.random_integers(0, num_embeddings-1, (batch_size, rows, cols, 1)) - # priors = np.zeros((batch_size, rows, cols, 1)) + # priors = np.random.random_integers(0, num_embeddings-1, (batch_size, rows, cols, 1)) + priors = np.zeros((batch_size, rows, cols, 1)) for r in range(rows): for c in range(cols): - logits = pixelcnn(priors) / 0.001 - - B, H, W, K = logits.shape - flat_logits = tf.reshape(logits, [B * H * W, K]) - samples = tf.random.categorical(flat_logits, num_samples=1) - indices = tf.reshape(samples, [B, H, W]) - - priors[:, r, c, 0] = indices[:,r,c] + logits = pixelcnn(priors) + logits_rc = logits[:, r, c, :] / 0.7 + sample = tf.random.categorical(logits_rc, 1) + priors[:, r, c, 0] = tf.squeeze(sample, -1).numpy().astype(np.int32) # back to one-hot priors = priors.squeeze(-1) @@ -238,7 +236,7 @@ def show_generated_images(batch, title="Generated_Images"): Args: batch: np.ndarray or tf.Tensor of shape (N, H, W, 1) or (N, H, W) N = number of images - title: optional string for figure title + title: optional string for figure title + save file name """ # Convert to numpy @@ -260,7 +258,6 @@ def show_generated_images(batch, title="Generated_Images"): ax.imshow(batch[i], cmap="gray") plt.suptitle(title) plt.tight_layout() - # plt.show() # show doesnt work on ranpur plt.savefig(title+".jpg") @@ -295,25 +292,32 @@ def show_generated_images(batch, title="Generated_Images"): # save so it isnt used again pixelcnn_dataset.save(dataset_save_path) + # actually need to remove channel dim on Y + pixelcnn_dataset = pixelcnn_dataset.map(lambda x, y: (x, tf.squeeze(y, -1))) + pixelcnn_dataset = pixelcnn_dataset.shuffle(pixelcnn_dataset.cardinality()) + # initialise pixelcnn object - io_shape = pixelcnn_dataset.element_spec[0].shape#[1:] # it adds batch dim auto + io_shape = pixelcnn_dataset.element_spec[0].shape[1:] # it adds batch dim auto pcnn = pixel_cnn_model( - io_shape, 4, vqvae.CODEBOOK_SIZE, num_filters=32 + io_shape, 8, vqvae.CODEBOOK_SIZE, num_filters=256 ) pcnn.compile( keras.optimizers.Adam( - # dtype_policy="mixed_float16" + # dtype_policy="mixed_float16", + learning_rate=0.001, + clipnorm=1.0 ), - loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True) + loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), + metrics=[keras.metrics.SparseCategoricalAccuracy()] ) # load in existing weights # pcnn = load_model("pixel.weights.h5") pcnn.fit( - pixelcnn_dataset.batch(32), # batch - epochs=6 + pixelcnn_dataset, + epochs=200 ) generated_outputs = generate_images( From 5fd7b9430b875a97cb38f6ac28ca17b1d8e3e08b Mon Sep 17 00:00:00 2001 From: blake Date: Sat, 25 Oct 2025 15:18:05 +1000 Subject: [PATCH 10/15] produced plots, moved all files to source directory --- .gitignore | 132 ------------------ Hip_MRI_VQVAE_PixelCNN/.gitignore | 11 ++ .../pixel-cnn-generator.py | 0 .../requirements.txt | 0 .../ssim-evaluation.py | 0 vq-vae.py => Hip_MRI_VQVAE_PixelCNN/vq-vae.py | 38 +++-- reconstruction.jpg | Bin 38175 -> 0 bytes 7 files changed, 35 insertions(+), 146 deletions(-) delete mode 100644 .gitignore create mode 100644 Hip_MRI_VQVAE_PixelCNN/.gitignore rename pixel-cnn-generator.py => Hip_MRI_VQVAE_PixelCNN/pixel-cnn-generator.py (100%) rename requirements.txt => Hip_MRI_VQVAE_PixelCNN/requirements.txt (100%) rename ssim-evaluation.py => Hip_MRI_VQVAE_PixelCNN/ssim-evaluation.py (100%) rename vq-vae.py => Hip_MRI_VQVAE_PixelCNN/vq-vae.py (95%) delete mode 100644 reconstruction.jpg diff --git a/.gitignore b/.gitignore deleted file mode 100644 index e744ba9f61..0000000000 --- a/.gitignore +++ /dev/null @@ -1,132 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -pip-wheel-metadata/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -.python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# celery beat schedule file -celerybeat-schedule - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# vscode config file -.vscode/ - -# no tracking mypy config file -mypy.ini - diff --git a/Hip_MRI_VQVAE_PixelCNN/.gitignore b/Hip_MRI_VQVAE_PixelCNN/.gitignore new file mode 100644 index 0000000000..4981c7f217 --- /dev/null +++ b/Hip_MRI_VQVAE_PixelCNN/.gitignore @@ -0,0 +1,11 @@ +Makefile +plan.txt +s_run_script.sh +slurm.sh +trainer.weights.h5 +w-gan.py +venv/ +data/ +.DS_Store +trained_models/ +plot_history.py \ No newline at end of file diff --git a/pixel-cnn-generator.py b/Hip_MRI_VQVAE_PixelCNN/pixel-cnn-generator.py similarity index 100% rename from pixel-cnn-generator.py rename to Hip_MRI_VQVAE_PixelCNN/pixel-cnn-generator.py diff --git a/requirements.txt b/Hip_MRI_VQVAE_PixelCNN/requirements.txt similarity index 100% rename from requirements.txt rename to Hip_MRI_VQVAE_PixelCNN/requirements.txt diff --git a/ssim-evaluation.py b/Hip_MRI_VQVAE_PixelCNN/ssim-evaluation.py similarity index 100% rename from ssim-evaluation.py rename to Hip_MRI_VQVAE_PixelCNN/ssim-evaluation.py diff --git a/vq-vae.py b/Hip_MRI_VQVAE_PixelCNN/vq-vae.py similarity index 95% rename from vq-vae.py rename to Hip_MRI_VQVAE_PixelCNN/vq-vae.py index a9dcb7985d..3512ce72e6 100644 --- a/vq-vae.py +++ b/Hip_MRI_VQVAE_PixelCNN/vq-vae.py @@ -43,15 +43,6 @@ def __init__( self.num_embeddings = num_embeddings # Initialise codebook - rand_field = tf.random_uniform_initializer() - # self.codebook = tf.Variable( - # initial_value=rand_field( - # shape=(self.embedding_dim, self.num_embeddings), dtype="float32" - # ), - # trainable=True, # let the values be learnable - # name="VQ-CODEBOOK" - # ) - self.codebook = self.add_weight( name="VQ-CODEBOOK", shape=(self.embedding_dim, self.num_embeddings), @@ -193,7 +184,9 @@ def get_decoder( latent_dim = 64 ): """ - layers_filters should be the same as the encoder but reversed + layers_filters should be the same as the encoder but reversed. + + Returns decoder object. """ inputs = keras.Input( @@ -454,7 +447,7 @@ def main(): history = vq_trainer.fit( train_dataset, - epochs=10, + epochs=1, ) @@ -472,8 +465,8 @@ def main(): img = batch # just fetch one image break - img_batched = tf.expand_dims(img, axis=0) - img_batched = tf.expand_dims(img_batched, axis=-1) + img_batched = tf.expand_dims(img, axis=0) # add batch dim + img_batched = tf.expand_dims(img_batched, axis=-1) # add channel dim reconstruction = tf.squeeze(model(img_batched), axis=0) plot_reconstruction( @@ -509,4 +502,21 @@ def test_load(): if __name__ == "__main__": # main() - test_load() \ No newline at end of file + ####### PLOT RECONSTRUCTION + + model = load_model("trainer.weights.h5") + + i = 0 + for batch in get_dataset(TRAIN_FOLDER): + img = batch # just fetch one image + if i > 25: + break + i += 1 + + img_batched = tf.expand_dims(img, axis=0) # add batch dim + img_batched = tf.expand_dims(img_batched, axis=-1) # add channel dim + reconstruction = tf.squeeze(model(img_batched), axis=0) + + plot_reconstruction( + img, reconstruction + ) \ No newline at end of file diff --git a/reconstruction.jpg b/reconstruction.jpg deleted file mode 100644 index d9cbc176534c04c49b26fe11aa38bf7915fd9f34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38175 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%0DSIm5b80i%acCftK6n} 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 From f3279976404161dc95b427952eae17e4f2e04a07 Mon Sep 17 00:00:00 2001 From: blake Date: Sat, 25 Oct 2025 15:19:19 +1000 Subject: [PATCH 11/15] actually added plots --- plots/Novel_Generated_Outputs_3_better.jpg | Bin 0 -> 59558 bytes plots/Novel_Generated_Outputs_working.jpg | Bin 0 -> 57458 bytes plots/loss.png | Bin 0 -> 32115 bytes plots/reconstruction.jpg | Bin 0 -> 35633 bytes plots/reconstruction_good.jpg | Bin 0 -> 38520 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 plots/Novel_Generated_Outputs_3_better.jpg create mode 100644 plots/Novel_Generated_Outputs_working.jpg create mode 100644 plots/loss.png create mode 100644 plots/reconstruction.jpg create mode 100644 plots/reconstruction_good.jpg diff --git a/plots/Novel_Generated_Outputs_3_better.jpg b/plots/Novel_Generated_Outputs_3_better.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ac0622922a7de79fe6d6104c3e59b370515d7ea9 GIT binary patch literal 59558 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 literal 0 HcmV?d00001 diff --git a/plots/Novel_Generated_Outputs_working.jpg b/plots/Novel_Generated_Outputs_working.jpg new file mode 100644 index 0000000000000000000000000000000000000000..702cd72af937beb672cb6db492db0caf66790527 GIT binary patch literal 57458 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�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 #?6!)-l`^kps=#h@ZLY>;MBWa* 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 literal 0 HcmV?d00001 diff --git a/plots/loss.png b/plots/loss.png new file mode 100644 index 0000000000000000000000000000000000000000..ecbdcc83b3615fdf4c7ca211bdec910128e62a7a GIT binary patch literal 32115 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 Xa^#8gC49NaTcRZ7#nZ0ce(?VQ$s`5a literal 0 HcmV?d00001 diff --git a/plots/reconstruction.jpg b/plots/reconstruction.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e674c076fef81f32dd92942ef130c6a54d1a8d5d GIT binary patch literal 35633 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 z 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 literal 0 HcmV?d00001 diff --git a/plots/reconstruction_good.jpg b/plots/reconstruction_good.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3528ff73a0735526c638fc48a8d624db056a1012 GIT binary patch literal 38520 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 ONdWr)@hjx##Qy`7(8omp literal 0 HcmV?d00001 From f0c9c09e436f7623e554e8abddc57d3a820307a2 Mon Sep 17 00:00:00 2001 From: blake Date: Sat, 25 Oct 2025 15:19:56 +1000 Subject: [PATCH 12/15] moved plots to source directory --- .../plots}/Novel_Generated_Outputs_3_better.jpg | Bin .../plots}/Novel_Generated_Outputs_working.jpg | Bin {plots => Hip_MRI_VQVAE_PixelCNN/plots}/loss.png | Bin .../plots}/reconstruction.jpg | Bin .../plots}/reconstruction_good.jpg | Bin 5 files changed, 0 insertions(+), 0 deletions(-) rename {plots => Hip_MRI_VQVAE_PixelCNN/plots}/Novel_Generated_Outputs_3_better.jpg (100%) rename {plots => Hip_MRI_VQVAE_PixelCNN/plots}/Novel_Generated_Outputs_working.jpg (100%) rename {plots => Hip_MRI_VQVAE_PixelCNN/plots}/loss.png (100%) rename {plots => Hip_MRI_VQVAE_PixelCNN/plots}/reconstruction.jpg (100%) rename {plots => Hip_MRI_VQVAE_PixelCNN/plots}/reconstruction_good.jpg (100%) diff --git a/plots/Novel_Generated_Outputs_3_better.jpg b/Hip_MRI_VQVAE_PixelCNN/plots/Novel_Generated_Outputs_3_better.jpg similarity index 100% rename from plots/Novel_Generated_Outputs_3_better.jpg rename to Hip_MRI_VQVAE_PixelCNN/plots/Novel_Generated_Outputs_3_better.jpg diff --git a/plots/Novel_Generated_Outputs_working.jpg b/Hip_MRI_VQVAE_PixelCNN/plots/Novel_Generated_Outputs_working.jpg similarity index 100% rename from plots/Novel_Generated_Outputs_working.jpg rename to Hip_MRI_VQVAE_PixelCNN/plots/Novel_Generated_Outputs_working.jpg diff --git a/plots/loss.png b/Hip_MRI_VQVAE_PixelCNN/plots/loss.png similarity index 100% rename from plots/loss.png rename to Hip_MRI_VQVAE_PixelCNN/plots/loss.png diff --git a/plots/reconstruction.jpg b/Hip_MRI_VQVAE_PixelCNN/plots/reconstruction.jpg similarity index 100% rename from plots/reconstruction.jpg rename to Hip_MRI_VQVAE_PixelCNN/plots/reconstruction.jpg diff --git a/plots/reconstruction_good.jpg b/Hip_MRI_VQVAE_PixelCNN/plots/reconstruction_good.jpg similarity index 100% rename from plots/reconstruction_good.jpg rename to Hip_MRI_VQVAE_PixelCNN/plots/reconstruction_good.jpg From 83638f174c746401ccc5fbcf0ebd2d54073e2074 Mon Sep 17 00:00:00 2001 From: blake Date: Sat, 25 Oct 2025 16:37:51 +1000 Subject: [PATCH 13/15] moved files to subdirectory, created readme --- .../Hip_MRI_VQVAE_PixelCNN}/.gitignore | 0 .../pixel-cnn-generator.py | 0 .../Novel_Generated_Outputs_3_better.jpg | Bin .../plots/Novel_Generated_Outputs_working.jpg | Bin .../Hip_MRI_VQVAE_PixelCNN}/plots/loss.png | Bin .../plots/model_architecture.png | Bin 0 -> 25844 bytes .../plots/reconstruction.jpg | Bin .../plots/reconstruction_good.jpg | Bin recognition/Hip_MRI_VQVAE_PixelCNN/readme.md | 40 ++++++++++++++++++ .../Hip_MRI_VQVAE_PixelCNN}/requirements.txt | 0 .../ssim-evaluation.py | 0 .../Hip_MRI_VQVAE_PixelCNN}/vq-vae.py | 0 12 files changed, 40 insertions(+) rename {Hip_MRI_VQVAE_PixelCNN => recognition/Hip_MRI_VQVAE_PixelCNN}/.gitignore (100%) rename {Hip_MRI_VQVAE_PixelCNN => recognition/Hip_MRI_VQVAE_PixelCNN}/pixel-cnn-generator.py (100%) rename {Hip_MRI_VQVAE_PixelCNN => recognition/Hip_MRI_VQVAE_PixelCNN}/plots/Novel_Generated_Outputs_3_better.jpg (100%) rename {Hip_MRI_VQVAE_PixelCNN => recognition/Hip_MRI_VQVAE_PixelCNN}/plots/Novel_Generated_Outputs_working.jpg (100%) rename {Hip_MRI_VQVAE_PixelCNN => recognition/Hip_MRI_VQVAE_PixelCNN}/plots/loss.png (100%) create mode 100644 recognition/Hip_MRI_VQVAE_PixelCNN/plots/model_architecture.png rename {Hip_MRI_VQVAE_PixelCNN => recognition/Hip_MRI_VQVAE_PixelCNN}/plots/reconstruction.jpg (100%) rename {Hip_MRI_VQVAE_PixelCNN => recognition/Hip_MRI_VQVAE_PixelCNN}/plots/reconstruction_good.jpg (100%) create mode 100644 recognition/Hip_MRI_VQVAE_PixelCNN/readme.md rename {Hip_MRI_VQVAE_PixelCNN => recognition/Hip_MRI_VQVAE_PixelCNN}/requirements.txt (100%) rename {Hip_MRI_VQVAE_PixelCNN => recognition/Hip_MRI_VQVAE_PixelCNN}/ssim-evaluation.py (100%) rename {Hip_MRI_VQVAE_PixelCNN => recognition/Hip_MRI_VQVAE_PixelCNN}/vq-vae.py (100%) diff --git a/Hip_MRI_VQVAE_PixelCNN/.gitignore b/recognition/Hip_MRI_VQVAE_PixelCNN/.gitignore similarity index 100% rename from Hip_MRI_VQVAE_PixelCNN/.gitignore rename to recognition/Hip_MRI_VQVAE_PixelCNN/.gitignore diff --git a/Hip_MRI_VQVAE_PixelCNN/pixel-cnn-generator.py b/recognition/Hip_MRI_VQVAE_PixelCNN/pixel-cnn-generator.py similarity index 100% rename from Hip_MRI_VQVAE_PixelCNN/pixel-cnn-generator.py rename to recognition/Hip_MRI_VQVAE_PixelCNN/pixel-cnn-generator.py diff --git a/Hip_MRI_VQVAE_PixelCNN/plots/Novel_Generated_Outputs_3_better.jpg b/recognition/Hip_MRI_VQVAE_PixelCNN/plots/Novel_Generated_Outputs_3_better.jpg similarity index 100% rename from Hip_MRI_VQVAE_PixelCNN/plots/Novel_Generated_Outputs_3_better.jpg rename to recognition/Hip_MRI_VQVAE_PixelCNN/plots/Novel_Generated_Outputs_3_better.jpg diff --git a/Hip_MRI_VQVAE_PixelCNN/plots/Novel_Generated_Outputs_working.jpg b/recognition/Hip_MRI_VQVAE_PixelCNN/plots/Novel_Generated_Outputs_working.jpg similarity index 100% rename from Hip_MRI_VQVAE_PixelCNN/plots/Novel_Generated_Outputs_working.jpg rename to recognition/Hip_MRI_VQVAE_PixelCNN/plots/Novel_Generated_Outputs_working.jpg diff --git a/Hip_MRI_VQVAE_PixelCNN/plots/loss.png b/recognition/Hip_MRI_VQVAE_PixelCNN/plots/loss.png similarity index 100% rename from Hip_MRI_VQVAE_PixelCNN/plots/loss.png rename to recognition/Hip_MRI_VQVAE_PixelCNN/plots/loss.png diff --git a/recognition/Hip_MRI_VQVAE_PixelCNN/plots/model_architecture.png b/recognition/Hip_MRI_VQVAE_PixelCNN/plots/model_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..58680e924ba5601d66fc3e44c619662c760db87a GIT binary patch literal 25844 zcmeFZbyQY++bxWu*o35{fPj>Mgfu89($Xp29nz(!v>+W4(%s!E-5}l4(%to4Yd`Nh z&UnA)`TqXKIpeU$*n1;*-)sHW74w>NUbpWXDUo}(32&pIpxhIEEi8+Ia@z*}Kj>RwrXwyQjB<(m^Sw4b6b0oWim32&dB@nbNheo{;Y)!nr2`*f#=>j9jf!dv zsbaSj2JqA<$p;iwHN|CA$4nUaWl{%CdQE6cl?Hy_RCQrgNX@`7Nq@fPLgD+UdlRF+ zlg44AmenC7x{@_?cz3%ZNMs|mn%p?_ct7 ztRK?+hrbal#rZYV=ik3x(-60c{`<=ar(mPcKce{euiv+B*xdgQufO~WmCN_vU*6~4 zuMe^R;pK(7X9T7G{naTb;;jBZE}yp)XROkeM#E*DUG4BQ@=gp}qlO9O92|<97C1)q zia9^3H|w$;p21HZV|byH_#IArXd*v4Jy;id_pW4W^5H*kh)wv+B0wQqae4B~RYpom z)Nne5-_=BLjbS&QKYz|?_2+$BQ4E?*T6+3idpP~^3J!9&DoQ3MSyOKxZ^_EZJ)ptH z!s5z2J=|QK{Ct&(lJaBWKfe?FvD#@j4f&-{n7j_~UUVp&rQHAFtp2xu7XO=v(*M1D z2+sfC68Zno(~oy{_(3=^F@Z@+ns+o(X}k0_CdOom6boxXa&;&d3l9&C{F?jG%ndyQ zgOy1tib%O)14%aH-`7yKc6$WoPWD&15213IeJ;ce-e-xRpiuf%Q*=R)FXMjg`t?M~ zZyYz#(Ox= z#34MS@J5$5lAv{YVc~QA<%QaI;bPY}-Qm2q_8VASo_l-m9G%-Sw!Q8V&Gse=aqsyM zKQ}UZ9K&wvRixiR@%Zu0<>h5gyA>R%cwS$*bg7wx_3^6xT-j8y*RNl{&(CKX%GV5X z+FfjGcRgN+ble|Qy0=`z7H5VtV+y_1-RW655 zW@l%STZmv(6PpsDpfI#K+R~QKQI;ul8_1A3x;Wjm`x~s=cVF$Zw>KpVOW(?Ao!u(l z%5c8rzWuVtix)2nTn;T7PNG>2d$SbiNnGX$Yiet)7dsy`oGf%i-fJr&4oLNB4QI~J zVUpV(`}O(G_D%;A(NJ+w(bj}*&&G7DMpdbo58UI}-CZ>imN|C_twoBc|CXs6` zJv|ubr-vdE5_e-b%x^n5>|*z%rlsk0L@@dU1+@eTT-+r8MB*%_%A7asRcW-;2xq+> zwe-%+)uWR&(%*n|tdhl`lz%aCu(DB5>UU6eH4j{z{`hCiD$SXdnVBmX7#O4W&z?Oa zaTaoRfg@wFnSae@J~lAVVs)^l5+F^qc}w{J z?fC93CWf zq9+x{ZP%MFO_rlsAKx#78LSeJ8;d>1vh-8Ay;8l><~lh!IRT5#wS%?MWCsTyGfytD zCEX_)YSs3+W+tamQBkg&!xdlF*35F03n`}8xvwe(rcO*wV&UU^Lq@9c`t*<7VXAo# z5vBV(MO1NxWMQ$rgufBumnZ#Yrt2C;xUvEAxW>GS-Qv$L~DN*B`6Pn#A`A5}ipZ~qQp#w*o%f5q9s z*X;4qZBmq*ckVQZkh!JU2DQclOwnx%q53gvSM7clYgybh;aFw&*sepjmr%L^L&4$I2Q7TB+=wv`R#swFEI>NrhV zLIRDInbVJ!Iqe##SKBl8m~-EUyN5{dEuV50w-0uAcIM_VANw@Z;GO)^A1^~88xL~# zO}++SiRm!<<#CUP)qE?Kip$2v27!Qk%}U%U?WX!M=cD#J@jP4!aHeLHRk&`a2QM>a zQ+o?_MRHV2ZwHYH3{{&7&%clIx0eb~i4%DqkczYu^`ZAyP5-a*oXb54;w<$=rLZ#jm65(k|I;&%TuS z#&K^jOF^hBhMmQFR#?5l>iMPxmduqTb`7;6Jzu@a@o^$Zg0@|EsL=Xy7=)W2iF-y0 zb+?DqEJe%o4GndtYMe6UGw+X;TL!5V8)z?e$8ox!aXxul^$9A|pGZyjpYSX{!ShYj z?}*@Z-pj~YzlBY$1;z5fnJ(qMH6QLZUI!ZuV`Jmj5)#5ty4u5Nb)#75czDz{^RR+H zwn{&VaWY!^8Kt0koiSo(pc-}PYh2uyOu2MA{)n(Jy`?G4V9Kq7gXX>Eeg!g*vm=&3 zVlGdQ%X55o(;?wflfge5PsqkeNl63SLTPk6qgXhW4Xv!0r<|5Z8cs@#`^}2TC_==g zq?(~T`qa6d{_5zsW4qY-vxBKV$DzFSg{Y{gkH5bVgx9ZzhQ4A$>Ak;wsELV*&JJIE z-f4XqS=pXzsp;^JtphJ^x`#Gi-IZ z@s>fQ=o%#AbGY9sht0rvK9?koTIYYRJY-s(ZMV1kBTIJOZB>Sa`wsJ+-QCSM$Xvfy zsMk2kY;Ir$qmPxEdP6kQ^K-ZynDOp*vO3Ou#>a$*e|3%=-F0l%u5tj{^M;yl-pXK4EU>`@>%KY9&S=pw+L85VhxDUL4jt!tVmA@It#s z_$NER&L*06$LBRsv!d`plXANquhY&o9{aT)M3yxlLa4-(pmr$NII=(@?`;qUOS1gy z2uDXpmCMYc_0*uh$s`Hi@;}UG%RP}6IR8{q!sb6tak{m&C8(|*tH-?$Xrbn8rvvZa zY-ezI_-A;`I@_~NA?xn$?q@O)K4yVSQh5tdfsf91d$ys^k~1*e-K;$%g$kSMQ0~*( z9pz75l;DXYjxVz`dZV+Yh}(1W086(7rY>pifvv_vqEL03%1+iDJI zeN?v|8N#uA@x!H0l1YB$xSSgKCRddmIZuvh%b8!Fu^={~7mT`UazUD;R`BujlQwu` zh&Ve}>7C}it?sRLacJU(N@LXf{lnm?a-FNwT>|DG1^n<-Zj$HJkx|GV!ikHe&67eY z3alkJJz34KXNKM!#-vFK;HwEK5;rhN|4uS`Cn>3Gb&PNu(gj!9ttP$rd>am_z~mGK z^ZtELz*os?7@W}R;D?Fk?6EXb5wyuEhg#`t{Yyj3_sFhIR? zmIxb3cnl*|cJwC)>;8bQ5_MYwl}k-b8sWSpxbQ2Uybn~msrC9BC3f{Yx2Wo(Qn6TYC%IM_8AzE z2b_{7DO2z6h9bDo9**0APb+(k@>KwH&gJQ5z0@;FN%&J1t3QGzMtxWJSBE37Gd_6m z01~gc%zV7y-LmZ3SgH7aMW@OjwSJbe{JnycE= z)pd`Bg~jK~mzR()Gn<=C^tLB^#zp3jEHEq7wAl(c@4)8)uW8Xw(kvAc8(ZE-~?)_Tb>) zEPQk|ItSMjukA58c%07yN%`oGHT`^jf5IIxj+JkhtN?C+IXZpRd8kwOaUXqztj_w; z<9erWCrEzv~${N0kbVouc5+hQKW9$PwXq%3aNpjk~Iy}yjhq5U6hwMxre7}l!=b?EB* zh9_|5S#Fj?Ing<;5Pdiu8kIILQ81Czt*~E@86BpANxd_cOYZ3CDB~daZMD6hT_l4F z1&R+mUSH@Q(UZf_S%iJ>Q+3winVe$3xar~H5o$-oX7pXP9G<3^O@iA&^ymd){~SSk zXQ%v{`1#4c7SO5G#3fauTy9?dVvcbFS%eu7HB6t*t!^<1^m=V2pocWMpf1 zcf`5?jENPMmC-q;P57FR`O80jx|V%V_$KkiER=D)@_N0t`%S~@#+k~6NhxbND#ds6 zdp_O57FJb_X`9mqA~p%8D(X{K=&Yh~0HkiABq`>q>h#3(QI89}`};LRHq~!*X(B_0 zQna?#<Myk8Sb!Kodr zJ-n32M9g71#Q?=~XCfcikY#sbqqk=k-L;O+&VB%jl~dBvOx&d+nKbdBF%0cJ z2rUi*C@o%BT>4sC8Xv+28)7DAI>BTx%Xix2a?)%(GcyyxY**iN+Aap@L_=3ywPE=C zfO3(&EK9S#E=Si9_hXzR>n#CN+W4Cg8G3v2t*DHl9|i>0#R9&E;?Hy1!X}8IwEL zSvUYwN>`nG-a}g2ww3(1R#pX$OK}biC;T!+x-ICFL8!Un%F0nAwJznOOJUK`w7@@5 zqxdv73O7B4{#lgc<}$w*fUh?H!v@c#(PyYtMm0pq{czHOaVmjO?l?Af*n4~IGQwfX zN#u7zXQzZrk)CMRKI+x0decn_t~Oq`C5TV0(WxvzY1fw6cpPNRz{n_hI48I|d)ujd;?8bw;Nitz zK1Fh-C5}#^%b?lR-MH=oOi?U{@wU=p`RHw*|$K~@*Ko!a{+Xa>Tg@dunrS61tB z>E6U`aw}=Ve;ePz0!r4K9Bf=%ed~hAxxanM)Y#`~p2>#sPOoD5TokvhUGB}ZUF@`5 z0}Ls)qmhhBQ9gu+rns&P!x7bb&;!<2a^nhF|g_7AD@=@@e<}i5_AArCuLOoBh4Ly(^sevr^7@HfxeArJOTX=8#?f-!gNtmnK&pHBxCSv^d* zi?~lE=JRaYRc>vnRt+YU#w2&H4wwd-kq&E%2Y|BBdajw5kBt1&5diS6jfU}YwH%lM zdQLH4_`oc0B6i!$+uI+=PZNu0e0*=A$Su--Sj=M4(a@z=lK!s3bI_quQ&S`C>RPjC zZ|i!xUS3qT#`U#-a`G+kQq!~Uo8#ruFgQ2pjUTw4n`4nJUaWOUieJ5FHKpu_%9UFT zEPx+$M?avPR41MpK4?WssDF zNEz}N3|8qRH8FVOoI7Fyru&f^m$gn$3vjN?Y?Q(&FgiNA!fNI!ItllufPlLyaWF^{ zSxD!;gl=2_>@g0L1~JOk-#*H<>3T9ai;*II|24e1D_5?-D93fNd3nJU)I;a-^y$;B ztr;O+*P}Nal5Y(R(q;<1G003}(5A+Km@lxJc`<6(m?|DwVBAlQaMlRqieSVGK?%{aGGx0QRpu104loetgRTm^cN2JFV=KfLW&9 z4oMKgjgZg}i}KYU;NYDdI!yNb?wCDLV^XicTpuef&X}A)!ypZSWQ}HEwVdJw07unx zit--tl{T~{>W-t+Q{COguA6u74ou_)1z`;3s8F7ovA2Zl3iIjEix_r{F!A$i;PLRn zbynN2{{q$lq4I!FRL2vjJzo6gxL!K^XngHK&^hqN1k76R%}#+@FL2z}L6|M^$S2`V z7hee3e?i%OQ>gQ@>$GTa)iV2txt>5A*9@OYqY;`ZGK~-9s9-~f?(8412yBN@1(LMv z$mQ^xW!-bAIc5XdXT|#HojAzsiZ#cs56yR^%>0|)w{7|5G=dgJ7_J*35|fpONS*GA z_@%BrAiFZQ%fVE$<*9cLL)2?Y$x~jhtJ%x+ZpWe82s_aCS z{ZcP+n-YrW!8Q9IOxQ<$w-YS@NC01eJ5-$UbCOz2Bso2o(FrQN-T6|S1%t5#$(dvA zW156JckbQ|bF=0H_TUi>i8M>P5!Kfj^*3DSMFz{|=;FhM_KG3WgS|b+;muEL%u%d*ki`-l?_63$v zXJsH0CBBXyhGtgYGOeFiC()u7|Nc(Bqob>PZxycO2qJGAw0v4>5+V*WA2=yw%0Y>D zC%p%R1xz7DMG%KgY`veU4uLO?^Ul@Ui95$z#;8NvR zH-HVe|EAoyznK`l#^^);dZz#FYxfrtM+F6oF3&WF(71j{qU&Y1=^4t-)0IP*|+_nQC4s~ECcDy)V zx;MVq9p^t;?LZVFf8f`mT4v@uRqG;N1|tO?jH+IbG_J=t=aBH&H^NATpevO3K+@D5 zFA@#fvg(#OpPN4*Tl6k&mW3>4z$^?K!BKK6)2(OBKi5_(O_}x8yC!0)Id(fhmaiaU@2vvL5`hc1K0mPw z-MxwWmW&_}d;kL)mrIlmi|MId0;>{~o4*E-3P z3adt`h{SZYgXPijvGJ2>kN|)?5i4ROC%=*|ouJ6DDd8lc2C51FW@2$X4;(|jU@Xs- z10D}VV?-u$D)ESioSX#k6A>6N;+zHjvKP3bz1`borpc%d2(y2vm*DL7%61B|V#Hah zZj7tENmJ}G|LJ)>3DnLc7_@%%^hkp*#OEFnM@B@w?NXr5w1lL87-9?2L4M8UaAUS~ zSOdG*um=yGY}P_?aq-Jq=Y58$1jaONAk?CDj_=?<`RlH(%w2i{S}jgTdV0FQc7xX~ zm@-6<5x8G}aUx#W4ZJeWVIdH{O*@d03T~uL{`irSBw<3vgkS&uHEJq)adR8!bRQr# z2-@+Us4L$k<5x%eT%oI&nBOc8u1Pulvlb1x>?J!WwtgnlFu~bnuhX!x$^Sk8#gl!w zt7l+^3%Z8>j{P3o4-Np55N;uFbOi=e-qNbd9WL?LuYI5gd!}>)6Pl+yq|uMRzcwl- zYrip3Nj+ZH@{XfFT{?0t*>bwhVD;1I&%VG23&o9>TV_wmo;CVnha611pPCo159g{W z$u2>$NP?-*Pyb7L#tFQjFtB!#Wz)H8&qkLVpkLy2WVu}$>g)RgXVk%8F3H$@83~L| z$;qj)e=0P&s>8(Z4A5xt5iB8jec`WM_BiE}0z7^eI7AQZ8xejY1 zEG&S}`XJHzs_aa+fhqEvpVu4Q;R;JDv0flx5hx7*9mWCe1Dk~VU2FeuK=MuJe_2u` z(M_A(K@yn-xE)dir(N2%Ebi*&*0kK8PGtu~Xp-_!h+}8SvKiE8J-H4L2w%W77~{H5 zFQ4%cW-zMEbPlQjJ`Il_2iw{j=_S@f%6|TCc%TpWfvR0-)JHMu;GZm=ONxo9WiwU@ z5$PMmfASid?W@MdMxW!|C4Z=inGrpGMf&2Sb!*Z6#UkjPQ-FkR!y@LxO$W26fH2KB zR;hZI*|wDTj`XKv*PbkhvcVxC6viTqX|1&c(%BX!Vj5~oEX1@CMIx?Y!!?p1w&~dc zu^N@H`^LNyz`LG+*s-X~0<}5G(kQ(~DO-!lGF!N61fZPJr8$qwQ%x*P%SbNEZ7Y?5PgIa4=KtqzIGsx$+YeShnv%y`|Np&xiPc+Al>9CUjT|IDgwUo z{^iAKzRodJ@htb(9A+bLfXSmBI_>eeprp^I;^elO_laWG_WV0in2hv3fL1tEVqv}K z70mk@S+!_Du|7M!)NR{=5k-6~fz>c@vFezl^%#(6QxDyoK3sl?v&rQRF}UR81$@b# zR7kTBXCR&Ze8W9?zuE%T8#4FC^eHfeZXtCFS@NQV6Tnz$ZJV0%{y7E=`i4OXw0fj; z3RMCU?E^YQ@|+BynI4(I`Ch0FSLx>E$jAt9?Np_-4w-8I=u zKo39|TvC454CQC}a>b!laHk+09E@8ktO9){WbFc^CXS_K9dQ1Gnc6(>{(i5R3^5+0 zgwf*ueTs2lgb|EEPil&?1(jF_CIr8rg?Pdj*@zGdB5M?z@qNV010u#85V=KaFM0fc zm75vX^iZg6It4ZqYKBhf`2%TDgC64z1e!WeEFOSDCN?yf_EGMs@$W~H3y??;qw(4R z_i_v>Jjchxd=I4?A%wx9@dMxl+aPP*b!UJsxE+j|b?Q5ny--VmRqxgtS4}T^z+=w< zb{2i*ODMrxEo2^1W;`u0s~|H~gEM4|zT9T!Xq{X2>{2pbtx_3#qaR3o2xTVwIKAnU&(86aUmTY3LPDtHz1G_bJ++Z zH{{?DDcKe?w=$UR;|O<^=_bA) zQ5=+omSErB~>J1yhQJ4Z( zA}LTnjF8_ioS?a-dNzG|P6o%6d~yURvJfWGrWP>0NKj|C+JJ=QRb5?e*2dS%@QjR% zEPzZvqm&P(kkK;4pwZxU&u?MS6EpQg?2DUcM{_|%>rh{1%ya<&R=isdG10v85XfO` z7nrSOpbUoE+49)T-vn(%OXf{_`m-rVR3K1=gDGC(kO?^Lq_mMe-AU4G3kk6+6&xS? zgn0y3GWKvuDXEAYQ%QBmK2*T@{S!2Eb9tcL#;oF9LqrBd*)BCvsM&5Nidltk#N{dx zp%t#d%MLCTjxIAIUoJgx-gXh5<_JW!&L||F_|V+k9Q*z)6d;ok0k5H|yu7^4eZheE zq1vybYk2^RoGkp+)nFRmT24=xh1`Nct+$#dinpFQUW8d_HTBM)F`ft6O8 z>;a6SfbAwmJfmEoACRGBw(vKHuv6OYW425X$J|sPM$#6X+uScVmHN8%v1M8 zs7blWv)i|CgD?)t9xW{`;xJe|k&fs62{%hMUUHYBNMX%<^@v%3Ks*=^Fcj!uxOj}J zpFsD{M1TD58c^F=m7YK$%kIB;`^WhASjeV{3xaMC@?bp^s^Lh5b@GZ}0Z5sN=Hq1{ zWZ^c<8vO1!STGzlF)4RI1;E?SU$qp_ESw zI=4ZQdms>BF?WxMKZBNt%#EPFWJXlJTfPrAF4LWs&o#aDKfuH@4=5^o=i-z=E&!8;7v|GHxj!ft< z)81WGy>E2jQ`^;M>KdgKkox)ym^Kl^12b?A0P5QHxwXmH6uTOtQ_INw=>v)ObEG2j5<(EvLMrieW$+4+!kj;9iOme@Ym z7!=;uNa4l$&S)9RBM{$k)Gab33-nrBRc18@_kGhwr$Een)qa4i`U1=?O-8#{E5DU=M zoC@x*fe=dq!V|{2a0W17Zf$QDR@6efgfQ#2`ZbawiVgN4T8+nAXQ)173Wx(WM13+W zCMJv9Jf3i_hcz{mAYih>no?8X=)tg^*Y|uF2#kKG_<|Mrj;+Jf^3Oopz>}rm;J}-i znX#WNXXkvOuGKYCrPJh><>0~%b$`)bg2m1=lbuB;OC1bwoz%Us_n|K*ov}^>;%&cS zJtgs-vH+}H5;ZqaQ}L+0h{H>D1?D){VGzbU6vb%1RZ`P<*xdg+iaV$k6nq}Y2-{oUoh_nIgZVlzHsro6QCZpK# z(#A$06iXd22WFKM^yCA*0FWIG0DCCk5X|Srs9a#-E-)FSYbqP`Og<}`x9?XCGOq+4(vkofh%W*R4RdU;IoI^2QlwtK-f9_2y_kRC;Hy z2Vl=P#?Wc{wb*TrHHeN7D)zU7Ku(%Ro+Cm95CwvOH+x|&_fPkI_b3n(UzxRxgMCDE zIgrsQF+#A~OqDOC`m2q&J|1IiU# zH7;(`7Wd}MkANdfOis&mT+fykY?mQ&LhKloUW{`el<7n1>Lw6}B*_(Qls!0;dC10w zgAiYr7w7ELaa}T*O{A*sf3L=)Pw}{)Rg6{#{%s=VVrI|V5>l`LZs8?h6I?Rv7YMXP z#FaJBaZa#`)TowO2Eb2G?JcNv*sKq|wGdZg{hhgviY6&wF~gaoh{wh@v3-3@kBpp}2nB)BGVeK>~) zwP36XvyRflRNh;j1_ecMrbSFV6=;F7q)?w@X6NlcA&O~ByiX?!025?GvfZT~C6Y$k zPd|Wt=><2^H#8@pvqE#m>5Y@Ativ@U(6T`-4N+TgadcGPw;cgPfr0c zY7J|+beUO&!BhtmwVG=wu;1cTtIhpGC_D7uzpTz1_+zuXs5gbi#L%gf&ld;9egmc! zG{@ktU*AK6(FUs};uey_n7u{}G}xjcvizlP5aIFr#OPeXL?)pd%=ZD3=_*M(d8x9)xjhY>PA##OUi(+AU?QBDh z7K4HnJR)>3PPPDhk1zzTC(G$l0zTM|+>aG}sRSMp(EK6!%x9}5roKGe1r(p|+DKtm zP(9eiW6)5UHHrha1M zo2%NPI38^!&W3wJLUs=S&@BDgC`N33LJxxeqeqXv16Ih=4+#zJE4S1HDR6M{oW-4Q z(9_OP&-gb7%wG4uD)Urupr^%k0b|(*1o!AcwZrBt^m=65=81a6dth4UfZX(Y|Hc@z zf))gj3Wv@38RY;UA3-4K9+g}6#PMRk$UuL6W1c1kE}{|aWsEDKg-{0VoxB{t`7ka-tjvLy6~*sX zl~zWOuVMfm$0!c-n38+deDYcn1#FBec(BMQ|oNk;0z0Z>A{r_9Vd~%UE*MG?;9|V&{jG=0(Jljp%P!Y((L~XDJ^RU z2N6)Ud;g_zBsy--IycZ#f=%PvsO?JL zF=DYXr|(&DIk`K$bv43i<WVw}Hp9^JFx^wb(xo{Ht7-Cq2 zGK44DG83TA_=I`?qbfMta&|~`T!$lxVT60ER+f`SAM~Yud|*sTd?*}@5xW>+CQ5Qd zwxzm1qv%@{-_JDy9~2v$^No9m#CIFRDs3a{d$SBc?*NQl&%&@(di4rsZikJ4krCyZ zop$;s9?uKL97?G^vN9fPcWQ9)xh(xqAB0u8AlOil+0Vm(V(<%Ud2S_NvuQ-7^FCdf z#iSoBoS+;{@2#*JbfP>=P;`U#M}5P7l=2_A&Dtn}@I=5{Stx@R^$77>L+w``kb-3v z1m7(w0ay07KRrlq9F9wG-}qK(^G+b?5?2z4h^=UI;87$*WbF(R!!BJ_BHO-$Cfjt+ zM8K*D3Id+V+&=P!$czc1FfR}8JKNizmtX?U z;!k@gA|)qR_Khe9k=M!u^603kU$Jb%YQkH@vJ8)~c6N|1%@fa7)V`GdCh&VGC|<&P z7El(DGGy`%tfUGP7hom+w&tI0V{6+0NvLqc8Wxy!TfdV39V^YAM60IDZ0Ks4Lq=dtfso35wbH?mt9U{NUteGqsC zIdvNkrC4q|vC=Oxecg^(kdVx` zh;3oEdnWaR{~zN)EIGewvB8%$3lRvk!k3$1eZ)uDQ4q~q11kY1wxT`g{Pv7#lSDC* zJ;GrIOB(CHy#RZhJ$-kHIWfU~{?!bb^XpDl=>5lS0OFJa#Lv=fDDinra(?USvez!h`3;JAR#D@;oMk(oa&ld!JXFqj1*oNYAXUpR_O$Q5=5`9Mj$ii&oZ*^FMZju-K(L#dLN zBZA^841)a?6p!pb_|<$t>Y=-a~ggCxz9LSW;*=j z?t`a~q}RDjN&91>{L3y~T4D1^7I<`EDapCH2|-PwwZiARk{1a(A*$oDJ z8X*9yo5_$M4&)H^f;F z!+Q(R0e99OO8sD;^F(&G{Kjv<&I-I><`8TARf-mfc0C84AVeyI+1nP%{V%;s)pCnm zXA!qKd&|kH&-6-pk0ac`q9qYe1Kz~;Iw48xCSCGphCaFK z+N};`QdYhJO4J;29Sxpl%)^m}TmzpxyFyQKILP6zZPKg36Q=`;isE`Qko(>dIt&YE zuw4yiQ3G)L-U2j$EbQKf%l@+*#0mtiUyx)hr;NR}js*l}v&&|!Vc*3XR95;MY51m# zkKNqdkTC^V8#;b>u&0#(6|^0gwg~fpI#`U?MD}1Qd9-8&i1h(B?4aCT#Q(u1?#gC5 z#4w7{2hNuGG@ftQZ`?rg+-o1kJ}sC=9T5_#>)G^okRd{L01zvgcMKKQumUkg0kbW5 z+Py%q)E)<;1QsrC>an*zRX4c#sTY&hFA+2Uark4ItKcp91;7ya(NFnxC%1t;W&HY) z^U821&=luk$#nwGHhYMf7wT;!YwUl6yW8M)1Ow?T%Eye1$B(F~vxef>j6-G*z@Lyo zod)ay<+qR@lanL>;FK$@60h?;%ZGNiwf8Qbs4nX|6VR`6x&8T?0-+8{Ru0cDH&gAs zB~z=35jF#m9`*Qmv0=~}-B)6yv#(@ag4CuB${}LWG#iC2m?j4-t7}jv1+}!k&+5XP z3PU|+HW_%_)d4d>?oc^w42TZd=Hb{~2e@+d=OYGNI0?UN#Z2CO*ou1o4g-y5kxQijA#k0cK z=7lt&KloW)FGzXpJCo=$c7JtsN$%7~#m8G5cuUyag+mts;u$fl!~)?AZtYtz+3#;e z2w62%2(GuV!!*I5Rwl7cw+!1fgG*Uq4BvR2idF{F5HnX#6EPt27FdYLIT`^o9JBkG zP7K5+xDL486Z~T#k2WWjgCfQ7k(kcTvc~|!hsm&Jv>vD zT+KyZurYJQWl=fYC*XA~&~t;|p}wIu>Zh@ts0jP)N*kG%u=Am;m3Glj0X{6S+{?Lk z0xj6x7Yq*xk;5v4AcY$AlLR=enVYHU_)zbEAn8{ zs18?~9T_dd(v-^IsqPb(b^kM^Fl_h1Q)P7Nig#LkfGCmH9N804L_YnqGNg@=ssKM; zN=O8xn7O+0B2MYCh+JJKk)Yjwhs2<)XHL_X{^@w{U&lg^8P3O!ahO~%LNj4b>vChm3s=DaP;K*ff99stUp z0)LP`Os2oFn^Mzj<|wla?tmu1QON{1Iamb_nxY*T4OmZ448WHI%A0>h1t)^9tih}p zig*XKi-KSmmPO?f=v*Cevg&}qhm>T4Q<_hhz=+6A32gEAFWREa|C?A_2x91R?16{rf|q(XU@ISq!_0;hwa2*t6v`L(<$yLGkQ&`M%Fi z44wxQB5(-mfR!u>oJUE(a3yKhyCdJv!U~1oKb9+D;ZJ5{K;>qgZXF&DpR-^#Y~oUYT^Se%A80+RWB;{{5~aF^g>0jsJ#@c3cNpY`5~Kq_VK&ZT3Jb*W zI#@LgU)hC$#BXbNS8k#OUw7h4y296U(z z`%rdbcFh>o%H$^!U>)tC{lh5Ft4`BESyPQl2q|jKk2TEhlR!h%feqXr$U*UVk&U^1 z=pDbnaboN8uk_XrI%*|!`Ud=O$E*?gCxk9S?6qxO@ zNNX3+&V7^^`Ow2pQgMc>VMPZdbndA%MvNDzr!#V8S*e2Y`3tPGtF%^WFIpc}P>qgT5mnk!(azKzElXYJEUVoRewJ7f3FSW&@@6 zhu$T47n_19MH&G&v+-$?f6CCPtx9tbe8AdlrUvZz0eIS1vQ^WqXhlT&I{ysUcL_xV7q9|@#f8&m}IV7AJ)!cO3zvmz5AV5 z5H=1~c@HOSz4QXVefx$iu)c(agv3q+`PxZb7Xwrk7Ul-iEfA&tj}@}QK%fr4UeUZc z17NQan8)23#H91P&e~=NzN2{hRCdS`KFkGiJ8T1QPuNaaUl;L+9g24DQT%Q4Mtn_I z?LKP_uv3g;xC017mfMPoKu*-z`tuXnT?^R()PxOx;J2=3`!IdmH&yjlcVC1jY|4Nv zguDUpF|Wb>@pqC0RfMe7IH=;sl)!J;$NNRslMb|b*7**I=sZS3*^uMW0YLzD6PC(g z9|E_Wo~l=!55mn%zvmikRy}YzXU=|i@f4QNRb+FJ-8sOe*a(AMMCN{!Xfhtrs2g#2 z{@O!o>3D|KL-2%WJDPz&E?)y5TT!%w^e*#h()@ZpAZ?qKx(UT`Q$EB(`Nf8_!GlD~ zI=;`xc>?P<7eepZGe89qk?KLV##?-xx@1hc=*t11$(=^P!gW##Q^4>}8M6Ji&(#&j zGn`ar7T1D8OcQa{jEqc$-cqjG-uxet=I{tS#5#a|kgYWMY@pUHV$cMHfdy(5XR3V! zJ%|SRteI5|DEo3`W+WZsl-<cT+QKhOhhsrVzhVONZPpY5f``lL&M{QfcL z9|tULtRqkLvWeTu&yB)4UcQmb!g-z>R-(vQ_QhN_NzzEt$XO^;G*nSy{iRxN#KWH% zU(z_V#NKO(<|L|q%-FvwJ{&$<ovzt!DuI*9G?NOXdC@3hfyPT_zErEc+2v$<#BB1K^0O7Vl zh59z>K5kwfXEO;Fgiz?GkLph+H^EXeEoBc`nf{r0e&^2iSUSHd#`vRIY*LEOcbw&3%pxjf(WP@60dU7xHjADkLm1|Blz zY@SBI_z-;k9ZOZ+9mCG#VRcITjBsZDB>jji0ku_2RV;y&-$>OPU6A1aljy=Q}G zLRLk9#zk2rm9Q)PR|tP`HS{3og~$-cNpDLs!D%n!x~*ERk(-g*--urimqc&deYJ&R zBML}A6biE5&V6{Ku2nU;7~ev5!2=?yudn}VoDa^Y-`lDT?jzWBRc+eD0kaU^`}IpTfo;C@80}K(*gv=m}_2-+lH;mrUy)Wq1W%=z5AP?53yms z8-{C)FS6dWTu;m`WQbuCNXWhtwl1*KO8I~T^ zv0kl$)=5QBnaXk;BFGF?P>v}HRUn91QAVPuERktjsR3CkG6Y1x5Fru@G9yT@m0>_Y zK#+X~6bP$~uw>lx?Y*vl!~JmngqW9nzn{;0zn|x!aiqW{rxJQb4ofqOLol%Tz~!mb zljNzyhGfs6fZGRFnp2lsgj!PuH9I!HzW#D56^e+Ve19P>5nB^x~sB(^%Yf9-j~ z_>lKtV?UbWI@NJSogRH@eZQ+oo%L-iA>85Lqgrh%Y32|3vaWJ!KOe2%YAB5|ropd* zu<}5mO)9;xp`}&k{p8!`T9b|YBBk;a4EV>S`y;G#eH5+8n&az0Y4g2Z9M2(Fg(=^n z361;n$-=sqmd1(_5)!YmuhiJxbji}(#MS|F5HHwv4L(;6wfUSSw~4oxZ4`Hp(TF!( z2_@GgM$evOQ0V1@=N!4_Q?`;v%*EhhE zMt!y0PnHa^v(w|Vm^D^Dusyp2WQ#i8m94wcIL?i@8cL(|6aJwk_D@2s29@hItW^r< z{V`G4q94|?!FKd{1l|7rq-wCG;en1 zTBQWV$*Fg&$jd&u9Bb%n?HA)K9j|vwpu}^VUByBmH2ZgDTlt(^}ZJlN&W4V<2C8u{TP)pm%I-IhNK9O;o4TvpGC zOwaCWwXxExioWdT#xz`>h*rlyXKt?Aa5uuizf_8` zBoTpq_VXNKcDqo^)3J8@`II(FXsh#^6KS*RUZw|iXLHjEx3V5{L^`50@y{YtbM@(T zQJN^N;X66*Ni$ZQs`;V0(LAL7l9>+1)ZLTuUYH41VX>Ix=wxrdWBXaZ@0&kjPhE*l zY!?dP;0Q@|dHnF7p62945-)ca&!E9i!%?bZLj&Ib1!C|k93Jk=Deei+&d$aM4KgmL za?xdD6tEd>Ulcm^I+W6+yUNTddVNZiT7fz zB!QGAUhXNEOYR$x^D6H0G}nh~TgD%JF_MpRE+~A*#qqBU=Zjc(;8JU@T@wNhli!ewJ z3|L%OQ&m+ZbRg6r|3=Jq%a&$3DW^_Jz)M}rMx)@;CTFg9`&b%QUEi z4wt721^@`l5llcxE8)(BI_5-t#UiWOFqPL7koKO=Axf<#v?JK)(?HnS1Hh})$B!Q| zFpR?;M+t?(x!H=9?zBux?r0aWcQl-f_|cG`dxh30X_lvGGtb@F zNv$hvd0l!x3O9cM0WZ#1%6yLjQZ>18;|AiU0-eEdZqL8Se&)mBa0nxPQv@M~ zX+PlBI)ez$p6p&-8_#XZK;~nq$OJ_k%Vve=kcF@jd{}{tot>m69ej}QumL%)Xu1Xc z?q$M3>;SL@_hcouI%H|sDH_MA4S@|vLF1CIz1|c53SgyyUlIPZeWG^eKt!>*h z&2V8bBWob`a)CEpRN%G6bvHZp&{*2--DU>tGso@i+f~@x_Qf?{NL|Z5ebOnf-1XKV z|E&aFO)h+YczK*BT{JCGoApjlYL`wSZ3_m>rngEQVURM@9)%WEJ`XyaXzK=oN#c$%GUCZ{m@J-lxM`6F{^ z5-#if>&;avE`O^=*Et(o%TD#kR!h|Ja%tY|No?8S<=6Q;Ry9)SYBh$1+eq!!xfD0T zZ3#yQ3eCm)$%V&L56ljBbgX;K$Se9`QI$o@4(M2Ct-Cv5Brn-xCGtoQvv+x>SSKjz z4A3a9T|RBlNGn3x)pxz`(6joD!5_b_RtMlhd%SEay{t?hY23#9^S5n>Km$RP?*d@-IWZs7~B~=+UgaMAEjwqa7q3jfzK`8Sj;WzgX&RP&Q??+$r+? zV$lEDW!Vt3>^OdZNs3iY&%{-_Xho(JwAE(VyCQ;=c`(WjB_ypYR0oGn!E#Gmn-XCZ z22SHYbXCW{oMvSP`Jv>vKRG$s;>AA<0~oF(k{q9*i$WUTI%V-lztr8(5MlmFdb+$Q zIe){SSGtSm#H2FMb8~JfXAX)L#=>YCvfhO%zp>6;CwGgfoO0IN)=p2S(0?JB=E(eQ zJwsZ~Q^qkZj{m7e7*%81Lj+l!?qxLfUc9AxDzZTZT9D52UJ!BwK%d;GQ4T5lidF=) zI>7z*T~~kK0FAR>=Ekm9NJDfzq{E%^1(sYy1f@7QNMk4%aV4-%TK!5-S!U-Ek1k2n zWoGKXck$2|K3raUp1QOT5rJB_=4O3*(T|JP=D2vF=FKJ>ez_Y%=_a?fV~uBSKRwH$ z%HWPj`FiN4s2UZkXdvl|KWh|YCV!#v@zJaS)yeIcDyB2~dtj8a0F{21}U_MLa1JCMF~ozRNCNFx0$ zl=vM1;0F^Cw4hlw8Ws3v3~>UCjhl;oWSs!)=pNxgI;9%wVKy~;4TI6Mm_WAZu$ETU z?9175w@a5S^!AW+?{QS+1gfPTQC3Hxbsc!Gf9S; z@*28IO&11I1Q{8RgC Date: Mon, 27 Oct 2025 12:17:51 +1000 Subject: [PATCH 14/15] updated readme --- recognition/Hip_MRI_VQVAE_PixelCNN/readme.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/recognition/Hip_MRI_VQVAE_PixelCNN/readme.md b/recognition/Hip_MRI_VQVAE_PixelCNN/readme.md index 2356c4ddaf..d42e1754c9 100644 --- a/recognition/Hip_MRI_VQVAE_PixelCNN/readme.md +++ b/recognition/Hip_MRI_VQVAE_PixelCNN/readme.md @@ -2,7 +2,11 @@ This completes problem 10 of the COMP3710 (Pattern Recognition) assignment 2025. -In vq-vae.py, there is the implementation in tf/keras of a vector quantised variational autoencoder. This uses a default architecture and takes only as hyperparameters the latent dimension (of embeddings) and the number of embeddings (ie codebook size) +All requirements for this project are listed in requirements.txt + +#### VQ-VAE + +In vq-vae.py, there is the implementation in tf/keras of a vector quantised variational autoencoder. Calling this implementation uses a default architecture designed by me and takes only as hyperparameters the latent dimension (of embeddings) and the number of embeddings (ie codebook size) ![model architecture](plots/model_architecture.png) @@ -18,7 +22,9 @@ The end result are the following reconstructions: This was tested in ssim-evalution.py and it scored 0.78039 structured similarity across the test set. -This is with 3 halvings in spacial dimension and a latent dimension of 3 corresponding to roughly 21x compression in latent representation. +This is with 3 halvings in spacial dimension and a latent dimension of 3 corresponding to roughly 21x compression in latent representation (128x256 in image space and 16x32x3 in latent). + +#### PixelCNN Then, in pixel-cnn-generator.py a pixelcnn model was trained on the latent distribution. Attempting to conditionally predict latent vector indices. @@ -33,7 +39,7 @@ then this model can be used in the generate_images function to sample this learn First the examples were very rough ![rough](plots/Novel_Generated_Outputs_working.jpg) -But then by adding one-hot encoding to input, adjusting the temperature of sampling and tweaking the model architecture, they could be improved to the following +But then by adding one-hot encoding to input, adjusting the temperature of sampling and tweaking the model architecture (to that described above), they could be improved to the following ![better](plots/Novel_Generated_Outputs_3_better.jpg) From fee9a147bba3a2a86b53f76e00f61ad9545250c5 Mon Sep 17 00:00:00 2001 From: blake Date: Mon, 27 Oct 2025 12:45:37 +1000 Subject: [PATCH 15/15] renamed folder to include student ID --- .../Hip_MRI_VQVAE_PixelCNN_48036177/.Rhistory | 0 .../.gitignore | 0 .../pixel-cnn-generator.py | 0 .../plots/Novel_Generated_Outputs_3_better.jpg | Bin .../plots/Novel_Generated_Outputs_working.jpg | Bin .../plots/loss.png | Bin .../plots/model_architecture.png | Bin .../plots/reconstruction.jpg | Bin .../plots/reconstruction_good.jpg | Bin .../readme.md | 0 .../requirements.txt | 0 .../ssim-evaluation.py | 0 .../vq-vae.py | 0 13 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 recognition/Hip_MRI_VQVAE_PixelCNN_48036177/.Rhistory rename recognition/{Hip_MRI_VQVAE_PixelCNN => Hip_MRI_VQVAE_PixelCNN_48036177}/.gitignore (100%) rename recognition/{Hip_MRI_VQVAE_PixelCNN => Hip_MRI_VQVAE_PixelCNN_48036177}/pixel-cnn-generator.py (100%) rename recognition/{Hip_MRI_VQVAE_PixelCNN => Hip_MRI_VQVAE_PixelCNN_48036177}/plots/Novel_Generated_Outputs_3_better.jpg (100%) rename recognition/{Hip_MRI_VQVAE_PixelCNN => Hip_MRI_VQVAE_PixelCNN_48036177}/plots/Novel_Generated_Outputs_working.jpg (100%) rename recognition/{Hip_MRI_VQVAE_PixelCNN => Hip_MRI_VQVAE_PixelCNN_48036177}/plots/loss.png (100%) rename recognition/{Hip_MRI_VQVAE_PixelCNN => Hip_MRI_VQVAE_PixelCNN_48036177}/plots/model_architecture.png (100%) rename recognition/{Hip_MRI_VQVAE_PixelCNN => Hip_MRI_VQVAE_PixelCNN_48036177}/plots/reconstruction.jpg (100%) rename recognition/{Hip_MRI_VQVAE_PixelCNN => Hip_MRI_VQVAE_PixelCNN_48036177}/plots/reconstruction_good.jpg (100%) rename recognition/{Hip_MRI_VQVAE_PixelCNN => Hip_MRI_VQVAE_PixelCNN_48036177}/readme.md (100%) rename recognition/{Hip_MRI_VQVAE_PixelCNN => Hip_MRI_VQVAE_PixelCNN_48036177}/requirements.txt (100%) rename recognition/{Hip_MRI_VQVAE_PixelCNN => Hip_MRI_VQVAE_PixelCNN_48036177}/ssim-evaluation.py (100%) rename recognition/{Hip_MRI_VQVAE_PixelCNN => Hip_MRI_VQVAE_PixelCNN_48036177}/vq-vae.py (100%) diff --git a/recognition/Hip_MRI_VQVAE_PixelCNN_48036177/.Rhistory b/recognition/Hip_MRI_VQVAE_PixelCNN_48036177/.Rhistory new file mode 100644 index 0000000000..e69de29bb2 diff --git a/recognition/Hip_MRI_VQVAE_PixelCNN/.gitignore b/recognition/Hip_MRI_VQVAE_PixelCNN_48036177/.gitignore similarity index 100% rename from recognition/Hip_MRI_VQVAE_PixelCNN/.gitignore rename to recognition/Hip_MRI_VQVAE_PixelCNN_48036177/.gitignore diff --git a/recognition/Hip_MRI_VQVAE_PixelCNN/pixel-cnn-generator.py b/recognition/Hip_MRI_VQVAE_PixelCNN_48036177/pixel-cnn-generator.py similarity index 100% rename from recognition/Hip_MRI_VQVAE_PixelCNN/pixel-cnn-generator.py rename to recognition/Hip_MRI_VQVAE_PixelCNN_48036177/pixel-cnn-generator.py diff --git a/recognition/Hip_MRI_VQVAE_PixelCNN/plots/Novel_Generated_Outputs_3_better.jpg b/recognition/Hip_MRI_VQVAE_PixelCNN_48036177/plots/Novel_Generated_Outputs_3_better.jpg similarity index 100% rename from recognition/Hip_MRI_VQVAE_PixelCNN/plots/Novel_Generated_Outputs_3_better.jpg rename to recognition/Hip_MRI_VQVAE_PixelCNN_48036177/plots/Novel_Generated_Outputs_3_better.jpg diff --git a/recognition/Hip_MRI_VQVAE_PixelCNN/plots/Novel_Generated_Outputs_working.jpg b/recognition/Hip_MRI_VQVAE_PixelCNN_48036177/plots/Novel_Generated_Outputs_working.jpg similarity index 100% rename from recognition/Hip_MRI_VQVAE_PixelCNN/plots/Novel_Generated_Outputs_working.jpg rename to recognition/Hip_MRI_VQVAE_PixelCNN_48036177/plots/Novel_Generated_Outputs_working.jpg diff --git a/recognition/Hip_MRI_VQVAE_PixelCNN/plots/loss.png b/recognition/Hip_MRI_VQVAE_PixelCNN_48036177/plots/loss.png similarity index 100% rename from recognition/Hip_MRI_VQVAE_PixelCNN/plots/loss.png rename to recognition/Hip_MRI_VQVAE_PixelCNN_48036177/plots/loss.png diff --git a/recognition/Hip_MRI_VQVAE_PixelCNN/plots/model_architecture.png b/recognition/Hip_MRI_VQVAE_PixelCNN_48036177/plots/model_architecture.png similarity index 100% rename from recognition/Hip_MRI_VQVAE_PixelCNN/plots/model_architecture.png rename to recognition/Hip_MRI_VQVAE_PixelCNN_48036177/plots/model_architecture.png diff --git a/recognition/Hip_MRI_VQVAE_PixelCNN/plots/reconstruction.jpg b/recognition/Hip_MRI_VQVAE_PixelCNN_48036177/plots/reconstruction.jpg similarity index 100% rename from recognition/Hip_MRI_VQVAE_PixelCNN/plots/reconstruction.jpg rename to recognition/Hip_MRI_VQVAE_PixelCNN_48036177/plots/reconstruction.jpg diff --git a/recognition/Hip_MRI_VQVAE_PixelCNN/plots/reconstruction_good.jpg b/recognition/Hip_MRI_VQVAE_PixelCNN_48036177/plots/reconstruction_good.jpg similarity index 100% rename from recognition/Hip_MRI_VQVAE_PixelCNN/plots/reconstruction_good.jpg rename to recognition/Hip_MRI_VQVAE_PixelCNN_48036177/plots/reconstruction_good.jpg diff --git a/recognition/Hip_MRI_VQVAE_PixelCNN/readme.md b/recognition/Hip_MRI_VQVAE_PixelCNN_48036177/readme.md similarity index 100% rename from recognition/Hip_MRI_VQVAE_PixelCNN/readme.md rename to recognition/Hip_MRI_VQVAE_PixelCNN_48036177/readme.md diff --git a/recognition/Hip_MRI_VQVAE_PixelCNN/requirements.txt b/recognition/Hip_MRI_VQVAE_PixelCNN_48036177/requirements.txt similarity index 100% rename from recognition/Hip_MRI_VQVAE_PixelCNN/requirements.txt rename to recognition/Hip_MRI_VQVAE_PixelCNN_48036177/requirements.txt diff --git a/recognition/Hip_MRI_VQVAE_PixelCNN/ssim-evaluation.py b/recognition/Hip_MRI_VQVAE_PixelCNN_48036177/ssim-evaluation.py similarity index 100% rename from recognition/Hip_MRI_VQVAE_PixelCNN/ssim-evaluation.py rename to recognition/Hip_MRI_VQVAE_PixelCNN_48036177/ssim-evaluation.py diff --git a/recognition/Hip_MRI_VQVAE_PixelCNN/vq-vae.py b/recognition/Hip_MRI_VQVAE_PixelCNN_48036177/vq-vae.py similarity index 100% rename from recognition/Hip_MRI_VQVAE_PixelCNN/vq-vae.py rename to recognition/Hip_MRI_VQVAE_PixelCNN_48036177/vq-vae.py