从内部大脑(通过人工神经网络模型可视化模式的通过)

引言


本文适用于那些对人工神经网络 ANN)内部正在发生的问题感兴趣的人。 现在,几乎每个人都可以使用大多数编程语言中可用的现成库来开发自己的ANN。 在本文中,我将尝试展示对象( Pattern )在ANN的各个层中的外观如何,并使用Tensorflow深度学习Keras插件进行开发和编译。

二手软件


需要以下组件(我为案例指定的版本):

  • 张量流1.10.0
  • keras 2.2.4
  • matplotlib 2.2.0
  • 模运算
  • numpy1.14.3

也可以绘制网络体系结构,但是为此,必须安装可视化工具(在我的情况下使用keras )和方法中

PLOT_PATTERN_PROCCESS(...) 

建立

PLOT_MODEL =真


 def PLOT_PATTERN_PROCCESS(model, pattern, FOLDER_TO_SAVE, grid_size=(3, 3), limit_size_layer=(15, 15), PLOT_MODEL=True): 

图片

主要思想


有必要选择一种模式(我们将观察的通道),选择它之后,网络被分为张量层。 在从第二层到最后一层的循环中,创建了一个新的网络,其中输出是循环中该层的编号,并且跳过该模式,结果是网络输出处的n维数组。

实作


连接库

 from keras.models import * from keras.layers import * import matplotlib.pyplot as plt import os import numpy as np 

使用的方法:

  • 定义PLOT_PATTERN_PROCCESS(模型,图案,FOLDER_TO_SAVE,grid_size =(3、3),limit_size_layer =(15、15),PLOT_MODEL = True):
     def PLOT_PATTERN_PROCCESS(model, pattern, FOLDER_TO_SAVE, grid_size=(3, 3), limit_size_layer=(15, 15), PLOT_MODEL=True): """ :param model:   keras :type model: Sequential :param pattern:  ,       :type pattern: np.array :param FOLDER_TO_SAVE:       :type FOLDER_TO_SAVE: str :param grid_size:     :type grid_size: tuple :param limit_size_layer:      :type limit_size_layer: tuple :param PLOT_MODEL:    :type PLOT_MODEL: PLOT_MODEL """ SAVE_AR_LIST = [] for num_layer in range(1, len(model.layers)): LO = model.layers[num_layer].output _model = Model(inputs=model.input, outputs=LO) if ( len(_model.output_shape) == 3 and _model.output_shape[1] > limit_size_layer[0] and _model.output_shape[2] > limit_size_layer[1] ): _output = _model.predict(pattern)[0] SAVE_AR_LIST.append( [ num_layer, model.layers[num_layer].name, _output.tolist() ] ) ### PIC_NUM = 0 while len(SAVE_AR_LIST) > 0: fig, axs = plt.subplots(nrows=grid_size[0], ncols=grid_size[1], figsize=(10, 10), tight_layout=True) xmin, xmax = plt.xlim() ymin, ymax = plt.ylim() for ax in axs.flat: [num_layer, layer_name, ar] = SAVE_AR_LIST.pop(0) ax.imshow(np.array(ar), cmap='viridis', extent=(xmin, xmax, ymin, ymax)) ax.set_title(layer_name + " " + str(np.array(ar).shape)) if len(SAVE_AR_LIST) == 0: break # plt.show() plt.savefig(os.path.join(FOLDER_TO_SAVE, str(PIC_NUM) + '.png'), fmt='png') plt.close(fig) PIC_NUM += 1 ### if PLOT_MODEL: from keras.utils.vis_utils import plot_model plot_model( model=model, to_file=os.path.join(FOLDER_TO_SAVE, model.name + " neural network architecture.png"), show_shapes=True, show_layer_names=True ) ### 

  • def build_model(IN_SHAPE = 50,CLASSES = 5)->顺序的:
     def build_model(IN_SHAPE=50,CLASSES=5) -> Sequential: inputs_LAYER0 = Input(shape=(IN_SHAPE,IN_SHAPE)) Dense_2_2 = Dense(75, activation='relu')(inputs_LAYER0) Dense_2_3 = Dense(50, activation='relu', name="my_dense")(Dense_2_2) Dense_2_4 = Dense(25, activation='relu')(Dense_2_3) Dense_2_5 = Dense(10, activation='relu')(Dense_2_4) flat_f_0 = Flatten()(Dense_2_5) final_layer= Dense(CLASSES, activation='softmax')(flat_f_0) # model = Model(input=inputs_LAYER0, output=final_layer, name="simple model") model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) model.summary() return model 


程式码

 model_ = build_model() pattern = np.random.sample((1,50,50)) os.makedirs("PLOT_PATTERN_PROCCESS") PLOT_PATTERN_PROCCESS( model = model_, pattern = pattern, FOLDER_TO_SAVE = "PLOT_PATTERN_PROCCESS", PLOT_MODEL=False, grid_size=(2, 2) ) 

程序说明


方法

 build_model() 

顺序格式返回一个ANN模型,该模型旨在将某些东西分为5类。

model.summary()
 _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) (None, 50, 50) 0 _________________________________________________________________ dense_1 (Dense) (None, 50, 75) 3825 _________________________________________________________________ my_dense (Dense) (None, 50, 50) 3800 _________________________________________________________________ dense_2 (Dense) (None, 50, 25) 1275 _________________________________________________________________ dense_3 (Dense) (None, 50, 10) 260 _________________________________________________________________ flatten_1 (Flatten) (None, 500) 0 _________________________________________________________________ dense_4 (Dense) (None, 5) 2505 ================================================================= Total params: 11,665 Trainable params: 11,665 Non-trainable params: 0 _________________________________________________________________ 


从体系结构中可以看到,模式是大小为50x50的数组。 可变的

 pattern 

并且有一个可观察的物体。
接下来,创建一个目录

 os.makedirs("PLOT_PATTERN_PROCCESS") 

将保存整个结果。

方法说明PLOT_PATTERN_PROCCESS


我已经描述了上面方法的含义,但是重要的是我们并不需要所有的图层,因为某些图层的输出无法显示,或者不会提供任何信息。
获取输出模式发生在这里:

 _output = _model.predict(pattern)[0] 

在此实现中,可以显示尺寸不小于参数的二维输出模式

 limit_size_layer 

在ANN模型的各层之间交替显示

 SAVE_AR_LIST 
逐渐填充数据:

  1. 层数

     num_layer 
  2. 图层名称

     model.layers[num_layer].name 
  3. 输出二维数组

      _output.tolist() 

逐渐排除以下一项结果

 SAVE_AR_LIST 

并将其放在画布单元格中

 ax.imshow(np.array(ar), cmap='viridis', extent=(xmin, xmax, ymin, ymax)) 

结果是一个文件(0.png)

图片

推荐建议


  • 设置图层名称,如下所示:

     Dense_2_3 = Dense(50, activation='relu', name="my_dense")(Dense_2_2) 

    与神经体系结构进行评估和比较时,这非常方便。
  • 使用这种方法,有趣的是观察时代到来的时代,通过网络时模式如何变化
  • 不要安装网格

     grid_size 

    大因为 所显示图像的尺寸将很小且无用
  • 如果您观察动态变化的过程(在学习或传递一组模式时),那么我们已经在谈论大型信息。 为了减少应用程序占用的RAM,最好将数组以JSON格式保存到PC上的文件中,例如,在处理所有模式之后,逐个循环访问文件并将其转换为图像

祝你好运!

Source: https://habr.com/ru/post/zh-CN438972/


All Articles