Как извлечь подраздел keras.Model в другую модель (тензор потока 2.1.0)?

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

import tensorflow as tf
from tensorflow.keras import Model
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Layer
from tensorflow.keras.layers import Input 

inp = Input(shape=(128))
d1 = Dense(128, name='d1')(inp)
d2 = Dense(128, name='d2')(d1)
d3 = Dense(128, name='d3')(d2)
out = Dense(128, name='d4')(d3)

model = Model(inp, out)
inp_d2 = model.get_layer('d2').input
sub_model = Model(inp_d2, model.output)

Это поднимает:

ValueError: Graph disconnected: cannot obtain value for tensor Tensor("input_1:0", shape=(None, 128), dtype=float32) at layer "input_1". The following previous layers were accessed without issue: []

Кто-нибудь знает, почему возникает эта ошибка или как ее исправить?

Всего 1 ответ


Это может быть достигнуто путем объявления пустой последовательной подмодели и добавления к ней слоев при выполнении итерации по подмножеству исходных слоев:

# Original Model:
inp = Input(shape=(128))
d1 = Dense(128, name='d1')(inp)
d2 = Dense(128, name='d2')(d1)
d3 = Dense(128, name='d3')(d2)
out = Dense(128, name='d4')(d3)

model = Model(inp, out)

# Sub Model
sub_model = tf.keras.Sequential()

# I will skip inp and d1:
for layer in model.layers[2:]:
  sub_model.add(layer)

# Print summary:
example_input_shape = (1, 128)
sub_model.build(example_input_shape)
print(sub_model.summary())

Удачи!


Есть идеи?

10000