Как удалить входной слой предварительно обученной модели в tf.keras и использовать другой слой в качестве входных данных для модели?

#python #machine-learning #deep-learning #tensorflow2.0 #tf.keras

Вопрос:

Я пытаюсь построить сеть, используя efficientNetB0 для классификации изображений в оттенках серого. Таким образом, мой ввод-это одноканальное изображение, и поскольку ни одна из предварительно обученных моделей не принимает одноканальное изображение в качестве входных данных, я действительно не могу передать форму ввода (256, 256, 1) . Поэтому я попытался составить сценарий:

 def build_generator(input_shape=(256,256,1)):
  effB0 = tf.keras.applications.EfficientNetB0(input_shape = (256,256,3),include_top=False)

  inputs = Input(shape=(256, 256, 1), name="model_input")
  initializer = tf.random_normal_initializer(0., 0.02)
  
  X = Conv2D(filters=3, kernel_size=1,
                  strides=1, padding='same',
                  kernel_initializer=initializer,
                  activation='relu', name='first_conv')(inputs) # (bs, 256, 256, 3)

  effB0.layers[0] = effB0.layers[0](X)


  model = Model(inputs = inputs, outputs = effB0.output)

  return model

generator = build_generator()
 

но в итоге я получаю несвязанный график,

 ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-19-e5dd265b0536> in <module>()
----> 1 generator = build_generator()
      2 
      3 tf.keras.utils.plot_model(
      4     generator,
      5     to_file = 'generator.png',

5 frames
/usr/local/lib/python3.7/dist-packages/keras/engine/functional.py in _map_graph_network(inputs, outputs)
    982                              'The following previous layers '
    983                              'were accessed without issue: '  
--> 984                              str(layers_with_complete_input))
    985         for x in tf.nest.flatten(node.outputs):
    986           computable_tensors.add(id(x))

ValueError: Graph disconnected: cannot obtain value for tensor KerasTensor(type_spec=TensorSpec(shape=(None, 256, 256, 3), 
dtype=tf.float32, name='input_12'), name='input_12', 
description="created by layer 'input_12'") at layer "rescaling_9". 
The following previous layers were accessed without issue: []
 

Есть какие-нибудь идеи? Я не хочу обрезать и редактировать промежуточный сетевой уровень, поэтому я не хочу использовать этот подход,

 X = effB0(X)

model = Model(inputs = inputs, outputs = X)
 

Ответ №1:

Попробуйте это:

 def build_generator(input_shape=(256, 256, 1)):
  inputs = Input(shape=(256, 256, 1), name="model_input")
  outputs = tf.keras.applications.EfficientNetB0(include_top=False, weights=None)(inputs)
  model = Model(inputs, outputs)

  return model

generator = build_generator()