ValueError: слой слияния должен вызываться в списке входных данных.Тензор потока Керас - PullRequest
0 голосов
/ 26 июня 2019

В настоящее время я пытаюсь использовать первые 50 слоев MobileNetV2. Поэтому я хочу извлечь эти слои и создать новую модель.

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

import tensorflow as tf
from keras.models import Model

mobile_net=tf.keras.applications.mobilenet_v2.MobileNetV2(input_shape=(224,224,3), alpha=0.5, include_top=False, weights='imagenet')


inputs = Input(shape=(224, 224, 3))
x=mobile_net.layers[1](inputs)
for layer in mobile_net.layers[2:50]:
  x=layer(x)




{'name': 'block_2_add', 'trainable': True, 'dtype': 'float32'}
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-77-5873b9344fa3> in <module>()
      3 for layer in mobile_net.layers[2:50]:
      4   print(layer.get_config())
----> 5   x=layer(x)
      6 
      7 for layer in mobile_net.layers[:50]:

1 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/layers/merge.py in call(self, inputs)
    119   def call(self, inputs):
    120     if not isinstance(inputs, list):
--> 121       raise ValueError('A merge layer should be called on a list of inputs.')
    122     if self._reshape_required:
    123       reshaped_inputs = []

ValueError: A merge layer should be called on a list of inputs.

1 Ответ

2 голосов
/ 26 июня 2019

Я предполагаю, что MobileNetV2 не является последовательной моделью, то есть график слоев не является линейным. Если вы хотите получить только выходные данные модели, а не какие-либо выходные данные промежуточного уровня, я думаю, что следующий код должен выполнить эту работу (даже если кажется, что вы хотите вычислить последний уровень перед выводом, результат все равно должен быть тем, что вы хотите):

import tensorflow as tf
from keras.models import Model

mobile_net=tf.keras.applications.mobilenet_v2.MobileNetV2(input_shape=(224,224,3), alpha=0.5, include_top=False, weights='imagenet')


inputs = Input(shape=(224, 224, 3))
output = mobile_net(inputs)
...