Я реализовал модель Keras, используя функциональный API:
x_inp, x_out = graphsage_model.in_out_tensors()
prediction = layers.Dense(units=train_targets.shape[1], activation="softmax")(x_out)
model = Model(inputs=x_inp, outputs=prediction)
model.compile(
optimizer=optimizers.Adam(lr=0.005),
loss=losses.categorical_crossentropy,
metrics=["acc"],
)
С тензорами:
x_inp: [<tf.Tensor 'input_1:0' shape=(None, 1, 1433) dtype=float32>, <tf.Tensor 'input_2:0' shape=(None, 10, 1433) dtype=float32>, <tf.Tensor 'input_3:0' shape=(None, 50, 1433) dtype=float32>]
x_out: Tensor("lambda/Identity:0", shape=(None, 32), dtype=float32)
prediction: Tensor("dense/Identity:0", shape=(None, 7), dtype=float32)
train_targets.shape[1] = 7
Насколько я понимаю, моя модель имеет 50 единиц в входной слой, 32 в скрытом слое и 7 в выходном слое в подходе функционального API. Чтобы понять, как последовательная модель Keras работает в отличие от функционального API, я попытался реализовать это в последовательном подходе:
model = models.Sequential()
model.add(layers.Dense(32, activation='softmax', input_shape=(50,)))
model.add(layers.Dense(7, activation='softmax'))
Но мне выдается следующая ошибка:
ValueError: Ошибка при проверке ввода модели: список массивов Numpy, которые вы передаете в вашу модель, не соответствует ожидаемому размеру модели. Ожидается увидеть 1 массив (ов), но вместо этого получен следующий список из 3 массивов:
Дополнительная информация о том, как были вычислены x_inp и x_out:
def in_out_tensors(self, multiplicity=None):
"""
Builds a GraphSAGE model for node or link/node pair prediction, depending on the generator used to construct
the model (whether it is a node or link/node pair generator).
Returns:
tuple: (x_inp, x_out), where ``x_inp`` is a list of Keras input tensors
for the specified GraphSAGE model (either node or link/node pair model) and ``x_out`` contains
model output tensor(s) of shape (batch_size, layer_sizes[-1])
"""
if multiplicity is None:
multiplicity = self.multiplicity
if multiplicity == 1:
return self._node_model()
elif multiplicity == 2:
return self._link_model()
else:
raise RuntimeError(
"Currently only multiplicities of 1 and 2 are supported. Consider using node_model or "
"link_model method explicitly to build node or link prediction model, respectively."
)
def _node_model(self):
"""
Builds a GraphSAGE model for node prediction
Returns:
tuple: (x_inp, x_out) where ``x_inp`` is a list of Keras input tensors
for the specified GraphSAGE model and ``x_out`` is the Keras tensor
for the GraphSAGE model output.
"""
# Create tensor inputs for neighbourhood sampling
x_inp = [
Input(shape=(s, self.input_feature_size)) for s in self.neighbourhood_sizes
]
# Output from GraphSAGE model
x_out = self(x_inp)
# Returns inputs and outputs
return x_inp, x_out