- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 VGG19 编码器,它接受 (256,256,3)
的输入图像 y
并返回维度 (32,32, 512) 的张量
来自 vgg 的 conv-4-1 层。我需要将其转换为 numpy 数组以应用一些转换并使用我的解码器重建图像。
简而言之,我正在尝试像这样训练解码器网络:
x = vgg_encoder(y) # generate features from image y
x = do_extra_transformation(x) # for example, reshape and apply K means to shift features towards their cluster centres
y_pred = decoder(x) # try to reconstruct the image y from features
loss = calculate_loss(y, y_pred) # calculate reconstruction loss using VGG loss
但是,当我运行代码时,出现错误:ValueError: Tensor Tensor("block4_conv1/Relu:0", shape=(?, 32, 32, 512), dtype=float32) 不是此图的元素。
我假设错误来自在我调用 VGG 上的预测以生成特征后 tensorflow 断开图的连接。我不明白为什么这是一个问题,因为它在技术上仅用于数据生成,而不是训练计算图的一部分!
<小时/>python example.py
运行import tensorflow as tf
import numpy as np
from tensorflow.keras.applications import VGG19
from tensorflow.keras.layers import Input, UpSampling2D, Conv2D
from tensorflow.keras.models import Model
import tensorflow.keras.backend as K
from tensorflow.keras.optimizers import Adam
class CustomModel:
def __init__(self, im_h, im_w, im_c):
self.im_shape = (im_h, im_w, im_c)
self.vgg_features_shape = (None, None, 512)
self.vgg_loss_model = self.build_vgg_loss()
self.kernel_size = (3,3)
self.decoder = self.build_decoder()
def build_vgg_loss(self):
vgg = VGG19(weights="imagenet", include_top=False, input_shape=self.im_shape)
vgg.outputs = vgg.get_layer('block4_conv1').output
model = Model(inputs=vgg.inputs, outputs=vgg.outputs)
model.trainable = False
return model
def build_decoder(self):
"""
Mirrors the VGG network with max-pooling layers replaces by UpScaling Layers
"""
i = Input((None, None, 512))
x = Conv2D(filters=512, kernel_size=self.kernel_size, padding='same')(i)
x = UpSampling2D()(x)
for _ in range(4):
x = Conv2D(filters=256, kernel_size=self.kernel_size, padding='same')(x)
x = UpSampling2D()(x)
for _ in range(2):
x = Conv2D(filters=128, kernel_size=self.kernel_size, padding='same')(x)
x = UpSampling2D()(x)
for _ in range(2):
x = Conv2D(filters=64, kernel_size=self.kernel_size, padding='same')(x)
x = Conv2D(filters=3, kernel_size=self.kernel_size, padding='same')(x)
model = Model(inputs=i, outputs=x)
return model
def get_loss(self, y_pred, y):
vgg_model = self.vgg_loss_model
def content_loss(y_pred, y):
dif = vgg_model(y) - vgg_model(y_pred)
sq = K.square(dif)
s = K.sum(sq, axis=-1)
sqrt = K.sqrt(s)
loss = K.sum(sqrt)
return loss
return content_loss(y_pred, y)
class DataLoader:
def __init__(self, vgg):
self.vgg = vgg
def gen(self):
while True:
y = np.random.randn(256, 256,3)
x = self.vgg.predict(np.expand_dims(y, 0)).reshape((32,32,512)) # if this is turned into a np.array, everything works as expected
yield x, np.random.randn(256, 256,3)
model = CustomModel(256,256,3)
# dl = DataLoader(datapath='./trainer/data/', mst=mst)
output_types=(
tf.float32,
tf.float32
)
output_shapes=(
tf.TensorShape([None, None, None]),
tf.TensorShape([None, None, None])
)
ds = tf.data.Dataset.from_generator(DataLoader(model.vgg_loss_model).gen,
output_types=output_types,
output_shapes=output_shapes)
ds = ds.repeat().batch(1)
iterator = ds.make_one_shot_iterator()
x, y = iterator.get_next()
y_pred = model.decoder(x)
loss = model.get_loss(y_pred, y)
opt = tf.train.AdamOptimizer(0.01)
train_opt = opt.minimize(loss)
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
opt = tf.train.GradientDescentOptimizer(0.01)
for i in range(5):
sess.run(train_opt)
最佳答案
不要忘记,您所描述的任务的输入是图像,输出也是相同的图像。因此,您构建的模型必须包含所有部分,即编码器 + 解码器。当然,您可以选择不训练其中任何一个(因为您已经选择不训练编码器)。以下是您需要应用的更改:
以下是错误的,因为y
和y_pred
是decoder的真实输出和预测输出,所以应用没有意义它们上的 vgg_model
(即编码器):
dif = vgg_model(y) - vgg_model(y_pred)
您只想将重建图像与原始图像进行比较。所以只需将其更改为:
dif = y - y_pred
(此外,您不再需要 get_loss
中的 vgg_model = self.vgg_loss_model
;实际上,get_loss
可以定义为CustomModel
类的静态方法,没有内部 custom_loss
函数)。
def gen(self):
while True:
y = np.random.randn(256, 256,3)
x = self.vgg.predict(np.expand_dims(y, 0)).reshape((32,32,512))
yield x, np.random.randn(256, 256,3)
正如我们提到的,模型的输入和输出是相同的(此外,通过使用 self.vgg.predict,您可以有效地从模型中删除编码器)整个模型计算图)。只需将其更改为:
def gen(self):
while True:
x = np.random.randn(256, 256,3)
yield x, x # same input and output
<小时/>
最后这一行:
y_pred = model.decoder(x)
首先应用编码器,然后在编码器的输出上应用解码器来重建图像。因此,请执行您所说的:
y_pred = model.decoder(model.vgg_loss_model(x))
<小时/>
最后一点:我认为在这些情况下,最好在开始实现之前在一张纸上绘制整个计算图的大图,确实有助于更好地理解问题并节省大量时间和精力.
关于python - 使用 VGG 进行数据生成和损失计算时,元素不属于图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56080498/
我已经使用 VGG 作为图像分类模型实现了图像字幕。我读过关于 YOLO 是一种快速图像分类和检测模型的文章,它主要用于多目标检测。但是对于图像字幕,我只想要类而不是边界框。 最佳答案 我完全同意 P
你能告诉我每层有多少个神经元吗?我觉得这将增进我对 VGG 正在发生的事情的理解。 让我们在这里使用这段代码只是为了得到一些具体的东西。 https://github.com/machrisaa/te
我的问题是如何将从预训练 Vgg16 模型加载的常量张量转换为 tf.Variable 张量?动机是我需要计算关于 Conv4_3 层内核的特定损失的梯度,但是,内核似乎设置为 tf.Constant
我正在使用使用 VGG(神经网络)的基于转移式的深度学习方法。后者适用于小尺寸(512x512 像素)的图像,但是当输入图像很大(尺寸 > 1500 像素)时它会提供失真的结果。该方法的作者建议将输入
我所做的是: from keras.applications.vgg16 import VGG16 from keras.layers import * from keras.models impor
我想知道是否可以将自定义模型添加到 keras 中的损失函数。例如: def model_loss(y_true, y_pred): inp = Input(shape=(128, 128,
我加载了预训练的 VGG 人脸 CNN 并成功运行。我想从第 3 层和第 8 层提取超列平均值。我正在关注关于从 here 中提取超列的部分。 .但是,由于 get_output 函数不起作用,我不得
我正在使用 Python 3.7.7 和 Tensorflow 2.1.0。 我想创建一个 VGG16 自动编码器网络,向它加载一个权重文件,然后获取它的编码器和解码器。 获取 VGG16 自编码器网
我有一个 VGG19 编码器,它接受 (256,256,3) 的输入图像 y 并返回维度 (32,32, 512) 的张量 来自 vgg 的 conv-4-1 层。我需要将其转换为 numpy 数组以
当使用 torchvision.models 模块加载预训练的 VGG 网络并使用它对任意 RGB 图像进行分类时,网络的输出在每次调用之间明显不同。为什么会这样?根据我的理解,VGG 前向传播的任何
我已关注this加载并运行预训练的 VGG 模型。但是,我试图从隐藏层中提取特征图,并尝试复制“提取任意特征图”部分 here 中的结果。 。我的代码如下: #!/usr/bin/python imp
我正在尝试使用来自 keras 的预训练 VGG 16。但我真的不确定输入范围应该是多少。 快速回答,这些颜色顺序中的哪些? RGB BGR 哪个范围? 0 到 255? 从大约 -125 平衡到大约
我正在使用包含 3k 图像的数据集从头开始训练 VGG-16 模型。 我使用 Tensorflow 平台和 8 个 CPU,没有任何 GPU。 训练率 - 0.01, 重量衰减 - 0.0005, 动
这个问题是对 this answer 评论中讨论的跟进。 . 据我了解,preprocess_input() function 确实意味着输入图像的减法和 std-dev dvision。平均值是在训
刚接触pytorch,想用Vgg做迁移学习。我想删除全连接层并添加一些新的全连接层。我还想使用灰度输入而不是 RGB 输入。为此,我将添加输入层的权重并获得单个权重。所以三个 channel 的权重会
我使用 VGG16 基础创建了一个自定义 Keras 模型,并对其进行训练和保存: from keras.applications import VGG16 from keras import mod
我正在尝试打印所有已知类别及其概率值。第一个值是概率最高的类别。 这是迄今为止我的代码: from keras.applications.vgg16 import VGG16 from keras.p
我试图将具有以下形状的数据拟合到预训练的 keras vgg19 模型中。 图像输入形状为(32383, 96, 96, 3)标签形状为 (32383, 17)我收到了这个错误 expected bl
我正在使用预先训练的 VGG-16 网络将图像转换为特征。我可以按顺序完成这个工作。但是,我想并行执行此操作,但我不确定如何正确构建批处理。 具体来说,假设我加载了 16 个保存在 numpy 数组中
我实际上正在尝试使用 Keras 获得 VGG16 的顺序模型版本。功能版本可以通过以下方式获得: from __future__ import division, print_function im
我是一名优秀的程序员,十分优秀!