Я обучил небольшую нейронную сеть задаче категоризации, и теперь я хочу использовать ее как конструктор функций как часть большой сети. Этот конструктор признаков может принимать одно слово за раз и выводить вектор длины длиной, скажем, 16. Вторая часть сети (далее называемая сетью последовательностей) принимает последовательности, скажем, пяти слов за раз и обрабатывает их в параллели. Поэтому я хочу получить пять реплик сети построителя объектов, используя в качестве входных данных массив из пяти слов, и их выходные данные должны быть объединены и использованы в качестве одного из входных данных для сети последовательностей.
word1 word2 word3 word4 word5
| | | | |
FB FB FB FB FB
| | | | | Other Input
_________________________ |
| |
________________
|
Sequence network
В фигура, FB обозначает Feature Builder. Последовательная сеть занимает два входа; массив из 5 векторов признаков, созданный FB, а затем другой вектор, который я также отправлю. Сеть Sequence также прошла предварительную подготовку по фиктивным данным. Планируется провести окончательную подготовку по реальным данным после объединения сетей.
Итак, как мне, в кератах, объединить две предварительно обученные сети? ? Это то, что у меня есть:
from tensorflow.keras.models import Model
small_classifier = models.load_model(small_classifier_filepath)
small_classifier.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 20) 220
_________________________________________________________________
dense_1 (Dense) (None, 20) 420
_________________________________________________________________
dense_2 (Dense) (None, 16) 336
_________________________________________________________________
dense_3 (Dense) (None, 17) 289
=================================================================
Интересное измерение здесь (None, 16) - это размер вектора объектов, который я хочу использовать.
layer_name = 'dense_3' # last but one layer contains useful features, size 16
feat_layer = small_classifier.get_layer(layer_name)
feature_builder = Model(inputs=small_classifier.input, outputs=feat_layer.output)
small_classifier.trainable = False
sequence_model = models.load_model(sequence_model_filepath)
sequence_model.summary()
Model: "model_9"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_20 (InputLayer) [(None, 5, 2)] 0
__________________________________________________________________________________________________
input_19 (InputLayer) [(None, 5, 16)] 0
(---)
input_20 это «Другой вклад», не имеющий прямого отношения к вопросу здесь. input_19 - это то место, где я хочу подключить конструктор элементов, 5 векторов элементов длиной 16. Итак, я попробовал следующее, что было явно неправильно
from tensorflow.keras.layers import Concatenate
merged_layer = Concatenate([feature_builder.output] * 5)
combined_model = Model(inputs=[merged_layer.input, sequence_model.input[1]], outputs=sequence_model(merged_layer.output, sequence_model.input[1]))
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/base_layer.py in input(self)
1560 if not self._inbound_nodes:
1561 raise AttributeError('Layer ' + self.name +
-> 1562 ' is not connected, no input to return.')
1563 return self._get_node_attribute_at_index(0, 'input_tensors', 'input')
1564
AttributeError: Layer concatenate_16 is not connected, no input to return.
ОК, так что это не был способ объединить 5 параллельных реплики одной сети с другой, но что такое способ?