使用Keras构建具有自定义结构和层次的图卷积神经网络(GCNN)( 三 )


在前面的模型中 , 我们定义了一个具有并行层的网络 。
# Model 3: neural network with graph convolutional layertf_set_seed(1102)np_seed(1102)m3_input_layer = Input(shape=input_shape)m3_dense_layer = Dense(32, activation='relu')(m3_input_layer)m3_gc_layer = GraphConv(16, A=A, activation='relu')(m3_input_layer)m3_merged_layer = Concatenate()([m3_dense_layer, m3_gc_layer])m3_final_layer = Dense(output_classes, activation='softmax')(m3_merged_layer)model3 = Model(inputs=m3_input_layer, outputs=m3_final_layer, name="Model_3")model3.save_weights("model3_initial_weights.h5")model3.summary()plot_model(model3, 'model3.png', show_shapes=True)它看起来像以前的模型 , 但有一层是卷积的:每个实例的固有特征与从邻域计算出的聚合特征连接在了一起 。
使用Keras构建具有自定义结构和层次的图卷积神经网络(GCNN)文章插图
在编写这一模型时 , 需要进一步注意 。 由于卷积层需要整个邻接矩阵 , 所以我们需要传递整个特征矩阵(带标签的和没带标签的实例) , 但是模型应该只训练带标签的实例 。 因此 , 我们定义了一个自定义的损失函数 , 其中稀疏分类cossentropy只计算在标记的实例 。 此外 , 我们将未标记实例的标签随机化 , 以确保在训练期间不会使用它们 。
# Testing model 3tf_set_seed(1102)np_seed(1102)acc_model3 = []for i in range(iterations):mask = choice([True, False], size=data.shape[0], replace=True, p=[labeled_portion, 1-labeled_portion])unlabeled_data_labels = labels[~mask]# Randomize the labels of unlabeled instancesmasked_labels = labels.copy()masked_labels[~mask] = choice(range(7), size=sum(~mask), replace=True)model3.load_weights("model3_initial_weights.h5")model3.compile(optimizer='adam',loss=lambda y_true, y_pred: SparseCategoricalCrossentropy(from_logits=False)(y_true[mask], y_pred[mask]),metrics=['accuracy'])model3.fit(data, masked_labels, epochs=epochs, batch_size=batch_size, shuffle=False, verbose=0)predictions = argmax(model3.predict(data, batch_size=batch_size), axis=1)acc_model3.append(sum(predictions[~mask] == unlabeled_data_labels) / len(unlabeled_data_labels) * 100)print("\nAverage accuracy on unlabeled set:", mean(acc_model3), "%")这个实验的平均准确率为63%(+3) 。
有趣的是 , 在最后这个实验中 , 我们基本上是在用graphCNN执行半监督学习:来自未标记实例的信息和来自标记实例的信息一起被用来构建一个基于图的转导模型 。
参考网站:##作者:Shuyi Yang
【使用Keras构建具有自定义结构和层次的图卷积神经网络(GCNN)】deephub翻译组:钱三一