Tensorflow — получение зондов предварительно обученных моделей

Мне нужно получить зонды предварительно заданной модели в TensorFlow (сеть изображений набора данных), то есть для каждого блока VGG16, или ResNet50, или любой другой связанной модели в TensorFlow, я хочу иметь прогноз класса y_hat, поэтому массив нулей, но для предсказанного класса, который будет равен 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)

Теперь я застрял, потому что я пытаюсь сгладить и сжать вывод блока, чтобы получить прогноз с помощью 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]

Но ничего не работает. Кто-нибудь знает, как я могу получить «окончательные» прогнозы из каждого блока?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
151
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша методология верна: проблема в том, что первые слои большой модели, такой как ResNet50 или VGG16, действительно большие. Подключение полносвязного (плотного) слоя к большому выходу (например, 112x112x64) приводит к очень большим весам.

Существует некоторая стратегия решения этой проблемы, описанная в статье Понимание промежуточных слоев с использованием зондов линейного классификатора

Практическая проблема: уменьшение размеров элементов

Другая практическая проблема может возникнуть, когда определенные слои нейронной сети имеют чрезвычайно большое количество признаков. Первые несколько слоев Inception v3, например, имеют несколько миллионов функций, когда мы умножаем высоту, ширину и каналы. Это приводит к тому, что параметры одного зонда занимают несколько гигабайт памяти, что непропорционально много, если учесть, что весь набор параметров модели занимает меньше места. В этих случаях у нас есть три возможных предложения по сокращению пространство признаков, на которое мы укладываем зонды.

  • Используйте только случайное подмножество функций (но всегда одни и те же). Это используется в модели Inception v3 в разделе 4.2.
  • Спроецируйте функции на пространство более низкого измерения. Изучите это сопоставление. Вероятно, это худшая идея, чем кажется, потому что сама проекционная матрица может занимать много памяти (даже больше, чем параметры зонда).
  • При работе с функциями в виде изображений (высота, ширина, каналы) мы можем выполнять 2D-пулинг по (высоте, ширине) каждого канала. Это уменьшает количество функций до количества каналов. Это используется в модели ResNet-50 в разделе 4.1.

Другие вопросы по теме