This is based on: tensorflow-mnist-vae/mnist_vae.ipynb at master · CharlesD1ng/tensorflow-mnist-vae · GitHub
In my model.py, I have:
class model():
  def __init__(self):
    self.X = tf.placeholder(dtype=tf.float32, shape=[None, 28, 28], name='X')
    self.keep_prob = tf.placeholder(dtype=tf.float32, shape=(), name='keep_prob')

  def encoder(self): #I'm using self.X here to find z
    ...
    return self.X, self.keep_prob, z, mn, sd

  def decoder(self, z): #I'm using z (generated in encoder) to find image
    ...
    return image

  def loss(self, image, sd, mn):#I'm using image generated by decoder and the original image self.X
    ...
    return loss

  def optimizer(self, loss, lr): #Call optimizer by using loss and learning rate.
    ...
    return optimizer

In my training.py, I want to train the model that I defined in model.py. Therefore I have:
mnist = input_data.read_data_sets('MNIST_data')
lr = 0.005

model = model()
X, keep_prob, z, mn, sd = model.encoder()
decoder = model.decoder(z)
loss = model.loss(decoder, sd, mn)
optimizer = model.optimizer(loss, lr)

sess = tf.Session()
sess.run(tf.global_variables_initializer())

for epoch in range(epoch_number):
    batch = [np.reshape(b, [28, 28]) for b in mnist.train.next_batch(batch_size=batch_size)[0]]
    loss_, _ = sess.run([loss, train_optimizer], feed_dict={X: batch, keep_prob: 0.8})

    print("iteration: {}, overall_loss: {}".format(epoch, loss_))

Actually my question is related to that point:
model = model()
X, keep_prob, z, mn, sd = model.encoder()
decoder = model.decoder(z)
loss = model.loss(decoder, sd, mn)
optimizer = model.optimizer(loss, lr)

I’m new on tensorflow and not sure if it is the right way to train a model in tensorflow 1. I saw something scope, variable, get_collection things and a little bit confused. Is it the right way of training a model? Because, if it is the case. After saving my model, to generate new images using this decoder that I trained, I have some difficulties. In a similar way, to test my model that I saved, in test.py, I do:
model = model()
X, keep_prob, z, mn, sd = model.encoder()
decoder = model.decoder(z)

saver = tf.train.Saver()
sess = tf.Session()

saver.restore(sess, 'model.pk')

randoms = [np.random.normal(0, 1, intermediate_dim) for _ in range(100)]
images = sess.run(dec, feed_dict = {z: randoms, keep_prob: 1.0})
k = [np.reshape(imgs[i], [28, 28]) for i in range(len(images ))]

In this writing style, to use decoder I need to call encoder. If I do not call it, it will not know the variable z. See:
X, keep_prob, z, mn, sd = model.encoder()
decoder = model.decoder(z)

Do you have any idea about what is the right way to use different .py files while training a deep learning network using tensorflow 1.
Thank you in advance.