使用keras模型可视化 plot_model

Keras中提供了一个神经网络可视化的函数plot_model,并可以将可视化结果以图片的形式保存在本地:

keras中文文档

from keras.utils import plot_model
plot_model(model, to_file='model.png')

# 接收4个可选择的参数
# show_shapes (默认为 False) 控制是否在图中输出各层的尺寸。
# show_layer_names (默认为 True) 控制是否在图中显示每一层的名字。
# expand_dim(默认为 False)控制是否将嵌套模型扩展为图形中的聚类。
# dpi(默认为 96)控制图像 dpi。

在使用过程中,会出现如下错误

在这里插入图片描述

我们安装pydot这个包

在这里插入图片描述

安装好了之后,又会报如下错误
在这里插入图片描述
我们可以根据给的链接去下载GraphViz

在这里插入图片描述

安装好了之后,我们设置环境变量

在这里插入图片描述

如果还是报上面的错误,建议重启一下IDE

在这里插入图片描述

也就是将我们的模型以图片的形式保存下来。




某一层卷积层可视化

from keras import backend as K

    layer_1 = K.function([model.layers[0].input], [
        model.layers[2].output])  # 第一个 model.layers[0],不修改,表示输入数据;第二个model.layers[you wanted],修改为你需要输出的层数的编号
    f1 = layer_1([X_train[:1]])[0]  # 只修改inpu_image,[:1]代表一张图片
    # 第一层卷积后的特征图展示,输出是(样本个数,特征图尺寸长,特征图尺寸宽,特征图个数)
    for _ in range(32):
        show_img = f1[:, :, :, _]			# 样本个数,特征图尺寸长,特征图尺寸宽,特征图个数
        print('show_img',show_img.shape)    # show_img (1, 22, 22)
        show_img.shape = [22, 22]			# 跟show_img的形状一直
        plt.subplot(4, 8, _ + 1)
        plt.imshow(show_img, cmap='gray')
        plt.axis('off')
    plt.plot()

在这里插入图片描述

当然get_layer()包括了name和index两个参数。最后通过遍历当前卷积层的所有特征映射,将每一个都展示出来。




from keras.models import Model
def get_row_col(num_pic):
    squr = num_pic ** 0.5   # 特征图开方
    row = round(squr)       # 四舍五入
    col = row + 1 if squr - row > 0 else row
    return row, col


def visualize_feature_map(img_batch):
    feature_map = np.squeeze(img_batch, axis=0)
    print(feature_map.shape)

    feature_map_combination = []
    plt.figure()

    num_pic = feature_map.shape[2]
    row, col = get_row_col(num_pic)     # num_pic特征图的个数
    print('num_pic',num_pic)
    print('row,col',row,col)
    for i in range(0, num_pic):
        feature_map_split = feature_map[:, :, i]
        feature_map_combination.append(feature_map_split)
        plt.subplot(row, col, i + 1)
        plt.imshow(feature_map_split)
        plt.axis('off')
        # plt.title('feature_map_{}'.format(i))

    plt.savefig('feature_map.png')
    plt.show()

    # 各个特征图按1:1 叠加
    feature_map_sum = sum(ele for ele in feature_map_combination)
    plt.imshow(feature_map_sum)
    plt.savefig("feature_map_sum.png")

if __name__ == '__main__':
	# model 是你定义的网络
	# 相当于截取到这里,后续的不输出
	model = Model(inputs = model.input,outputs = model.get_layer('conv2d_3').output)
    for i in range(len(model.layers)):
        print(model.get_layer(index=i).output)  # 打印层名
    # X_train[0]是你的输入数据
    img_batch = np.expand_dims(X_train[0], axis=0)
    conv_img = model.predict(img_batch)  # conv_img 卷积结果
    visualize_feature_map(conv_img)

在这里插入图片描述
在这里插入图片描述




参考

卷积神经网络特征图可视化(自定义网络和VGG网络)

Logo

鸿蒙生态一站式服务平台。

更多推荐