使用预训练vgg19 tensorflow,Keras在CNN自动编码器中定义自定义损失(感知损失)

阿里什

我想在构建于keras的自动编码器中定义perceptual_loss。我的自动编码器看起来像这样:

编码器:

input_encoder = Input((32,32,3),name = 'encoder_input')
encoder = Conv2D(16,(3,3),activation = 'relu',name = 'encoder_layer1')(input_encoder)
encoder = Flatten(name = 'encoder_layer2')(encoder)
latent_encoding = Dense(128 , activation = 'relu', name = 'encoder_layer3')(encoder)

Encoder = Model(inputs= [input_encoder], outputs=[latent_encoding],name = 'Encoder')

解码器:

input_decoder = Input(128,name = 'decoder_input')
decoder = Reshape((1, 1, 128),name = 'decoder_layer1')(input_decoder)
decoder = Conv2DTranspose(64, (2,2), activation='relu' , name = 'decoder_layer2')(decoder)
decoder = UpSampling2D(8 ,name = 'decoder_layer3')(decoder)
decoder = Conv2DTranspose(3, (9,9), activation='relu' , name = 'decoder_layer2')(decoder)

Decoder = Model(inputs= [input_decoder], outputs=[decoder ],name = 'Decoder')

自动编码器:

input = Input((32,32,3),name = 'input')
latent = Encoder(input)
output = Decoder(latent)
AE = Model(inputs= [input], outputs=[output ],name = 'AE')

现在我用预训练vgg19定义新的损失函数perceptual_loss像这样,我获取输入图像并重建图像以对vgg19进行预训练并从vgg19的某层获取结果,然后我将两个向量的相减作为vgg19中该层的误差,然后我使用图层误差的加权总和来计算总误差:

selected_layers = ['block1_conv1', 'block2_conv2',"block3_conv3" ,'block4_conv3','block5_conv4']
selected_layer_weights = [1.0, 4.0 , 4.0 , 8.0 , 16.0]

def perceptual_loss(input_image , reconstruct_image):
    vgg = VGG19(weights='imagenet', include_top=False, input_shape=(32,32,3))
    vgg.trainable = False

    outputs = [vgg.get_layer(l).output for l in selected_layers]
    model = Model(vgg.input, outputs)

    h1_list = model(input_image)
    h2_list = model(reconstruct_image)

    rc_loss = 0.0

    for h1, h2, weight in zip(h1_list, h2_list, selected_layer_weights):
        h1 = K.batch_flatten(h1)
        h2 = K.batch_flatten(h2)
        rc_loss = rc_loss + weight * K.sum(K.square(h1 - h2), axis=-1)

    return rc_loss

然后我编译AE:

rmsprop = RMSprop(learning_rate=0.00025)
AE.compile(loss= perceptual_loss, optimizer= rmsprop)

但是当我想适合AE时:

history = AE.fit(train_images, train_images,
                          epochs= 2,
                          verbose=1)

我得到错误

ValueError:tf.function-decorated函数试图在非首次调用时创建变量。

请帮我 。谢谢

更新:

我通过@Mr的答案来更新损失函数。例如,但是我得到新的错误:现在我有损失函数:

'''
define perceptual_loss
'''

selected_layers = ['block1_conv1', 'block2_conv2',"block3_conv3" ,'block4_conv3','block5_conv4']
selected_layer_weights = [1.0, 4.0 , 4.0 , 8.0 , 16.0]

vgg = VGG19(weights='imagenet', include_top=False, input_shape=(32,32,3))
vgg.trainable = False
outputs = [vgg.get_layer(l).output for l in selected_layers]
model = Model(vgg.input, outputs)

def perceptual_loss(input_image , reconstruct_image):
    h1_list = model(input_image)
    h2_list = model(reconstruct_image)

    rc_loss = 0.0
    for h1, h2, weight in zip(h1_list, h2_list, selected_layer_weights):
        h1 = K.batch_flatten(h1)
        h2 = K.batch_flatten(h2)
        rc_loss = rc_loss + weight * K.sum(K.square(h1 - h2), axis=-1)

    return rc_loss

我收到新错误:

ValueError                                Traceback (most recent call last)

<ipython-input-16-3133696ab8be> in <module>()
----> 1 VAE.fit(train_images[:5],train_images[:5],epochs=2,verbose=1)

2 frames

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)
   1098                 _r=1):
   1099               callbacks.on_train_batch_begin(step)
-> 1100               tmp_logs = self.train_function(iterator)
   1101               if data_handler.should_sync:
   1102                 context.async_wait()

/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/def_function.py in __call__(self, *args, **kwds)
    826     tracing_count = self.experimental_get_tracing_count()
    827     with trace.Trace(self._name) as tm:
--> 828       result = self._call(*args, **kwds)
    829       compiler = "xla" if self._experimental_compile else "nonXla"
    830       new_tracing_count = self.experimental_get_tracing_count()

/usr/local/lib/python3.6/dist-packages/tensorflow/python/eager/def_function.py in _call(self, *args, **kwds)
    862       results = self._stateful_fn(*args, **kwds)
    863       if self._created_variables:
--> 864         raise ValueError("Creating variables on a non-first call to a function"
    865                          " decorated with tf.function.")
    866       return results

ValueError: Creating variables on a non-first call to a function decorated with tf.function.

更新2

正如@Navid所说的,我@tf.function在损失函数之前添加,错误消失了!

'''
define perceptual_loss
'''

selected_layers = ['block1_conv1', 'block2_conv2',"block3_conv3" ,'block4_conv3','block5_conv4']
selected_layer_weights = [1.0, 4.0 , 4.0 , 8.0 , 16.0]

vgg = VGG19(weights='imagenet', include_top=False, input_shape=(32,32,3))
vgg.trainable = False
outputs = [vgg.get_layer(l).output for l in selected_layers]
model = Model(vgg.input, outputs)

@tf.function
def perceptual_loss(input_image , reconstruct_image):
    h1_list = model(input_image)
    h2_list = model(reconstruct_image)

    rc_loss = 0.0
    for h1, h2, weight in zip(h1_list, h2_list, selected_layer_weights):
        h1 = K.batch_flatten(h1)
        h2 = K.batch_flatten(h2)
        rc_loss = rc_loss + weight * K.sum(K.square(h1 - h2), axis=-1)

    return rc_loss ```
海军蓝

只需在损失函数之外创建模型并@tf.function在定义损失函数之前使用

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

keras 中的自定义损失在训练自动编码器期间会产生误导性的输出

来自分类Dev

使用预训练的VGG的多流CNN

来自分类Dev

如何使用VGG19转移学习预训练

来自分类Dev

在Keras / Tensorflow自定义损失函数中使用其他**可**变量

来自分类Dev

使用Tensorflow / Keras求解微分方程的自定义损失函数的问题

来自分类Dev

Keras中的自定义损失函数应该返回该批次的单个损失值,还是返回该训练批次中每个样本的大量损失?

来自分类Dev

Keras:无法在模型中使用自定义损失函数

来自分类Dev

如何为Keras使用自定义损失功能

来自分类Dev

在keras自定义损失函数中获取训练数据形状

来自分类Dev

Tensorflow Keras 在自动编码器中分别使用编码器和解码器

来自分类Dev

Keras中的自定义损失函数,使用掩码数组作为输入

来自分类Dev

如何使用堆叠式自动编码器进行预训练

来自分类Dev

如何使用堆叠式自动编码器进行预训练

来自分类Dev

在Keras中训练变型自动编码器会引发“ InvalidArgumentError:形状不兼容”错误

来自分类Dev

在张量流中连接vgg19的问题

来自分类Dev

在 Keras 中的数值数据集上使用自动编码器

来自分类Dev

keras变分自动编码器损失函数

来自分类Dev

如何在Keras / Tensorflow中编写自定义损失函数,该函数将循环/迭代与参考numpy代码一起使用

来自分类Dev

预训练模型在ResNet,InceptionNet上运行良好,但无法在VGG16和VGG19上运行

来自分类Dev

Keras中的变体自动编码器:在训练和预测时如何实现Keras层的不同输出?

来自分类Dev

如何在Keras中加快具有自定义损失功能的模型的训练?

来自分类Dev

张量的矢量化运算,而不是在keras自定义损失函数中使用for循环

来自分类Dev

如何在Keras自定义损失函数中使用张量?

来自分类Dev

自定义损失函数以在Python中使用Keras进行奖励

来自分类Dev

使用 Keras 自定义损失函数来惩罚更多的负面预测

来自分类Dev

Keras 自定义损失具有使用的功能之一和条件

来自分类Dev

在CNN的Keras自定义损失函数中处理数据

来自分类Dev

为什么在R中使用keras训练自动编码器时会收到此错误?

来自分类Dev

如何使用自定义损失功能(PU学习)

Related 相关文章

  1. 1

    keras 中的自定义损失在训练自动编码器期间会产生误导性的输出

  2. 2

    使用预训练的VGG的多流CNN

  3. 3

    如何使用VGG19转移学习预训练

  4. 4

    在Keras / Tensorflow自定义损失函数中使用其他**可**变量

  5. 5

    使用Tensorflow / Keras求解微分方程的自定义损失函数的问题

  6. 6

    Keras中的自定义损失函数应该返回该批次的单个损失值,还是返回该训练批次中每个样本的大量损失?

  7. 7

    Keras:无法在模型中使用自定义损失函数

  8. 8

    如何为Keras使用自定义损失功能

  9. 9

    在keras自定义损失函数中获取训练数据形状

  10. 10

    Tensorflow Keras 在自动编码器中分别使用编码器和解码器

  11. 11

    Keras中的自定义损失函数,使用掩码数组作为输入

  12. 12

    如何使用堆叠式自动编码器进行预训练

  13. 13

    如何使用堆叠式自动编码器进行预训练

  14. 14

    在Keras中训练变型自动编码器会引发“ InvalidArgumentError:形状不兼容”错误

  15. 15

    在张量流中连接vgg19的问题

  16. 16

    在 Keras 中的数值数据集上使用自动编码器

  17. 17

    keras变分自动编码器损失函数

  18. 18

    如何在Keras / Tensorflow中编写自定义损失函数,该函数将循环/迭代与参考numpy代码一起使用

  19. 19

    预训练模型在ResNet,InceptionNet上运行良好,但无法在VGG16和VGG19上运行

  20. 20

    Keras中的变体自动编码器:在训练和预测时如何实现Keras层的不同输出?

  21. 21

    如何在Keras中加快具有自定义损失功能的模型的训练?

  22. 22

    张量的矢量化运算,而不是在keras自定义损失函数中使用for循环

  23. 23

    如何在Keras自定义损失函数中使用张量?

  24. 24

    自定义损失函数以在Python中使用Keras进行奖励

  25. 25

    使用 Keras 自定义损失函数来惩罚更多的负面预测

  26. 26

    Keras 自定义损失具有使用的功能之一和条件

  27. 27

    在CNN的Keras自定义损失函数中处理数据

  28. 28

    为什么在R中使用keras训练自动编码器时会收到此错误?

  29. 29

    如何使用自定义损失功能(PU学习)

热门标签

归档