Несовместимые формы в Stellargraph
Я пытаюсь реализовать небольшой прототип модели GCN, используя библиотеку Stellargraph. У меня готов объект графика StellarGraph, я пытаюсь решить проблему классификации нескольких классов с несколькими метками. Это означает, что я пытаюсь предсказать более одного столбца (точно 19), каждый столбец закодирован либо в 0, либо в 1.
Вот что я сделал:
from sklearn.model_selection import train_test_split
from stellargraph.mapper import FullBatchNodeGenerator
train_subjects, test_subjects = train_test_split(nodelist, test_size = .25)
generator = FullBatchNodeGenerator(graph, method="gcn")
from stellargraph.layer import GCN
train_gen = generator.flow(train_subjects['ID'], train_subjects.drop(['ID'], axis = 1))
gcn = GCN(layer_sizes=[16, 16], activations=["relu", "relu"], generator=generator, dropout=0.5)
from tensorflow.keras import layers, optimizers, losses, metrics, Model
x_inp, x_out = gcn.in_out_tensors()
predictions = layers.Dense(units = 1, activation="sigmoid")(x_out)
from tensorflow.keras.metrics import Precision as Precision
model = Model(inputs=x_inp, outputs=predictions)
model.compile(
optimizer=optimizers.Adam(learning_rate = 0.01),
loss=losses.categorical_crossentropy,
metrics= [Precision()])
val_gen = generator.flow(test_subjects['ID'], test_subjects.drop(['ID'], axis = 1))
from tensorflow.keras.callbacks import EarlyStopping
es_callback = EarlyStopping(monitor="val_precision", patience=200, restore_best_weights=True)
history = model.fit(
train_gen,
epochs=200,
validation_data=val_gen,
verbose=2,
shuffle=False,
callbacks=[es_callback])
Всего у меня 271045 ребер и 16354 узла, включая 12265 обучающих узлов. Проблема, которую я получаю, - это несоответствие формы от Кераса. В нем говорится следующее. Я подозреваю, что это связано с вставкой нескольких столбцов в качестве целевых столбцов. Я пробовал модель, используя только один столбец (класс), и она работала отлично.
InvalidArgumentError: Incompatible shapes: [1,12265] vs. [1,233035]
[[node LogicalAnd_1 (defined at tmp/ipykernel_52/2745570431.py:7) ]] [Op:__inference_train_function_1405]
Стоит отметить, что 233035 = 12265 (количество узлов поезда) умножить на 19 (количество классов). Любая идея о том, что здесь происходит не так?
1 ответ
Я понял проблему.
Это была ошибка новичка, я инициализировал слой Dense Classification с 1 единицей вместо 19 (количество классов).
Мне просто нужно было исправить эту строку:
predictions = layers.Dense(units = 19, activation="sigmoid")(x_out)
Хорошего дня!