Можно ли изменить форму входного сигнала модели с предварительной подготовкой к тензорному течению? - PullRequest
1 голос
/ 08 октября 2019

У меня есть предварительно обученная модель Tensorflow для сегментации изображений, которая получает 6 входных сигналов, я хотел бы изменить размер входного сигнала модели, чтобы получить 4 диапазона, чтобы я мог переобучаться с собственным набором данных, но все еще не в состояниисделать это, не уверен, если это вообще возможно?

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

graph = tf.get_default_graph()
tf_new_input = tf.placeholder(shape=(4, 256, 256), dtype='float32', name='new_input')
tf.import_graph_def(graph_def, input_map={"ImageInputLayer": tf_new_input})

Но я получаю следующую ошибку:

tensorflow.python.framework.errors_impl.InvalidArgumentError: Dimensions must be equal, but are 4 and 6 for 'import/ImageInputLayer_Sub' (op: 'Sub') with input shapes: [4,256,256], [6,256,256]

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

user1190882 ответил на этот вопрос очень хорошо. Просто используя этот раздел, чтобы опубликовать код для будущей ссылки, мне пришлось внести небольшое изменение, создав фильтр в отдельной переменной, поскольку я получал ошибку: Shape должен быть ранга 4, но ранга 1 для Conv2D. Также я внес небольшое изменение, так как формат ввода моей модели - «Сначала каналы», я добавил флаг data_format.

with tf.Graph().as_default() as new_graph:

tf_new_input = tf.placeholder(shape=(None, 4, 256, 256), dtype='float32')
# Creating separate variable for filter  
filterc = tf.Variable(tf.random_normal([3, 3, 4, 6]))
new_node = tf.nn.conv2d(tf_new_input, filterc, strides=1, padding='SAME',  data_format='NCHW')
tf.import_graph_def(old_graph, input_map={'ImageInputLayer': new_node})
0 голосов
/ 08 октября 2019

Вы должны преобразовать 4-канальный вводный заполнитель в 6-канальный, а также форма входного изображения должна быть такой же, как ожидает ваша 6-канальная модель. Вы можете использовать любую операцию, но conv2d - это простая операция перед ее передачей в существующую модель. Вот как ты это делаешь.

with tf.Graph().as_default() as old_graph:
  # You have to load your 6 channel input graph here
  saver.restore(tf.get_default_session(), <<save_path>>)
  # Assuming that input node is named as 'input_node' and 
  # final node is named as 'softmax_node'

with tf.Graph().as_default() as new_graph:
  tf_new_input = tf.placeholder(shape=(None, 256, 256, 4), dtype='float32')

  # Map 4 channeled input to 6 channel and 
  # image input shape should be same as expected by old model.
  new_node = tf.nn.conv2d(tf_new_input, (3, 3, 4, 6), strides=1, padding='SAME')

  # If you want to obtain output node so that you can further perform operations.
  softmax_node = tf.import_graph_def(old_graph, input_map={'input_node:0': new_node}, 
                                     return_elements=['softmax_node:0'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...