簡體   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