繁体   English   中英

Tensorflow - 获取预训练模型的探测

[英]Tensorflow - Getting Probes of Pretrained models

I need to get the probes of a pretained model in TensorFlow (dataset imagenet), that is for each block of a VGG16, or ResNet50 or any other pertained model in TensorFlow, I want to have a prediction of the class y_hat , so an array零,但预测的 class 将为 1。

我编写了以下代码来获取每个块的输出(在另一个 StackOverflow 问题中找到):

IMG_SHAPE = (224, 224, 3)
model = tf.keras.applications.VGG16(input_shape = IMG_SHAPE,
                                    include_top=False,
                                    weights='imagenet')

# Download the weights file and then:

model = tf.keras.applications.VGG16(input_shape = IMG_SHAPE,
                                    include_top=False,
                                    weights=None)
pretrain_model_path = "/content/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5"
model.load_weights(pretrain_model_path)

# Get blocks output:

probe1 = model.get_layer('block1_pool').output
probe2 = model.get_layer('block2_pool').output
probe3 = model.get_layer('block3_pool').output
probe4 = model.get_layer('block4_pool').output
probe5 = model.get_layer('block5_pool').output

probe_1 = tf.keras.models.Model(inputs=model.input, outputs=probe1)
probe_2 = tf.keras.models.Model(inputs=model.input, outputs=probe2)
probe_3 = tf.keras.models.Model(inputs=model.input, outputs=probe3)
probe_4 = tf.keras.models.Model(inputs=model.input, outputs=probe4)
probe_5 = tf.keras.models.Model(inputs=model.input, outputs=probe5)

现在,我被卡住了,因为我试图平整和密集块的 output 以获得使用 softmax 的预测,但它给了我数千个错误:

inputs = model.input
lay = model.get_layer('block1_pool').output
x = tf.keras.layers.Flatten()(lay)
outputs = tf.keras.layers.Dense(1000, activation='softmax')(x)
model_1 = tf.keras.Model(inputs=inputs, outputs=outputs)

---------------------------------------------------------------------------
ResourceExhaustedError                    Traceback (most recent call last)
<ipython-input-88-22a2004a95b6> in <module>()
      2 lay = model.get_layer('block1_pool').output
      3 x = tf.keras.layers.Flatten()(lay)
----> 4 outputs = tf.keras.layers.Dense(1000, activation='softmax')(x)
      5 model_1 = tf.keras.Model(inputs=inputs, outputs=outputs)

21 frames
/usr/local/lib/python3.6/dist-packages/six.py in raise_from(value, from_value)

ResourceExhaustedError: OOM when allocating tensor with shape[802816,1000] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc [Op:RandomUniform]

但似乎没有任何效果。 有人知道我如何从每个区块中获得“最终”预测吗?

你的方法是正确的:问题是像 ResNet50 或 VGG16 这样的大 model 的第一层真的很大。 将全连接(密集)层连接到大 output(如 112x112x64)会导致权重非常大。

使用线性分类器探针了解中间层的论文中描述了一些针对该问题的策略

实际问题:特征降维

当神经网络的某些层具有非常大量的特征时,可能会出现另一个实际问题。 例如,当我们将高度、宽度和通道相乘时,Inception v3 的前几层有几百万个特征。 这导致单个探针的参数占用了超过几 GB 的存储空间,当我们考虑到整个 model 参数集占用的空间比这要少时,这会不成比例地大。在这种情况下,我们有三个可能的建议来减少我们适合探针的特征空间。

  • 仅使用特征的随机子集(但总是相同的)。 这用于第 4.2 节中的 Inception v3 model。
  • 将特征投影到低维空间。 学习这个映射。 这可能是一个比听起来更糟糕的想法,因为投影矩阵本身可能会占用大量存储空间(甚至比探测参数还要多)。
  • 在处理图像形式的特征(高度、宽度、通道)时,我们可以沿着每个通道的(高度、宽度)进行二维池化。 这将特征的数量减少到通道的数量。 这用于第 4.1 节中的 ResNet-50 model

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM