Reputation: 5444
In a generator model of GANs, I am trying to generate image of a specific size. My target size is 28x280x3
. I actually, so far I was creating a generator output of 28x28x3
. Therefore, I am trying by using UpSampling2D
to increase the size of the model. I am able to make the model output of size 28x224x3
after three UpSampling2D layers. However, my target is 28x280x3
. How can I gap that divergence dimensions? I noticed that there is this approach that targets at resizing layers. How can it work in my case? My code is looking like the following:
def build_generator_face(latent_dim, channels, face_sequence):
model = Sequential()
model.add(Dense(128 * 7 * 7, activation="relu", input_shape=(None, latent_dim)))
model.add(Reshape((7, 7, 128)))
model.add(UpSampling2D())
model.add(Conv2D(128, kernel_size=4, padding="same"))
model.add(BatchNormalization(momentum=0.8))
model.add(Activation("relu"))
model.add(UpSampling2D())
model.add(Conv2D(64, kernel_size=4, padding="same"))
model.add(BatchNormalization(momentum=0.8))
model.add(Activation("relu"))
if face_sequence == False:
#model.add(UpSampling2D(size=(2, 2)))
model.add(Conv2D(64, kernel_size=4, padding="same"))
model.add(BatchNormalization(momentum=0.8))
model.add(Activation("relu"))
#model.add(UpSampling2D(size=(2, 2)))
model.add(Conv2D(64, kernel_size=4, padding="same"))
model.add(BatchNormalization(momentum=0.8))
model.add(Activation("relu"))
else:
model.add(UpSampling2D(size=(1, 2)))
model.add(Conv2D(64, kernel_size=4, padding="same"))
model.add(BatchNormalization(momentum=0.8))
model.add(Activation("relu"))
model.add(UpSampling2D(size=(1, 2)))
model.add(Conv2D(64, kernel_size=4, padding="same"))
model.add(BatchNormalization(momentum=0.8))
model.add(Activation("relu"))
model.add(UpSampling2D(size=(1, 2)))
model.add(Conv2D(64, kernel_size=4, padding="same"))
model.add(BatchNormalization(momentum=0.8))
model.add(Activation("relu"))
pdb.set_trace()
model.add(Reshape((-1,3), input_shape=(28,224,3)))
model.add(Lambda(lambda x: x[:7840])) # throw away some, so that #data = 224^2
model.add(Reshape(28,280,3)) # this line gives me an error but am not sure if it is necessary or not the code is found in here: https://stackoverflow.com/questions/41903928/add-a-resizing-layer-to-a-keras-sequential-model
model.add(Conv2D(channels, kernel_size=4, padding="same"))
model.add(Activation("tanh"))
model.summary()
noise = Input(shape=(latent_dim,))
img = model(noise)
mdl = Model(noise, output = img)
return mdl
If face_sequence is False
the model is generating an output of 28x28x3
. I want when the boolean variable is True
to generate an output of size 28x280x3
. How this can be done?
Upvotes: 0
Views: 565
Reputation: 448
You were using only the first channel with 7840 and then trying to reshape into the wanted shape. For that you would need 23520 elements (28*280*3), but you only had 18816 (28*224*3).
This code resizes earlier in the process and uses one more UpSampling->Conv2D resulting in the wanted shape.
def build_generator_face(latent_dim, channels, face_sequence):
model = Sequential()
model.add(Dense(128 * 7 * 7, activation="relu", input_shape=(None, latent_dim)))
model.add(Reshape((7, 7, 128)))
model.add(UpSampling2D())
model.add(Conv2D(128, kernel_size=4, padding="same"))
model.add(BatchNormalization(momentum=0.8))
model.add(Activation("relu"))
model.add(UpSampling2D())
model.add(Conv2D(64, kernel_size=4, padding="same"))
model.add(BatchNormalization(momentum=0.8))
model.add(Activation("relu"))
if face_sequence == False:
model.add(Conv2D(64, kernel_size=4, padding="same"))
model.add(BatchNormalization(momentum=0.8))
model.add(Activation("relu"))
model.add(Conv2D(64, kernel_size=4, padding="same"))
model.add(BatchNormalization(momentum=0.8))
model.add(Activation("relu"))
else:
model.add(UpSampling2D(size=(1, 2)))
model.add(Conv2D(64, kernel_size=4, padding="same"))
model.add(BatchNormalization(momentum=0.8))
model.add(Activation("relu"))
# go from 56 to 35 and continue upsampling
model.add(Lambda(lambda x: x[:,:,:35,:]))
model.add(UpSampling2D(size=(1, 2)))
model.add(Conv2D(64, kernel_size=4, padding="same"))
model.add(BatchNormalization(momentum=0.8))
model.add(Activation("relu"))
model.add(UpSampling2D(size=(1, 2)))
model.add(Conv2D(64, kernel_size=4, padding="same"))
model.add(BatchNormalization(momentum=0.8))
model.add(Activation("relu"))
model.add(UpSampling2D(size=(1, 2)))
model.add(Conv2D(64, kernel_size=4, padding="same"))
model.add(BatchNormalization(momentum=0.8))
model.add(Activation("relu"))
pdb.set_trace()
model.add(Conv2D(channels, kernel_size=4, padding="same"))
model.add(Activation("tanh"))
model.summary()
return model
Upvotes: 2