рдЯреЗрдиреНрд╕рд░рдлреНрд▓реЛ рдореЗрдВ рдХреЗрд░рд╕ рдлрдВрдХреНрд╢рдирд▓ рдПрдкреАрдЖрдИ



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

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


рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрдкреАрдЖрдИ рдЖрдкрдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдПрдкреАрдЖрдИ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ; рдпрд╣ рдЧреИрд░-рд░реИрдЦрд┐рдХ рдЯреЛрдкреЛрд▓реЙрдЬреА рд╡рд╛рд▓реЗ рдореЙрдбрд▓, рд╕рд╛рдорд╛рдиреНрдп рдкрд░рддреЛрдВ рд╡рд╛рд▓реЗ рдореЙрдбрд▓ рдФрд░ рдХрдИ рдЗрдирдкреБрдЯ рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╡рд╛рд▓реЗ рдореЙрдбрд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рдЧрд╣рди рд╢рд┐рдХреНрд╖рдг рдореЙрдбрд▓ рдЖрдорддреМрд░ рдкрд░ рдкрд░рддреЛрдВ рдХрд╛ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдЪрдХреНрд░реАрдп рдЧреНрд░рд╛рдл (рдбреАрдПрдЬреА) рд╣реИ

рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрдкреАрдЖрдИ рдкрд░рддреЛрдВ рдХреА рд╕рд╛рдЬрд┐рд╢ рд░рдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЙрдбрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

(рдЗрдирдкреБрдЯ: 784-рдЖрдпрд╛рдореА рд╡реЗрдХреНрдЯрд░)
тЖз
[рдШрдиреА рдкрд░рдд (64 рддрддреНрд╡, рд░рд┐рд▓реЗ рдХреА рд╕рдХреНрд░рд┐рдпрддрд╛)]
тЖз
[рдШрдиреА рдкрд░рдд (64 рддрддреНрд╡, рд░рд┐рд▓реЗ рдХреА рд╕рдХреНрд░рд┐рдпрддрд╛)]
тЖз
[рд╕рдШрди рдкрд░рдд (10 рддрддреНрд╡, рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рдХреА рд╕рдХреНрд░рд┐рдпрддрд╛)]
тЖз
(рдЖрдЙрдЯрдкреБрдЯ: 10 рд╕реЗ рдЕрдзрд┐рдХ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕рдВрднрд╛рд╡реНрдпрддрд╛ рд╡рд┐рддрд░рдг)
рдпрд╣ 3 рдкрд░рддреЛрдВ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЧреНрд░рд╛рдл рд╣реИред

рдлрдВрдХреНрд╢рдирд▓ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдореЙрдбрд▓ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдЗрдирдкреБрдЯ рдиреЛрдб рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

from tensorflow import keras inputs = keras.Input(shape=(784,)) 

рдпрд╣рд╛рдВ рд╣рдо рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХреЗ рдЖрдпрд╛рдо рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ: 784-рдЖрдпрд╛рдореА рд╡реИрдХреНрдЯрд░ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рд╣рдореЗрд╢рд╛ рдЫреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИ, рд╣рдо рдХреЗрд╡рд▓ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рдЖрдпрд╛рдо рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫрд┐рдд рдЖрдХрд╛рд░ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (32, 32, 3) `, рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

 img_inputs = keras.Input(shape=(32, 32, 3)) 

inputs рд░рд┐рдЯрд░реНрди рдореЗрдВ рдЖрдХрд╛рд░ рдФрд░ рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЕрдкрдиреЗ рдореЙрдбрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ:

 inputs.shape 

 TensorShape([None, 784]) 

 inputs.dtype 

 tf.float32 

рдЖрдк рдЗрд╕ inputs рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдкрд░рдд рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкрд░рдд рдЧреНрд░рд╛рдл рдореЗрдВ рдПрдХ рдирдпрд╛ рдиреЛрдб рдмрдирд╛рддреЗ рд╣реИрдВ:

 from tensorflow.keras import layers dense = layers.Dense(64, activation='relu') x = dense(inputs) 

"рдПрдХ рдкрд░рдд рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛" рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдкрд░рдд рдореЗрдВ "рдЗрдирдкреБрдЯ" рд╕реЗ рдПрдХ рддреАрд░ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИред рд╣рдо dense рдкрд░рдд рдХреЗ рдЗрдирдкреБрдЯ рдХреЛ "рдкрд╛рд╕" рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ x рдорд┐рд▓рддрд╛ рд╣реИред

рдЖрдЗрдП рд╣рдорд╛рд░реА рдкрд░рдд рдЧреНрд░рд╛рдл рдореЗрдВ рдХреБрдЫ рдФрд░ рдкрд░рддреЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

 x = layers.Dense(64, activation='relu')(x) outputs = layers.Dense(10, activation='softmax')(x) 

рдЕрдм рд╣рдо рд▓реЗрдпрд░ рдЧреНрд░рд╛рдл рдореЗрдВ рдЗрд╕рдХреЗ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдПрдХ Model рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 model = keras.Model(inputs=inputs, outputs=outputs) 

рдЖрдЗрдП рдлрд┐рд░ рд╕реЗ рджреЗрдЦреЗрдВ рдкреВрд░реА рдореЙрдбрд▓ рдкрд░рд┐рднрд╛рд╖рд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛:

 inputs = keras.Input(shape=(784,), name='img') x = layers.Dense(64, activation='relu')(inputs) x = layers.Dense(64, activation='relu')(x) outputs = layers.Dense(10, activation='softmax')(x) model = keras.Model(inputs=inputs, outputs=outputs, name='mnist_model') 

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдореЙрдбрд▓ рд╕рд╛рд░рд╛рдВрд╢ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

 model.summary() 

 Model: "mnist_model" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= img (InputLayer) [(None, 784)] 0 _________________________________________________________________ dense_3 (Dense) (None, 64) 50240 _________________________________________________________________ dense_4 (Dense) (None, 64) 4160 _________________________________________________________________ dense_5 (Dense) (None, 10) 650 ================================================================= Total params: 55,050 Trainable params: 55,050 Non-trainable params: 0 _________________________________________________________________ 

рд╣рдо рдореЙрдбрд▓ рдХреЛ рдПрдХ рдЧреНрд░рд╛рдл рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 keras.utils.plot_model(model, 'my_first_model.png') 

рдЫрд╡рд┐

рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдЧреНрд░рд╛рдл рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рдд рдХреЗ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдЖрдпрд╛рдореЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

 keras.utils.plot_model(model, 'my_first_model_with_shape_info.png', show_shapes=True) 

рдЫрд╡рд┐

рдпрд╣ рдЫрд╡рд┐ рдФрд░ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдХреЛрдб рд╕рдорд╛рди рд╣реИред рдХреЛрдб рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдПрд░реЛ рдХреЛ рдХреЗрд╡рд▓ рдХреЙрд▓ рдСрдкрд░реЗрд╢рдВрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

"рд▓реЗрдпрд░ рдЧреНрд░рд╛рдл" рдЧрд╣рд░реА рд╕реАрдЦрдиреЗ рдХреЗ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╣рдЬ рдорд╛рдирд╕рд┐рдХ рдЫрд╡рд┐ рд╣реИ, рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрдкреАрдЖрдИ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдорд╛рдирд╕рд┐рдХ рдЫрд╡рд┐ рдХреЛ рдмрд╛рд░реАрдХреА рд╕реЗ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

рдкреНрд░рд╢рд┐рдХреНрд╖рдг, рдореВрд▓реНрдпрд╛рдВрдХрди рдФрд░ рдирд┐рд╖реНрдХрд░реНрд╖


рд╕реЗрдХреНрд╢рдирд▓ рдореЙрдбрд▓ рдХреА рддрд░рд╣ рд╣реА рдлрдВрдХреНрд╢рдирд▓ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдП рдЧрдП рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рд╕реАрдЦрдирд╛, рдореВрд▓реНрдпрд╛рдВрдХрди рдФрд░ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рдирд╛ред

рдПрдХ рддреНрд╡рд░рд┐рдд рдбреЗрдореЛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдпрд╣рд╛рдВ рд╣рдо MNIST рдЫрд╡рд┐ рдбреЗрдЯрд╛рд╕реЗрдЯ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╡реИрдХреНрдЯрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдбреЗрдЯрд╛ рдкрд░ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдкрд░реАрдХреНрд╖рдг рдирдореВрдиреЗ рдкрд░ рдХрд╛рдо рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддреЗ рд╣реБрдП), рдФрд░ рдЕрдВрдд рдореЗрдВ рд╣рдо рдкрд░реАрдХреНрд╖рдг рдореЙрдбрд▓ рдкрд░ рдЕрдкрдиреЗ рдореЙрдбрд▓ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддреЗ рд╣реИрдВ:

 (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data() x_train = x_train.reshape(60000, 784).astype('float32') / 255 x_test = x_test.reshape(10000, 784).astype('float32') / 255 model.compile(loss='sparse_categorical_crossentropy', optimizer=keras.optimizers.RMSprop(), metrics=['accuracy']) history = model.fit(x_train, y_train, batch_size=64, epochs=5, validation_split=0.2) test_scores = model.evaluate(x_test, y_test, verbose=2) print('Test loss:', test_scores[0]) print('Test accuracy:', test_scores[1]) 

рдмрдЪрдд рдФрд░ рд╕реАрд░рд┐рдпрд▓ рдХрд░рдирд╛


рдХрд╛рд░реНрдпрд╛рддреНрдордХ API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдП рдЧрдП рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬрдирд╛ рдФрд░ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдирд╛ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдореЙрдбрд▓ рдХреЗ рд╕рдорд╛рди рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдлрд╝рдВрдХреНрд╢рдирд▓ рдореЙрдбрд▓ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХрд╛ рдорд╛рдирдХ рддрд░реАрдХрд╛ model.save( ) рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдкреВрд░реЗ рдореЙрдбрд▓ рдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЖрдк рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЙрд╕реА рдореЙрдбрд▓ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрд╕ рдХреЛрдб рддрдХ рдкрд╣реБрдВрдЪ рди рд╣реЛ рдЬреЛ рдореЙрдбрд▓ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реЛред

рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

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

 model.save('path_to_my_model.h5') del model # Recreate the exact same model purely from the file: model = keras.models.load_model('path_to_my_model.h5') 

рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдореЙрдбрд▓реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд▓реЗрдпрд░ рдЧреНрд░рд╛рдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдлрд╝рдВрдХреНрд╢рдирд▓ рдПрдкреАрдЖрдИ рдореЗрдВ, рд▓реЗрдпрд░ рдЧреНрд░рд╛рдл рдореЗрдВ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдбреЗрдЯрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдореЙрдбрд▓ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рд╕рд┐рдВрдЧрд▓ рд▓реЗрдпрд░ рдЧреНрд░рд╛рдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рджреЛ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдкрд░рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
рдПрдХ (encoder) рдореЙрдбрд▓ рдЬреЛ рдЗрдирдкреБрдЯ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ 16-рдЖрдпрд╛рдореА рд╡реИрдХреНрдЯрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдВрдб-рдЯреВ-рдПрдВрдб (autoencoder) рдореЙрдбрд▓ рд╣реИред

 encoder_input = keras.Input(shape=(28, 28, 1), name='img') x = layers.Conv2D(16, 3, activation='relu')(encoder_input) x = layers.Conv2D(32, 3, activation='relu')(x) x = layers.MaxPooling2D(3)(x) x = layers.Conv2D(32, 3, activation='relu')(x) x = layers.Conv2D(16, 3, activation='relu')(x) encoder_output = layers.GlobalMaxPooling2D()(x) encoder = keras.Model(encoder_input, encoder_output, name='encoder') encoder.summary() x = layers.Reshape((4, 4, 1))(encoder_output) x = layers.Conv2DTranspose(16, 3, activation='relu')(x) x = layers.Conv2DTranspose(32, 3, activation='relu')(x) x = layers.UpSampling2D(3)(x) x = layers.Conv2DTranspose(16, 3, activation='relu')(x) decoder_output = layers.Conv2DTranspose(1, 3, activation='relu')(x) autoencoder = keras.Model(encoder_input, decoder_output, name='autoencoder') autoencoder.summary() 

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рд╕рдЦреНрддреА рд╕реЗ рд╕рдордорд┐рдд рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╣рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдбреЗрдЯрд╛ рдХрд╛ рдЖрдпрд╛рдо рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ (28, 28, 1) ред Conv2D рд▓реЗрдпрд░, Conv2D рд▓реЗрдпрд░ рдХреЗ Conv2D рд╣реИ, рдФрд░ MaxPooling2D рд▓реЗрдпрд░ рд╡рд╛рдкрд╕ MaxPooling2D рд▓реЗрдпрд░ рдкрд░ рдЬрд╛рдПрдЧреАред

рдореЙрдбрд▓ рдХреЛ рдкрд░рдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ


рдЖрдк рдХрд┐рд╕реА рднреА рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдПрдХ рдкрд░рдд рдереА, рдЗрд╕реЗ Input рдкрд░ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкрд░рдд рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ рдореЙрдбрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ, рдЖрдк рди рдХреЗрд╡рд▓ рдЗрд╕рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдк рдЗрд╕рдХреЗ рд╡рдЬрди рдХрд╛ рднреА рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рдПрдХ рдСрдЯреЛ-рдПрдирдХреЛрдбрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХ рдФрд░ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рдЬрдм рдПрдХ рдПрдирдХреЛрдбрд░ рдореЙрдбрд▓, рдПрдХ рдбрд┐рдХреЛрдбрд░ рдореЙрдбрд▓ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡реЗ рдПрдХ рдСрдЯреЛ-рдПрдирдХреЛрдбрд░ рдореЙрдбрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдХреЙрд▓ рдореЗрдВ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ:

 encoder_input = keras.Input(shape=(28, 28, 1), name='original_img') x = layers.Conv2D(16, 3, activation='relu')(encoder_input) x = layers.Conv2D(32, 3, activation='relu')(x) x = layers.MaxPooling2D(3)(x) x = layers.Conv2D(32, 3, activation='relu')(x) x = layers.Conv2D(16, 3, activation='relu')(x) encoder_output = layers.GlobalMaxPooling2D()(x) encoder = keras.Model(encoder_input, encoder_output, name='encoder') encoder.summary() decoder_input = keras.Input(shape=(16,), name='encoded_img') x = layers.Reshape((4, 4, 1))(decoder_input) x = layers.Conv2DTranspose(16, 3, activation='relu')(x) x = layers.Conv2DTranspose(32, 3, activation='relu')(x) x = layers.UpSampling2D(3)(x) x = layers.Conv2DTranspose(16, 3, activation='relu')(x) decoder_output = layers.Conv2DTranspose(1, 3, activation='relu')(x) decoder = keras.Model(decoder_input, decoder_output, name='decoder') decoder.summary() autoencoder_input = keras.Input(shape=(28, 28, 1), name='img') encoded_img = encoder(autoencoder_input) decoded_img = decoder(encoded_img) autoencoder = keras.Model(autoencoder_input, decoded_img, name='autoencoder') autoencoder.summary() 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдореЙрдбрд▓ рдиреЗрд╕реНрдЯреЗрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдПрдХ рдореЙрдбрд▓ рдореЗрдВ рдПрдХ рд╕рдмрдореЙрдбрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЪреВрдВрдХрд┐ рдореЙрдбрд▓ рдХреЛ рдПрдХ рдкрд░рдд рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред

рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣рд╛рдВ рдПрдХ рдореЙрдбрд▓ рдореЗрдВ рдПрдХ рдореЙрдбрд▓ рдХреЗ рд╕реЗрдЯ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЙрдирдХреЗ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдХреЛ рдФрд╕рдд рдХрд░рддрд╛ рд╣реИ:

 def get_model(): inputs = keras.Input(shape=(128,)) outputs = layers.Dense(1, activation='sigmoid')(inputs) return keras.Model(inputs, outputs) model1 = get_model() model2 = get_model() model3 = get_model() inputs = keras.Input(shape=(128,)) y1 = model1(inputs) y2 = model2(inputs) y3 = model3(inputs) outputs = layers.average([y1, y2, y3]) ensemble_model = keras.Model(inputs=inputs, outputs=outputs) 


рдЬрдЯрд┐рд▓ рдЧреНрд░рд╛рдл рдЯреЛрдкреЛрд▓реЙрдЬреА рдореЗрдВ рд╣реЗрд░рдлреЗрд░


рдХрдИ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рдореЙрдбрд▓


рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрдкреАрдЖрдИ рдХрдИ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╣реЗрд░рдлреЗрд░ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИред

рдорд╛рди рд▓реАрдЬрд┐рдП рдЖрдк рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рдЖрд╡реЗрджрдиреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рд╣реА рд╡рд┐рднрд╛рдЧ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред

рдЖрдкрдХреЗ рдореЙрдбрд▓ рдореЗрдВ 3 рдЗрдирдкреБрдЯ рд╣реЛрдВрдЧреЗ:

  • рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИрдбрд░ (рдкрд╛рда рдЗрдирдкреБрдЯ)
  • рдЖрд╡реЗрджрди рдХреА рдкрд╛рда рд╕рд╛рдордЧреНрд░реА (рдкрд╛рда рдЗрдирдкреБрдЯ)
  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдХреЛрдИ рднреА рдЯреИрдЧ (рд╢реНрд░реЗрдгреАрдмрджреНрдз рдЗрдирдкреБрдЯ)

рдореЙрдбрд▓ рдореЗрдВ 2 рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрдВрдЧреЗ:

  • 0 рдФрд░ 1 (рд╕реНрдХреЗрд▓рд░ рд╕рд┐рдЧреНрдореЙрдЗрдб рдЖрдЙрдЯрдкреБрдЯ) рдХреЗ рдмреАрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕реНрдХреЛрд░
  • рдЬрд┐рд╕ рд╡рд┐рднрд╛рдЧ рдХреЛ рдЖрд╡реЗрджрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП (рдХрдИ рд╡рд┐рднрд╛рдЧреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рдЖрдЙрдЯрдкреБрдЯ)

рдЪрд▓реЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдИ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдПрдХ рдореЙрдбрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВред

 num_tags = 12 #     num_words = 10000 #         num_departments = 4 #     title_input = keras.Input(shape=(None,), name='title') #      body_input = keras.Input(shape=(None,), name='body') #      tags_input = keras.Input(shape=(num_tags,), name='tags') #    `num_tags` #      64-  title_features = layers.Embedding(num_words, 64)(title_input) #      64-  body_features = layers.Embedding(num_words, 64)(body_input) #        128-  title_features = layers.LSTM(128)(title_features) #        32-  body_features = layers.LSTM(32)(body_features) #          x = layers.concatenate([title_features, body_features, tags_input]) #         priority_pred = layers.Dense(1, activation='sigmoid', name='priority')(x) #       department_pred = layers.Dense(num_departments, activation='softmax', name='department')(x) #   ,     model = keras.Model(inputs=[title_input, body_input, tags_input], outputs=[priority_pred, department_pred]) 

рдЖрдЗрдП рдПрдХ рдореЙрдбрд▓ рдЧреНрд░рд╛рдл рдмрдирд╛рдПрдВ:

 keras.utils.plot_model(model, 'multi_input_and_output_model.png', show_shapes=True) 



рдЗрд╕ рдореЙрдбрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣рд╛рдирд┐ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рд▓рд░реНрдирд┐рдВрдЧ рдлрдВрдХреНрд╢рди рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рдЬрд╝рди рднреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рд╕рдордЧреНрд░ рд╢рд┐рдХреНрд╖рдг рд╣рд╛рдирд┐ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЙрдирдХреЗ рдпреЛрдЧрджрд╛рди рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

 model.compile(optimizer=keras.optimizers.RMSprop(1e-3), loss=['binary_crossentropy', 'categorical_crossentropy'], loss_weights=[1., 0.2]) 

рдЪреВрдБрдХрд┐ рд╣рдордиреЗ рдЕрдкрдиреА рдЖрдЙрдЯрдкреБрдЯ рд▓реЗрдпрд░реНрд╕ рдХреЛ рдирд╛рдо рджрд┐рдпрд╛ рдерд╛, рд╣рдо рдиреБрдХрд╕рд╛рди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 model.compile(optimizer=keras.optimizers.RMSprop(1e-3), loss={'priority': 'binary_crossentropy', 'department': 'categorical_crossentropy'}, loss_weights=[1., 0.2]) 

рд╣рдо рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдФрд░ рд▓реЗрдмрд▓ рдХреЗ Numpy рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдкрд╛рд╕ рдХрд░рдХреЗ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 import numpy as np # Dummy input data title_data = np.random.randint(num_words, size=(1280, 10)) body_data = np.random.randint(num_words, size=(1280, 100)) tags_data = np.random.randint(2, size=(1280, num_tags)).astype('float32') # Dummy target data priority_targets = np.random.random(size=(1280, 1)) dept_targets = np.random.randint(2, size=(1280, num_departments)) model.fit({'title': title_data, 'body': body_data, 'tags': tags_data}, {'priority': priority_targets, 'department': dept_targets}, epochs=2, batch_size=32) 

([title_data, body_data, tags_data], [priority_targets, dept_targets]) рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдлрд┐рдЯ рд╣реЛрдиреЗ рдкрд░, рдпрд╛ рддреЛ рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдЯрдкрд▓ ([title_data, body_data, tags_data], [priority_targets, dept_targets]) рдЬреИрд╕реЗ рдХрд┐ ([title_data, body_data, tags_data], [priority_targets, dept_targets]) , рдпрд╛ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХрд╛ рдПрдХ рдЯрдкрд▓ ({'title': title_data, 'body': body_data, 'tags': tags_data}, {'priority': priority_targets, 'department': dept_targets}) рдХреЛ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред ({'title': title_data, 'body': body_data, 'tags': tags_data}, {'priority': priority_targets, 'department': dept_targets}) ред

рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд░реЗрдЬрд╝рдиреЗрдЯ рдореЙрдбрд▓


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

рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдЕрд╡рд╢рд┐рд╖реНрдЯ рдХрдиреЗрдХреНрд╢рди рд╣реИред

рдЖрдЗрдП рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП CIFAR10 рдХреЗ рд▓рд┐рдП рдПрдХ ResNet рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдореЙрдбрд▓ рдмрдирд╛рдПрдВред

 inputs = keras.Input(shape=(32, 32, 3), name='img') x = layers.Conv2D(32, 3, activation='relu')(inputs) x = layers.Conv2D(64, 3, activation='relu')(x) block_1_output = layers.MaxPooling2D(3)(x) x = layers.Conv2D(64, 3, activation='relu', padding='same')(block_1_output) x = layers.Conv2D(64, 3, activation='relu', padding='same')(x) block_2_output = layers.add([x, block_1_output]) x = layers.Conv2D(64, 3, activation='relu', padding='same')(block_2_output) x = layers.Conv2D(64, 3, activation='relu', padding='same')(x) block_3_output = layers.add([x, block_2_output]) x = layers.Conv2D(64, 3, activation='relu')(block_3_output) x = layers.GlobalAveragePooling2D()(x) x = layers.Dense(256, activation='relu')(x) x = layers.Dropout(0.5)(x) outputs = layers.Dense(10, activation='softmax')(x) model = keras.Model(inputs, outputs, name='toy_resnet') model.summary() 

рдЖрдЗрдП рдПрдХ рдореЙрдбрд▓ рдЧреНрд░рд╛рдл рдмрдирд╛рдПрдВ:

 keras.utils.plot_model(model, 'mini_resnet.png', show_shapes=True) 



рдФрд░ рдЙрд╕реЗ рд╕рд┐рдЦрд╛рдирд╛:

 (x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data() x_train = x_train.astype('float32') / 255. x_test = x_test.astype('float32') / 255. y_train = keras.utils.to_categorical(y_train, 10) y_test = keras.utils.to_categorical(y_test, 10) model.compile(optimizer=keras.optimizers.RMSprop(1e-3), loss='categorical_crossentropy', metrics=['acc']) model.fit(x_train, y_train, batch_size=64, epochs=1, validation_split=0.2) 

рдкрд░рдд рдмрд╛рдВрдЯрдирд╛


рдлрд╝рдВрдХреНрд╢рдирд▓ рдПрдкреАрдЖрдИ рдХрд╛ рдПрдХ рдФрд░ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рдРрд╕реЗ рдореЙрдбрд▓ рд╣реИрдВ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдкрд░рддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рдкрд░рддреЗрдВ рдкрд░рддреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ рдПрдХ рд╣реА рдореЙрдбрд▓ рдореЗрдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ: рд╡реЗ рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдкрд░рдд рдЧреНрд░рд╛рдл рдореЗрдВ рдХрдИ рдкрдереЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред

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

рдлрд╝рдВрдХреНрд╢рдирд▓ рдПрдкреАрдЖрдИ рдореЗрдВ рдПрдХ рдкрд░рдд рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдкрд░рдд рдХреЗ рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдХреЛ рдХрдИ рдмрд╛рд░ рдХреЙрд▓ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ Embedding рд▓реЗрдпрд░ рдХреЛ рджреЛ рдЯреЗрдХреНрд╕реНрдЯ рдЗрдирдкреБрдЯ рдкрд░ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 #   1000    128-  shared_embedding = layers.Embedding(1000, 128) #     text_input_a = keras.Input(shape=(None,), dtype='int32') #     text_input_b = keras.Input(shape=(None,), dtype='int32') #           encoded_input_a = shared_embedding(text_input_a) encoded_input_b = shared_embedding(text_input_b) 

рдПрдХ рдкрд░рдд рдЧреНрд░рд╛рдл рдореЗрдВ рдиреЛрдбреНрд╕ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдЪреВрдВрдХрд┐ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрдкреАрдЖрдИ рдореЗрдВ рдЖрдк рдЬрд┐рд╕ рд▓реЗрдпрд░ рдЧреНрд░рд╛рдл рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рд╕реНрдЯреИрдЯрд┐рдХ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд╣реИ, рдЖрдк рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдореЙрдбрд▓ рдХреИрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реИ рдХрд┐ рд╣рдо рдордзреНрдпрд╡рд░реНрддреА рдкрд░рддреЛрдВ ("рдЧреНрд░рд╛рдл рдореЗрдВ" рдиреЛрдбреНрд╕) рдХреА рд╕рдХреНрд░рд┐рдпрддрд╛ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреНрдп рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рдг рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрддреНрдпрдВрдд рдЙрдкрдпреЛрдЧреА рд╣реИ!

рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╡реАрдЬреАрдЬреА 19 рдореЙрдбрд▓ рд╣реИ, рдЬреЛ рдЗрдореЗрдЬрдиреЗрдЯ рдкрд░ рдкреВрд░реНрд╡-рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рд╣реИ:

 from tensorflow.keras.applications import VGG19 vgg19 = VGG19() 

рдФрд░ рдпреЗ рдЧреНрд░рд╛рдл рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреА рдХреНрд╡реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдордзреНрдпрд╡рд░реНрддреА рдореЙрдбрд▓ рд╕рдХреНрд░рд┐рдпрдг рд╣реИрдВ:

 features_list = [layer.output for layer in vgg19.layers] 

рд╣рдо рдПрдХ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдирд┐рд╖реНрдХрд░реНрд╖рдг рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдордзреНрдпрд╡рд░реНрддреА рд╕реНрддрд░ рдХреЗ рд╕рдХреНрд░рд┐рдпрдг рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ - рдФрд░ рд╣рдо рдЗрд╕реЗ 3 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

 feat_extraction_model = keras.Model(inputs=vgg19.input, outputs=features_list) img = np.random.random((1, 224, 224, 3)).astype('float32') extracted_features = feat_extraction_model(img) 

рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреА рддрд░рд╣, рддрдВрддреНрд░рд┐рдХрд╛ рд╢реИрд▓реА рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

рдХрд╕реНрдЯрдо рдкрд░рддреЛрдВ рдХреЛ рд▓рд┐рдЦрдХрд░ рдПрдкреАрдЖрдИ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛


tf.keras рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкрд░рддреЛрдВ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИред рдпрд╣рд╛рдБ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ:

Conv1D рдкрд░рддреЗрдВ: Conv1D , Conv2D , Conv3D , Conv2DTranspose , рдЖрджрд┐ред
MaxPooling1D рдкрд░рддреЗрдВ: MaxPooling1D , MaxPooling2D 2 MaxPooling1D , MaxPooling2D MaxPooling3D , AveragePooling1D , рдЖрджрд┐ред
RNN рдкрд░рддреЗрдВ: GRU , LSTM , ConvLSTM2D , рдЖрджрд┐ред
BatchNormalization , Dropout , BatchNormalization , рдЖрджрд┐ред

рдпрджрд┐ рдЖрдкрдХреЛ рд╡рд╣ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЕрдкрдиреА рдЦреБрдж рдХреА рдкрд░рдд рдмрдирд╛рдХрд░ рдПрдкреАрдЖрдИ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

рд╕рднреА Layer рд╡рд░реНрдЧ рдХреЛ рдЙрдкрд╡рд░реНрдЧрд┐рдд рдХрд░рддреА рд╣реИрдВ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреА рд╣реИрдВ:

call рд╡рд┐рдзрд┐ рдЬреЛ рдкрд░рдд рджреНрд╡рд╛рд░рд╛ рдХреА рдЧрдИ рдЧрдгрдирд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИред
рд▓реЗрдпрд░ рд╡реЗрдЯ build рд╡рд╛рд▓реА build рд╡рд┐рдзрд┐ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╕реНрдЯрд╛рдЗрд▓ рдХрдиреНрд╡реЗрдВрд╢рди рд╣реИ; рдЖрдк __init__ рдореЗрдВ рд╡реЗрдЯ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред

рдпрд╣рд╛рдБ Dense рдкрд░рдд рдХрд╛ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:

 class CustomDense(layers.Layer): def __init__(self, units=32): super(CustomDense, self).__init__() self.units = units def build(self, input_shape): self.w = self.add_weight(shape=(input_shape[-1], self.units), initializer='random_normal', trainable=True) self.b = self.add_weight(shape=(self.units,), initializer='random_normal', trainable=True) def call(self, inputs): return tf.matmul(inputs, self.w) + self.b inputs = keras.Input((4,)) outputs = CustomDense(10)(inputs) model = keras.Model(inputs, outputs) 

рдпрджрд┐ рдЖрдк рдЕрдкрдиреА рдХрд╕реНрдЯрдо рд▓реЗрдпрд░ рдХреЛ рдХреНрд░рдорд╛рдВрдХрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ get_config рд╡рд┐рдзрд┐ рдХреЛ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд▓реЗрдпрд░ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рддрд░реНрдХреЛрдВ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:

 class CustomDense(layers.Layer): def __init__(self, units=32): super(CustomDense, self).__init__() self.units = units def build(self, input_shape): self.w = self.add_weight(shape=(input_shape[-1], self.units), initializer='random_normal', trainable=True) self.b = self.add_weight(shape=(self.units,), initializer='random_normal', trainable=True) def call(self, inputs): return tf.matmul(inputs, self.w) + self.b def get_config(self): return {'units': self.units} inputs = keras.Input((4,)) outputs = CustomDense(10)(inputs) model = keras.Model(inputs, outputs) config = model.get_config() new_model = keras.Model.from_config( config, custom_objects={'CustomDense': CustomDense}) 

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк from_config (cls, config) рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЗрд╕рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд▓реЗрдпрд░ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ from_config рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 def from_config(cls, config): return cls(**config) 

рдлрдВрдХреНрд╢рдирд▓ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдм рдХрд░реЗрдВ


рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЬрдм рдирдП рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ, рдпрд╛ рд╕реАрдзреЗ Model рд╕реАрдзреЗ рдЙрдкрд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ?

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдлрдВрдХреНрд╢рдирд▓ рдПрдкреАрдЖрдИ рдЕрдзрд┐рдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдХрдИ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдкрд╡рд░реНрдЧ рдореЙрдбрд▓ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

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

рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрдкреАрдЖрдИ рдХреА рддрд╛рдХрдд:


рдиреАрдЪреЗ рд╕реВрдЪреАрдмрджреНрдз рдЧреБрдг рдЕрдиреБрдХреНрд░рдорд┐рдХ рдореЙрдбрд▓ (рдЬреЛ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рднреА рд╣реИрдВ) рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рддреНрдп рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЙрдк-рд╡рд░реНрдЧ рдореЙрдбрд▓ (рдЬреЛ рдкрд╛рдпрдерди рдХреЛрдб рд╣реИрдВ, рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдирд╣реАрдВ) рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИрдВред

рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрдкреАрдЖрдИ рдЫреЛрдЯреЗ рдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИред


рдХреЛрдИ super(MyClass, self).__init__(...) , рдиреЛ def call(self, ...): рдЖрджрд┐ред

рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ:

 inputs = keras.Input(shape=(32,)) x = layers.Dense(64, activation='relu')(inputs) outputs = layers.Dense(10)(x) mlp = keras.Model(inputs, outputs) 

рдЙрдкрд╡рд░реНрдЧрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде:

 class MLP(keras.Model): def __init__(self, **kwargs): super(MLP, self).__init__(**kwargs) self.dense_1 = layers.Dense(64, activation='relu') self.dense_2 = layers.Dense(10) def call(self, inputs): x = self.dense_1(inputs) return self.dense_2(x) #   . mlp = MLP() #    . #            . _ = mlp(tf.zeros((1, 32))) 

рдЬреИрд╕рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рд╡реИрд╕рд╛ рд╣реА рдЖрдкрдХрд╛ рдореЙрдбрд▓ рдорд╛рдиреНрдп рд╣реИред


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

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

рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдореЙрдбрд▓ рдХреЛ рдЧреНрд░рд╛рдлрд┐рдХ рд░реВрдк рд╕реЗ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рднреА рд╣реИред


рдЖрдк рдПрдХ рдЧреНрд░рд╛рдл рдХреЗ рд░реВрдк рдореЗрдВ рдореЙрдбрд▓ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЧреНрд░рд╛рдл рдХреЗ рдордзреНрдпрд╡рд░реНрддреА рдиреЛрдбреНрд╕ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдордзреНрдпрд╡рд░реНрддреА рдкрд░рддреЛрдВ рдХреЗ рд╕рдХреНрд░рд┐рдпрдг рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдФрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦрд╛ рдерд╛:

 features_list = [layer.output for layer in vgg19.layers] feat_extraction_model = keras.Model(inputs=vgg19.input, outputs=features_list) 

рдЪреВрдВрдХрд┐ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдореЙрдбрд▓ рдХреЛрдб рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХрд▓ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдХреЛрдб рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рдмрд┐рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рдореЙрдбрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрдкреАрдЖрдИ рдХрдордЬреЛрд░рд┐рдпреЛрдВ


рдпрд╣ рдЧрддрд┐рд╢реАрд▓ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


рдХрд╛рд░реНрдпрд╛рддреНрдордХ API DAG рдкрд░рддреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдореЙрдбрд▓ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рдмрд╕реЗ рдЧрд╣рд░реА рд╕реАрдЦрдиреЗ рд╡рд╛рд▓реЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рд╕рдЪ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреБрдирд░рд╛рд╡рд░реНрддреА рдиреЗрдЯрд╡рд░реНрдХ рдпрд╛ рдЯреНрд░реА рдЖрд░рдПрдирдПрди рдЗрд╕ рдзрд╛рд░рдгрд╛ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрдкреАрдЖрдИ рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЦрд░реЛрдВрдЪ рд╕реЗ рд╕рдм рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


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

рд╡рд┐рднрд┐рдиреНрди рдПрдкреАрдЖрдИ рд╢реИрд▓рд┐рдпреЛрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрди рдФрд░ рд╕рдВрдпреЛрдЬрди


рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрдкреАрдЖрдИ рдпрд╛ рдореЙрдбрд▓ рдХреЛ рдЙрдкрд╡рд░реНрдЧ рдХреЗ рдмреАрдЪ рдЪреБрдирдирд╛ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдореЙрдбрд▓ рдХреА рдПрдХ рд╢реНрд░реЗрдгреА рддрдХ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИредTf.keras API рдХреЗ рд╕рднреА рдореЙрдбрд▓ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдореЙрдбрд▓, рдлрд╝рдВрдХреНрд╢рдирд▓ рдореЙрдбрд▓ рдпрд╛ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдореЙрдбрд▓ / рдкрд░рддреЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдк рд╣рдореЗрд╢рд╛ рдЙрдкрд╡рд┐рднрд╛рдЬрд┐рдд рдореЙрдбрд▓ / рдкрд░рдд рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдореЙрдбрд▓ рдпрд╛ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 units = 32 timesteps = 10 input_dim = 5 # Define a Functional model inputs = keras.Input((None, units)) x = layers.GlobalAveragePooling1D()(inputs) outputs = layers.Dense(1, activation='sigmoid')(x) model = keras.Model(inputs, outputs) class CustomRNN(layers.Layer): def __init__(self): super(CustomRNN, self).__init__() self.units = units self.projection_1 = layers.Dense(units=units, activation='tanh') self.projection_2 = layers.Dense(units=units, activation='tanh') # Our previously-defined Functional model self.classifier = model def call(self, inputs): outputs = [] state = tf.zeros(shape=(inputs.shape[0], self.units)) for t in range(inputs.shape[1]): x = inputs[:, t, :] h = self.projection_1(x) y = h + self.projection_2(state) state = y outputs.append(y) features = tf.stack(outputs, axis=1) print(features.shape) return self.classifier(features) rnn_model = CustomRNN() _ = rnn_model(tf.zeros((1, timesteps, input_dim))) 

рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЖрдк рдлрдВрдХреНрд╢рдирд▓ рдПрдкреАрдЖрдИ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЙрдкрд╡рд░реНрдЧрд┐рдд рдкрд░рдд рдпрд╛ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ callрд╣реИрдВ рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрдЯрд░реНрди рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ:

call(self, inputs, **kwargs)рдЬрд╣рд╛рдВ inputsрдЯреЗрдВрд╕рд░ рдпрд╛ рдиреЗрд╕реНрдЯреЗрдб рдЯреЗрдВрд╕рд░ рд╕рдВрд░рдЪрдирд╛ (рдЬреИрд╕реЗ рдЯреЗрдВрд╕рд░реЛрдВ рдХреА рд╕реВрдЪреА) рд╣реИ, рдФрд░ рдЬрд╣рд╛рдВ **kwargsрдЧреИрд░-рдЯреЗрдирд╕рд░ рддрд░реНрдХ рд╣реИрдВ (рдЗрдирдкреБрдЯ рдирд╣реАрдВ) ред рдмреВрд▓рд┐рдпрди рдорд╛рди
call(self, inputs, training=None, **kwargs)рдХрд╣рд╛рдБ trainingрдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдореЛрдб рдореЗрдВ рдкрд░рдд, рд╕реАрдЦрдиреЗ рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдмреВрд▓рд┐рдпрди рдорд╛рд╕реНрдХ рдЯреЗрдВрд╕рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, RNN рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА)
call(self, inputs, mask=None, **kwargs)рдХрд╣рд╛рдБ maskрд╣реИред
call(self, inputs, training=None, mask=None, **kwargs)- рдмреЗрд╢рдХ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдкрд░рдд рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рджреЛрдиреЛрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рд▓реЗрдпрд░ рдпрд╛ рдореЙрдбрд▓ рдкрд░ `get_config` рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдореЙрдбрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рд╡рд╣ рдХреНрд░рдордмрджреНрдз рдФрд░ рдХреНрд▓реЛрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдиреАрдЪреЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдХрд╕реНрдЯрдо рдЖрд░рдПрдирдПрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрдХреНрд░реИрдЪ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдореЙрдбрд▓ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ:

 units = 32 timesteps = 10 input_dim = 5 batch_size = 16 class CustomRNN(layers.Layer): def __init__(self): super(CustomRNN, self).__init__() self.units = units self.projection_1 = layers.Dense(units=units, activation='tanh') self.projection_2 = layers.Dense(units=units, activation='tanh') self.classifier = layers.Dense(1, activation='sigmoid') def call(self, inputs): outputs = [] state = tf.zeros(shape=(inputs.shape[0], self.units)) for t in range(inputs.shape[1]): x = inputs[:, t, :] h = self.projection_1(x) y = h + self.projection_2(state) state = y outputs.append(y) features = tf.stack(outputs, axis=1) return self.classifier(features) #           #  `batch_shape`,     `CustomRNN`  #    (     `state`). inputs = keras.Input(batch_shape=(batch_size, timesteps, input_dim)) x = layers.Conv1D(32, 3)(inputs) outputs = CustomRNN()(x) model = keras.Model(inputs, outputs) rnn_model = CustomRNN() _ = rnn_model(tf.zeros((1, 10, 5))) 

рдпрд╣ рд╣рдорд╛рд░реА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрдкреАрдЖрдИ рдЧрд╛рдЗрдб рдХрд╛ рд╕рдорд╛рдкрди рдХрд░рддрд╛ рд╣реИ!

рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдЧрд╣рди рд╢рд┐рдХреНрд╖рдг рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕реЗрдЯ рд╣реИред

рд╕рддреНрдпрд╛рдкрди рдХреЗ рдмрд╛рдж, рдЕрдиреБрд╡рд╛рдж Tensorflow.org рдкрд░ рднреА рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рд░реВрд╕реА рдореЗрдВ Tensorflow.org рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЗ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рднрд╛рдЧ рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдпрд╛ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВред рдХрд┐рд╕реА рднреА рд╕реБрдзрд╛рд░ рдпрд╛ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдЪрд┐рддреНрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдордиреЗ рдЧреВрдЧрд▓реЗрдиреЗрдЯ рдореЙрдбрд▓ рдХреА рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬреЛ рдХрд┐ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдПрд╕рд╛рдЗрдХреНрд▓рд┐рдХ рдЧреНрд░рд╛рдл рднреА рд╣реИред

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


All Articles