Параллельно связанные реплики сети как вход в другую сеть в Керасе - PullRequest
0 голосов
/ 01 марта 2020

Я обучил небольшую нейронную сеть задаче категоризации, и теперь я хочу использовать ее как конструктор функций как часть большой сети. Этот конструктор признаков может принимать одно слово за раз и выводить вектор длины длиной, скажем, 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 параллельных реплики одной сети с другой, но что такое способ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...