Как использовать предварительно обученную сеть в качестве слоя в Tensorflow? - PullRequest
0 голосов
/ 20 мая 2019

Я хочу использовать экстрактор объектов (например, ResNet101) и добавлять слои после того, которые используют вывод слоя экстрактора объектов.Тем не менее, я не могу понять, как.Я только нашел решения онлайн, где вся сеть используется без добавления дополнительных слоев.Я неопытен в Tensorflow.

В приведенном ниже коде вы можете увидеть, что я пробовал.Я могу правильно запустить код без дополнительного сверточного слоя, однако моя цель - добавить больше слоев после ResNet.При этой попытке добавления дополнительного слоя конвоя возвращается ошибка типа: Ошибка типа: ожидаемый float32, получен OrderedDict ([('resnet_v1_101 / conv1', ...

Как только я добавлю больше слоев, я быхотел бы начать тренировку на очень маленьком тестовом наборе, чтобы посмотреть, сможет ли моя модель переодеться.


import tensorflow as tf
import tensorflow.contrib.slim as slim
from tensorflow.contrib.slim.python.slim.nets import resnet_v1
import matplotlib.pyplot as plt

numclasses = 17

from google.colab import drive
drive.mount('/content/gdrive')

def decode_text(filename):
  img = tf.io.decode_jpeg(tf.io.read_file(filename))
  img = tf.image.resize_bilinear(tf.expand_dims(img, 0), [224, 224])
  img = tf.squeeze(img, 0)
  img.set_shape((None, None, 3))
  return img

dataset = tf.data.TextLineDataset(tf.cast('gdrive/My Drive/5LSM0collab/filenames.txt', tf.string))
dataset = dataset.map(decode_text)
dataset = dataset.batch(2, drop_remainder=True)

img_1 = dataset.make_one_shot_iterator().get_next()
net = resnet_v1.resnet_v1_101(img_1, 2048, is_training=False, global_pool=False, output_stride=8) 
net = slim.conv2d(net, numclasses, 1)


sess = tf.Session()

global_init = tf.global_variables_initializer()
local_init = tf.local_variables_initializer()
sess.run(global_init)
sess.run(local_init)
img_out, conv_out = sess.run((img_1, net))

1 Ответ

0 голосов
/ 20 мая 2019

resnet_v1.resnet_v1_101 не возвращает просто net, а вместо этого возвращает кортеж net, end_points.Второй элемент - это словарь, по-видимому, поэтому вы получаете именно это сообщение об ошибке.

Для документации этой функции :

Возвращает:

net: тензор размера ранга 4 [batch, height_out,width_out, channel_out].Если global_pool равен False, то height_out и width_out уменьшаются на коэффициент output_stride по сравнению с соответствующими height_in и width_in, в противном случае значения height_out и width_out равны единице.Если num_classes равен 0 или None, то net является выходом последнего блока ResNet, возможно, после глобального среднего пула.Если num_classes - ненулевое целое число, net содержит активации pre-softmax.

end_points: Словарь от компонентов сети до соответствующей активации.

Таким образом, вы можете написать дляпример:

net, _ = resnet_v1.resnet_v1_101(img_1, 2048, is_training=False, global_pool=False, output_stride=8) 
net = slim.conv2d(net, numclasses, 1)

Вы также можете выбрать промежуточный слой, например:

_, end_points = resnet_v1.resnet_v1_101(img_1, 2048, is_training=False, global_pool=False, output_stride=8) 
net = slim.conv2d(end_points["main_Scope/resnet_v1_101/block3"], numclasses, 1)

(вы можете посмотреть в end_points, чтобы найти имена конечных точек. Ваше имя области будет другимчем main_Scope.)

...