Я хотел бы найти похожее изображение с помощью генератора PGGAN для реального входного изображения, основанного на обучении Encoder-Generator.Ниже моя реализация:
# load pre-trained generator
sess = tf.InteractiveSession()
with open('network-snapshot-final.pkl', 'rb') as file:
G, D, Gs = pickle.load(file)
# network parameters
image_size = 1024
input_shape = (image_size, image_size, 1)
batch_size = 8
kernel_size = 3
filters = 16
latent_dim = 512
epochs = 100
# build an encoder
inputs = Input(shape=input_shape, name='encoder_input')
x = inputs
for i in range(10):
filters *= 2
x = Conv2D(filters=filters,
kernel_size=kernel_size,
activation='relu',
strides=2,
padding='same')(x)
# generate latent vector
x = Flatten()(x)
x = Dense(2048, activation='relu')(x)
z_sim = Dense(latent_dim, name='z_sim')(x)
encoder = Model(inputs, z_sim, name='encoder')
# define a custom loss function
def loss_enc(x, z_sim):
im_g = tf.convert_to_tensor(Gs.run(z_sim.eval(), labels))
im_g2 = tf.reshape(im_g, [-1, 1024, 1024, 1])
los = mse(K.flatten(x), K.flatten(im_g2))
return los
После компиляции модели я столкнулся с сообщениями об ошибках следующим образом:
encoder.compile(optimizer='rmsprop', loss=loss_enc)
InvalidArgumentError: Вы должны передать значение для тензора-заполнителя 'encoder_input_19'с плавающей точкой dtype и формой [?, 1024,1024,1] [[{{node encoder_input_19}} = Placeholderdtype = DT_FLOAT, shape = [?, 1024,1024,1], _device = "/ job: localhost / replica:0 / задача: 0 / устройство: GPU: 0 "]] [[{{node z_sim_12 / BiasAdd / _713}} = _Recvclient_terminated = false, recv_device =" / job: localhost / replica: 0 / task: 0 / device: CPU: 0 ", send_device =" / job: localhost / replica: 0 / task: 0 / device: GPU: 0 ", send_device_incarnation = 1, тензор_имя =" edge_127_z_sim_12 / BiasAdd ",ensor_type = DT_FLOAT, _device =" / job: localhost/ replica: 0 / task: 0 / device: CPU: 0 "]]
Как правильно реализовать функцию потерь для этой цели?