I am trying to do some sample code of GAN
, here comes the generator.
I want to see the visualized model but, this is not the model.
Model.summary()
is not the function of tensorflow but it is keras?? if so how can I see visualized model??
g_model = generator(input_z, output_channel_dim)
g_model.summary() // AttributeError: 'Tensor' object has no attribute 'summary'
My function is here.
def generator(z, output_channel_dim, is_train=True):
with tf.variable_scope("generator", reuse= not is_train):
# First FC layer --> 8x8x1024
fc1 = tf.layers.dense(z, 8*8*1024)
# Reshape it
fc1 = tf.reshape(fc1, (-1, 8, 8, 1024))
# Leaky ReLU
fc1 = tf.nn.leaky_relu(fc1, alpha=alpha)
# Transposed conv 1 --> BatchNorm --> LeakyReLU
# 8x8x1024 --> 16x16x512
trans_conv1 = tf.layers.conv2d_transpose(inputs = fc1,
filters = 512,
kernel_size = [5,5],
strides = [2,2],
padding = "SAME",
kernel_initializer=tf.truncated_normal_initializer(stddev=0.02),
name="trans_conv1")
batch_trans_conv1 = tf.layers.batch_normalization(inputs = trans_conv1, training=is_train, epsilon=1e-5, name="batch_trans_conv1")
trans_conv1_out = tf.nn.leaky_relu(batch_trans_conv1, alpha=alpha, name="trans_conv1_out")
# Transposed conv 2 --> BatchNorm --> LeakyReLU
# 16x16x512 --> 32x32x256
trans_conv2 = tf.layers.conv2d_transpose(inputs = trans_conv1_out,
filters = 256,
kernel_size = [5,5],
strides = [2,2],
padding = "SAME",
kernel_initializer=tf.truncated_normal_initializer(stddev=0.02),
name="trans_conv2")
batch_trans_conv2 = tf.layers.batch_normalization(inputs = trans_conv2, training=is_train, epsilon=1e-5, name="batch_trans_conv2")
trans_conv2_out = tf.nn.leaky_relu(batch_trans_conv2, alpha=alpha, name="trans_conv2_out")
# Transposed conv 3 --> BatchNorm --> LeakyReLU
# 32x32x256 --> 64x64x128
trans_conv3 = tf.layers.conv2d_transpose(inputs = trans_conv2_out,
filters = 128,
kernel_size = [5,5],
strides = [2,2],
padding = "SAME",
kernel_initializer=tf.truncated_normal_initializer(stddev=0.02),
name="trans_conv3")
batch_trans_conv3 = tf.layers.batch_normalization(inputs = trans_conv3, training=is_train, epsilon=1e-5, name="batch_trans_conv3")
trans_conv3_out = tf.nn.leaky_relu(batch_trans_conv3, alpha=alpha, name="trans_conv3_out")
# Transposed conv 4 --> BatchNorm --> LeakyReLU
# 64x64x128 --> 128x128x64
trans_conv4 = tf.layers.conv2d_transpose(inputs = trans_conv3_out,
filters = 64,
kernel_size = [5,5],
strides = [2,2],
padding = "SAME",
kernel_initializer=tf.truncated_normal_initializer(stddev=0.02),
name="trans_conv4")
batch_trans_conv4 = tf.layers.batch_normalization(inputs = trans_conv4, training=is_train, epsilon=1e-5, name="batch_trans_conv4")
trans_conv4_out = tf.nn.leaky_relu(batch_trans_conv4, alpha=alpha, name="trans_conv4_out")
# Transposed conv 5 --> tanh
# 128x128x64 --> 128x128x3
logits = tf.layers.conv2d_transpose(inputs = trans_conv4_out,
filters = 3,
kernel_size = [5,5],
strides = [1,1],
padding = "SAME",
kernel_initializer=tf.truncated_normal_initializer(stddev=0.02),
name="logits")
out = tf.tanh(logits, name="out")
return out
Advertisement
Answer
One possible solution (or an idea) is to wrap your tensorflow operation into the Lambda layer and use it to build the keras model. Something like
# add a x -> x^2 layer
model.add(Lambda(lambda x: x ** 2))
But it’s not the general solution (AFAIK), and also while it is possible to use Variables with Lambda layers, this practice is discouraged as it can easily lead to bugs. And that exactly what we’ve encountered when trying to wrap your generator
function into the Lambda layer. Here what we’ve tried and received:
import tensorflow as tf
tf.__version__ # 2.5
def generator(z, output_channel_dim=10, is_train=True, alpha = 0.1):
with tf.compat.v1.variable_scope("generator", reuse=tf.compat.v1.AUTO_REUSE):
# First FC layer --> 8x8x1024
fc1 = tf.compat.v1.layers.dense(z, 8*8*1024)
from tensorflow import keras
from tensorflow.keras.layers import Lambda
generator(tf.ones((1, 8, 8, 1)), is_train=True).shape
TensorShape([64, 128, 128, 3])
Wrapping to the Lambda layer
For that, we received such a warning, a potential bug.
x = keras.Input(shape=(8, 8, 1))
y = Lambda(generator)(x)
WARNING:tensorflow:
The following Variables were used a Lambda layer's call (lambda_1), but
are not present in its tracked objects:
<tf.Variable 'generator/dense/kernel:0' shape=(1, 65536) dtype=float32>
<tf.Variable 'generator/dense/bias:0' shape=(65536,) dtype=float32>
<tf.Variable 'generator/trans_conv1/kernel:0' shape=(5, 5, 512, 1024) dtype=float32>
<tf.Variable 'generator/trans_conv1/bias:0' shape=(512,) dtype=float32>
..
..
from tensorflow.keras import Model
model = Model(inputs=x, outputs=y)
model.summary()
Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_3 (InputLayer) [(None, 8, 8, 1)] 0
_________________________________________________________________
lambda_2 (Lambda) (None, 128, 128, 3) 0
=================================================================
Total params: 0
Trainable params: 0
Non-trainable params: 0
_________________________________________________________________
tf.Variables
are not present in the tracked objects.