рдЕрдВрджрд░ рд╕реЗ рдорд╕реНрддрд┐рд╖реНрдХ (рдХреГрддреНрд░рд┐рдо рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдореЙрдбрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреИрдЯрд░реНрди рдХреЗ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХрд╛ рджреГрд╢реНрдп)

рдкрд░рд┐рдЪрдп


рдЖрд░реНрдЯрд┐рдХрд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдЖрд░реНрдЯрд┐рдлрд┐рд╢рд┐рдпрд▓ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ ( ANN) рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕ рд╕рд╡рд╛рд▓ рдкрд░ рдХрднреА рджрд┐рд▓рдЪрд╕реНрдкреА рд░рдЦрддреЗ рд╣реИрдВред рдЕрдм рд▓рдЧрднрдЧ рд╣рд░ рдХреЛрдИ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рддреИрдпрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдПрдПрдирдПрди рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╡рд╕реНрддреБ ( рдкреИрдЯрд░реНрди ) рдмрд┐рд▓реНрдХреБрд▓ рдХреИрд╕реЗ рджрд┐рдЦрддреА рд╣реИ, рдПрдПрдирдПрди рдХреА рдкрд░рддреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реБрдП, рдХреЗрд░рд╕ рдРрдб рдХреЗ рд╕рд╛рде рдЯреЗрдиреНрд╕рд░рдлреНрд▓реЛ рдбреАрдк рд▓рд░реНрдирд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдХрд╕рд┐рдд рдФрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ ред

рдкреНрд░рдпреБрдХреНрдд рд╕реЙрдлреНрдЯрд╡реЗрдпрд░


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдШрдЯрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг):


рдиреЗрдЯрд╡рд░реНрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рдЦреАрдВрдЪрдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдЯреВрд▓ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЗрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд╡рд┐рдзрд┐ рдореЗрдВ

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 

рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐рдпрд╛рдБ:

  • def PLOT_PATTERN_PROCCESS (рдореЙрдбрд▓, рдкреИрдЯрд░реНрди, FOLDER_TO_SAVE, рдЧреНрд░рд┐рдб_рд╕рд╛рдЗрдЬрд╝ = (3, 3), limit_size_layer = (15, 15), PLOT_MODE = 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 

рдПрдПрдирдПрди рдореЙрдбрд▓ рдХреА рдкрд░рддреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рд░реА-рдмрд╛рд░реА рд╕реЗ, рдЪрд░

 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 

    рдмрдбрд╝рд╛ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдЪрд┐рддреНрд░реЛрдВ рдХрд╛ рдЖрдХрд╛рд░ рдЫреЛрдЯрд╛ рдФрд░ рдЕрд╕рдВрдХреНрд░рд╛рдордХ рд╣реЛрдЧрд╛
  • рдпрджрд┐ рдЖрдк рдбрд╛рдпрдирд╛рдорд┐рдХреНрд╕ (рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдпрд╛ рдкреИрдЯрд░реНрди рдХреЗ рдПрдХ рдкреИрдХреЗрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ) рдореЗрдВ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдбрд╝реЗ рдЖрдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХреА рдЧрдИ рд░реИрдо рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреАрд╕реА рдкрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрд░реЗ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ , рдФрд░ рд╕рднреА рдкреИрдЯрд░реНрди рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рдмрджрд▓ рджреЗрдВред

рдЕ рдЫрд╛!

Source: https://habr.com/ru/post/hi438972/


All Articles