使用keras模型可视化 plot_model
使用keras模型可视化 plot_modelKeras中提供了一个神经网络可视化的函数plot_model,并可以将可视化结果以图片的形式保存在本地:keras中文文档from keras.utils import plot_modelplot_model(model, to_file='model.png')# 接收4个可选择的参数# show_shapes (默认为 Fals...
·
使用keras模型可视化 plot_model
Keras中提供了一个神经网络可视化的函数plot_model,并可以将可视化结果以图片的形式保存在本地:
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)
参考
更多推荐
已为社区贡献1条内容
所有评论(0)