рдХреЗрд░рд╕ рдХреЗ рд╕рд╛рде рдЖрд╡рд░реНрддрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ (рдЖрд░рдПрдирдПрди)

Tensorflow.org рд╕реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдЧрд╛рдЗрдб рдХрд╛ рдЕрдиреБрд╡рд╛рджред рд╕рд╛рдордЧреНрд░реА рддреНрд╡рд░рд┐рдд рдореЗрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреЗрд░рд╕ / рдЯреЗрдиреНрд╕рд░рдлреНрд▓реЛ 2.0 рдХреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкрд░рддреЛрдВ рдФрд░ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рджреЛрдиреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреА рд╣реИред CuDNN рдХреЛрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдФрд░ рд╕реАрдорд╛рдУрдВ рдХреЛ рднреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рд╕реАрдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред



рд░рд┐рдХрд░реНрд╕рд┐рд╡ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ (RNN) рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдбреЗрдЯрд╛, рдЬреИрд╕реЗ рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдпрд╛ рдкреНрд░рд╛рдХреГрддрд┐рдХ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИред

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

: Keras RNN рдПрдкреАрдЖрдИ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдЙрдкрдпреЛрдЧ рдХреА рдЖрд╕рд╛рдиреА рдирд┐рд░реНрдорд┐рдд рдкрд░рддреЛрдВ: tf.keras.layers.RNN, tf.keras.layers.LSTM, tf.keras.layers.GRUрдЖрдк рдЬрд▓реНрджреА рд╕реЗ рдЬрдЯрд┐рд▓ рд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рдирд╛ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рдЖрд╕рд╛рди рдЕрдиреБрдХреВрд▓рди : рдЖрдк рдЖрд░рдПрдирдПрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ (рд▓реВрдк рдХреЗ рдЖрдВрддрд░рд┐рдХ рднрд╛рдЧ) рдХреА рдЕрдкрдиреА рдкрд░рдд рдХреЛ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВfor) рдХрд╕реНрдЯрдо рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдФрд░ `tf.keras.layers.RNN` (` рд▓реВрдк рдХреЗ рд▓рд┐рдП `) рдХреА рдПрдХ рдЖрдо рдкрд░рдд рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЛ рдХрдо рд╕реЗ рдХрдо рдХреЛрдб рдХреЗ рд╕рд╛рде рд▓рдЪреАрд▓реЗ рддрд░реАрдХреЗ рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрд╕рдВрдзрд╛рди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рд╕реНрдерд╛рдкрдирд╛


from __future__ import absolute_import, division, print_function, unicode_literals

import collections
import matplotlib.pyplot as plt
import numpy as np

import tensorflow as tf

from tensorflow.keras import layers

рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореЙрдбрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг


рдХреЗрд░рд╕ рдореЗрдВ рддреАрди рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЖрд░рдПрдирдПрди рдкрд░рддреЗрдВ рд╣реИрдВ:

  1. tf.keras.layers.SimpleRNN, рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рдЖрд░рдПрдирдПрди рдЬрд┐рд╕рдореЗрдВ рдкрд┐рдЫрд▓реЗ рд╕рдордп рдХреЗ рдХрджрдо рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ рдкрд╛рд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  2. tf.keras.layers.GRU, рдкрд╣рд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдорд╢реАрди рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП RNN рдХреЛрдбреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди
  3. tf.keras.layers.LSTM, рдкрд╣рд▓реА рдмрд╛рд░ рджреАрд░реНрдШрдХрд╛рд▓реАрди рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рд╕реНрдореГрддрд┐ рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд

2015 рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдХреЗрд░рд╕ рдиреЗ рдкрд╣рд▓рд╛ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдкрд╛рдпрдерди рдФрд░ рдПрд▓рдПрд╕рдЯреАрдПрдо рдФрд░ рдЬреАрдЖрд░рдпреВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢реБрд░реВ рдХрд┐рдпрд╛ред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ SequentialрдореЙрдбрд▓ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ 64-рдЖрдпрд╛рдореА рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЛ рдШреЛрдВрд╕рд▓реЗ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдПрдХ рдкрд░рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реИрдХреНрдЯрд░ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ LSTMред

model = tf.keras.Sequential()
#   Embedding      1000, 
#     64.
model.add(layers.Embedding(input_dim=1000, output_dim=64))

#   LSTM  128  .
model.add(layers.LSTM(128))

#   Dense  10    softmax.
model.add(layers.Dense(10))

model.summary()

рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рд╕реНрдЯреЗрдЯреНрдпреВрдЬрд╝


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, RNN рдкрд░рдд рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдкреНрд░рддрд┐ рддрддреНрд╡ рдПрдХ рд╡реЗрдХреНрдЯрд░ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╡реЗрдХреНрдЯрд░ рдкреВрд░реЗ рдЗрдирдкреБрдЯ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдЕрдВрддрд┐рдо рдЖрд░рдПрдирдПрди рд╕реЗрд▓ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИред рдЗрд╕ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдЖрдпрд╛рдо (batch_size, units), рдЬрд╣рд╛рдВ рд▓реЗрдпрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рджрд┐рдП unitsрдЧрдП рддрд░реНрдХ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ unitsред

рдпрджрд┐ рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрд░рдПрдирдПрди рдкрд░рдд рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ (рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реЗрдХреНрдЯрд░) рдХреЗ рд▓рд┐рдП рдкреВрд░реЗ рдЖрдЙрдЯрдкреБрдЯ рдЕрдиреБрдХреНрд░рдо рдХреЛ рднреА рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреА рд╣реИ return_sequences=Trueред рдЗрд╕ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдЖрдпрд╛рдо рд╣реИ (batch_size, timesteps, units)ред

model = tf.keras.Sequential()
model.add(layers.Embedding(input_dim=1000, output_dim=64))

#  GRU  3D   (batch_size, timesteps, 256)
model.add(layers.GRU(256, return_sequences=True))

#  SimpleRNN  2D   (batch_size, 128)
model.add(layers.SimpleRNN(128))

model.add(layers.Dense(10))

model.summary()

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, RNN рдкрд░рдд рдЕрдкрдиреА рдЕрдВрддрд┐рдо рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ (рдУрдВ) рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреА рд╣реИред

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

RNN рдкрд░рдд рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рд▓реМрдЯрд╛рдиреЗ рдХреЗ return_stateрд▓рд┐рдП True, рдкрд░рдд рдмрдирд╛рддреЗ рд╕рдордп рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдорд╛рди рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ LSTM2 рд░рд╛рдЬреНрдп рдЯреЗрдВрд╕рд░реНрд╕ рд╣реИрдВ, рдФрд░ GRUрдХреЗрд╡рд▓ рдПрдХред

рдПрдХ рдкрд░рдд рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдкрд░рдд рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░реЗрдВ initial_stateред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдпрд╛рдо рдХреЛ рдкрд░рдд рддрддреНрд╡ рдХреЗ рдЖрдпрд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣реИред

encoder_vocab = 1000
decoder_vocab = 2000

encoder_input = layers.Input(shape=(None, ))
encoder_embedded = layers.Embedding(input_dim=encoder_vocab, output_dim=64)(encoder_input)

#       
output, state_h, state_c = layers.LSTM(
    64, return_state=True, name='encoder')(encoder_embedded)
encoder_state = [state_h, state_c]

decoder_input = layers.Input(shape=(None, ))
decoder_embedded = layers.Embedding(input_dim=decoder_vocab, output_dim=64)(decoder_input)

#  2     LSTM    
decoder_output = layers.LSTM(
    64, name='decoder')(decoder_embedded, initial_state=encoder_state)
output = layers.Dense(10)(decoder_output)

model = tf.keras.Model([encoder_input, decoder_input], output)
model.summary()

рдЖрд░рдПрдирдПрди рдкрд░рдд рдФрд░ рдЖрд░рдПрдирдПрди рд╕реЗрд▓


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

рд╕реЗрд▓ forRNN рдкрд░рдд рдХреЗ рдЪрдХреНрд░ рдХреЗ рдЕрдВрджрд░ рд╣реИ ред рдПрдХ рдкрд░рдд рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрд▓ рд▓рдкреЗрдЯрдирд╛ tf.keras.layers.RNNрдЖрдкрдХреЛ рдПрдХ рдкрд░рдд рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЕрдиреБрдХреНрд░рдо рдкреИрдХреЗрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рдЙрджрд╛ред RNN(LSTMCell(10))ред

рдЧрдгрд┐рддреАрдп рд░реВрдк рд╕реЗ, RNN(LSTMCell(10))рдпрд╣ рдЙрд╕реА рддрд░рд╣ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ рдЬреИрд╕реЗ LSTM(10)ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, TF v1.x рдХреЗ рдЕрдВрджрд░ рдЗрд╕ рдкрд░рдд рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗрд╡рд▓ рд╕рдВрдмрдВрдзрд┐рдд RNN рд╕реЗрд▓ рдмрдирд╛рдиреЗ рдФрд░ RNN рдкрд░рдд рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдореНрдмреЗрдбреЗрдб рдкрд░рддреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ GRUрдФрд░ LSTMCuDNN рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд┐ рдЖрдк рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

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

  • tf.keras.layers.SimpleRNNCellрдкрд░рдд рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ SimpleRNNред
  • tf.keras.layers.GRUCellрдкрд░рдд рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ GRUред
  • tf.keras.layers.LSTMCellрдкрд░рдд рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ LSTMред

рдПрдХ рд╕реЗрд▓ рдХреЛ рдПрдХ рдЖрдо рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдиреЗ рд╕реЗ tf.keras.layers.RNNрдЖрдкрдХреЗ рдЕрдиреБрд╕рдВрдзрд╛рди рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдЖрд░рдПрдирдПрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдХреНрд░реЙрд╕-рдмреИрдЪ рд╕реЗрд╡ рд╕реНрдЯреЗрдЯ


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

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

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

рдЖрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ `рд╕реНрдЯреЗрдЯрдлреБрд▓ = рдЯреНрд░реВ` рд╕реЗрдЯ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ `s = [t0, t1, ... t1546, t1547]` рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

s1 = [t0, t1, ... t100]
s2 = [t101, ... t201]
...
s16 = [t1501, ... t1547]

рддрдм рдЖрдк рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

lstm_layer = layers.LSTM(64, stateful=True)
for s in sub_sequences:
  output = lstm_layer(s)

рдЬрдм рдЖрдк рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд╛рдл рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ layer.reset_states()ред
рдиреЛрдЯ: рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ iрдЗрд╕ рдкреИрдХреЗрдЬ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг iрдкрд┐рдЫрд▓реЗ рдкреИрдХреЗрдЬ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рднреА рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрддреНрд╡ (рдкреИрдХреЗрдЬ рдЖрдХрд╛рд░) рд╣реЛрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ [sequence_A_from_t0_to_t100, sequence_B_from_t0_to_t100]рдкреИрдХреЗрдЬ рд╕рдореНтАНрдорд┐рд▓рд┐рдд рд╣реИ, рддреЛ рдЕрдЧрд▓рд╛ рдкреИрдХреЗрдЬ рд╕рдорд╛рд╣рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП [sequence_A_from_t101_to_t200, sequence_B_from_t101_to_t200]ред
рдпрд╣рд╛рдБ рдПрдХ рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рд╣реИ:

paragraph1 = np.random.random((20, 10, 50)).astype(np.float32)
paragraph2 = np.random.random((20, 10, 50)).astype(np.float32)
paragraph3 = np.random.random((20, 10, 50)).astype(np.float32)

lstm_layer = layers.LSTM(64, stateful=True)
output = lstm_layer(paragraph1)
output = lstm_layer(paragraph2)
output = lstm_layer(paragraph3)

# reset_states()      initial_state.
#  initial_state   ,      .
lstm_layer.reset_states()

рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдЖрд░рдПрдирдПрди


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

рдХреЗрд░реЗрд╕ рдРрд╕реЗ рджреНрд╡рд┐рджрд┐рд╢ RNN: рдПрдХ рдЖрд╡рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ tf.keras.layers.Bidirectionalред

model = tf.keras.Sequential()

model.add(layers.Bidirectional(layers.LSTM(64, return_sequences=True), 
                               input_shape=(5, 10)))
model.add(layers.Bidirectional(layers.LSTM(32)))
model.add(layers.Dense(10))

model.summary()

рд╣реБрдб рдХреЗ рддрд╣рдд, Bidirectionalрд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд RNN рдкрд░рдд go_backwardsрдХреЛ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдирдИ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреА рдЧрдИ рдкрд░рдд рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд▓рдЯ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЛ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк

рд╕реЗ ` BidirectionalрдЖрд░рдПрдирдПрди ' рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдлреЙрд░рд╡рд░реНрдб рд▓реЗрдпрд░ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рд░рд┐рд╡рд░реНрд╕ рд▓реЗрдпрд░ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдпреЛрдЧ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдиреНрдп рдорд░реНрдЬ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛ред рд╕рдВрдШрдирди, `рдмрд┐рдЬрдиреИрд╢рдирд▓` рд░реИрдкрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ` рдорд░реНрдЬ_рдореЛрдб` рдкреИрд░рд╛рдореАрдЯрд░ рдмрджрд▓реЗрдВред

TensorFlow 2.0 рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдХреВрд▓рди рдФрд░ CuDNN рдХреЛрд░


TensorFlow 2.0 рдореЗрдВ, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд LSTM рдФрд░ GRU рдкрд░рддреЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ CuDNN рдХреЛрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрддреА рд╣реИрдВ рдпрджрд┐ рдХреЛрдИ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде, рдкрд┐рдЫрд▓реА рдкрд░рддреЗрдВ keras.layers.CuDNNLSTM/CuDNNGRUрдкреБрд░рд╛рдиреА рд╣реИрдВ, рдФрд░ рдЖрдк рдЙрди рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдЪрд┐рдВрддрд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдкрдирд╛ рдореЙрдбрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рди рдкрд░ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдЪреВрдВрдХрд┐ CuDNN рдХрд░реНрдиреЗрд▓ рдХреБрдЫ рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд LSTM рдпрд╛ GRU рдкрд░рддреЛрдВ рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдкрд░рдд CuDNN рдХрд░реНрдиреЗрд▓ рдкрд░рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧреА ред рдЬреИрд╕реЗ

  • рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬрд╝ activationрд╕реЗ рдмрджрд▓рдирд╛ tanhред
  • рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬрд╝ recurrent_activationрд╕реЗ рдмрджрд▓рдирд╛ sigmoidред
  • рдЙрдкрдпреЛрдЧ recurrent_dropout> 0ред
  • рдЗрд╕реЗ unrollTrue рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ , рдЬреЛ LSTM / GRU рдХреЛ рдЖрдВрддрд░рд┐рдХ tf.while_loopрдХреЛ рддреИрдирд╛рдд рд▓реВрдк рдореЗрдВ рд╡рд┐рдШрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ forред
  • use_biasрдЭреВрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░реЗрдВ ред
  • рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рд╕рд╣реА рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдорд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдпрджрд┐ рдорд╛рд╕реНрдХ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд рдбреЗрдЯрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ CuDNN рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдмрд╕реЗ рдЖрдо рдорд╛рдорд▓рд╛ рд╣реИ)ред

рдЬрдм рд╕рдВрднрд╡ рд╣реЛ рддреЛ CuDNN рдЧреБрдард▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


batch_size = 64
#    MNIST    (batch_size, 28, 28).
#     (28, 28) (   ).
input_dim = 28

units = 64
output_size = 10  #   0  9

#  RNN 
def build_model(allow_cudnn_kernel=True):
  # CuDNN     ,     .
  #   `LSTM(units)`    CuDNN,
  #   RNN(LSTMCell(units))   non-CuDNN .
  if allow_cudnn_kernel:
    #  LSTM      CuDNN.
    lstm_layer = tf.keras.layers.LSTM(units, input_shape=(None, input_dim))
  else:
    #  LSTMCell  RNN    CuDNN.
    lstm_layer = tf.keras.layers.RNN(
        tf.keras.layers.LSTMCell(units),
        input_shape=(None, input_dim))
  model = tf.keras.models.Sequential([
      lstm_layer,
      tf.keras.layers.BatchNormalization(),
      tf.keras.layers.Dense(output_size)]
  )
  return model

MNIST рдбреЗрдЯрд╛рд╕реЗрдЯ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ


mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
sample, sample_label = x_train[0], y_train[0]

рдореЙрдбрд▓ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ


рд╣рдордиреЗ sparse_categorical_crossentropyрдШрд╛рдЯреЗ рдХреЗ рдПрдХ рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рд╣реИ ред рдореЙрдбрд▓ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдПрдХ рдЖрдпрд╛рдо рд╣реИ [batch_size, 10]ред рдореЙрдбрд▓ рдХрд╛ рдЙрддреНрддрд░ рдкреВрд░реНрдгрд╛рдВрдХ рд╡реЗрдХреНрдЯрд░ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдЦреНрдпрд╛ 0 рд╕реЗ 9 рддрдХ рдХреА рд╕реАрдорд╛ рдореЗрдВ рд╣реИред

model = build_model(allow_cudnn_kernel=True)

model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), 
              optimizer='sgd',
              metrics=['accuracy'])

model.fit(x_train, y_train,
          validation_data=(x_test, y_test),
          batch_size=batch_size,
          epochs=5)

CuDNN рдХреЛрд░ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдирдпрд╛ рдореЙрдбрд▓ рдмрдирд╛рдПрдБ


slow_model = build_model(allow_cudnn_kernel=False)
slow_model.set_weights(model.get_weights())
slow_model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), 
                   optimizer='sgd', 
                   metrics=['accuracy'])
slow_model.fit(x_train, y_train, 
               validation_data=(x_test, y_test), 
               batch_size=batch_size,
               epochs=1)  #         .

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

CuDNN рд╕рдорд░реНрдерди рд╡рд╛рд▓рд╛ рдПрдХ рд╣реА рдореЙрдбрд▓ рдПрдХрд▓-рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдиреЛрдЯреЗрд╢рди tf.deviceрдмрд╕ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЧрдП рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ GPU рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рддреЛ рдореЙрдбрд▓ CPU рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЪрд▓реЗрдЧрд╛ред

рдЖрдк рдмрд╕ рдЙрд╕ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЖрдк рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХреНрдпрд╛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ?

with tf.device('CPU:0'):
  cpu_model = build_model(allow_cudnn_kernel=True)
  cpu_model.set_weights(model.get_weights())
  result = tf.argmax(cpu_model.predict_on_batch(tf.expand_dims(sample, 0)), axis=1)
  print('Predicted result is: %s, target result is: %s' % (result.numpy(), sample_label))
  plt.imshow(sample, cmap=plt.get_cmap('gray'))

RNN рд╕реВрдЪреА / рд╢рдмреНрджрдХреЛрд╢ рдЗрдирдкреБрдЯ, рдпрд╛ рдиреЗрд╕реНрдЯреЗрдб рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде


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

[batch, timestep, {\"video\": [height, width, channel], \"audio\": [frequency]}]

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

[batch, timestep, {\"location\": [x, y], \"pressure\": [force]}]

рдирд┐рдореНрди рдХреЛрдб рдХрд╕реНрдЯрдо RNN рд╕реЗрд▓ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрд░рдЪрд┐рдд рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдиреЗрд╕реНрдЯреЗрдб рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ


NestedInput = collections.namedtuple('NestedInput', ['feature1', 'feature2'])
NestedState = collections.namedtuple('NestedState', ['state1', 'state2'])

class NestedCell(tf.keras.layers.Layer):

  def __init__(self, unit_1, unit_2, unit_3, **kwargs):
    self.unit_1 = unit_1
    self.unit_2 = unit_2
    self.unit_3 = unit_3
    self.state_size = NestedState(state1=unit_1, 
                                  state2=tf.TensorShape([unit_2, unit_3]))
    self.output_size = (unit_1, tf.TensorShape([unit_2, unit_3]))
    super(NestedCell, self).__init__(**kwargs)

  def build(self, input_shapes):
    # #  input_shape  2 , [(batch, i1), (batch, i2, i3)]
    input_1 = input_shapes.feature1[1]
    input_2, input_3 = input_shapes.feature2[1:]

    self.kernel_1 = self.add_weight(
        shape=(input_1, self.unit_1), initializer='uniform', name='kernel_1')
    self.kernel_2_3 = self.add_weight(
        shape=(input_2, input_3, self.unit_2, self.unit_3),
        initializer='uniform',
        name='kernel_2_3')

  def call(self, inputs, states):
    #     [(batch, input_1), (batch, input_2, input_3)]
    #     [(batch, unit_1), (batch, unit_2, unit_3)]
    input_1, input_2 = tf.nest.flatten(inputs)
    s1, s2 = states

    output_1 = tf.matmul(input_1, self.kernel_1)
    output_2_3 = tf.einsum('bij,ijkl->bkl', input_2, self.kernel_2_3)
    state_1 = s1 + output_1
    state_2_3 = s2 + output_2_3

    output = [output_1, output_2_3]
    new_states = NestedState(state1=state_1, state2=state_2_3)

    return output, new_states

рдиреЗрд╕реНрдЯреЗрдб рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рдПрдХ RNN рдореЙрдбрд▓ рдмрдирд╛рдПрдБ


рдЖрдЗрдП рдПрдХ рдХреЗрд░рд╕ рдореЙрдбрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдкрд░рдд tf.keras.layers.RNNрдФрд░ рдПрдХ рдХрд╕реНрдЯрдо рд╕реЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЕрднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред

unit_1 = 10
unit_2 = 20
unit_3 = 30

input_1 = 32
input_2 = 64
input_3 = 32
batch_size = 64
num_batch = 100
timestep = 50

cell = NestedCell(unit_1, unit_2, unit_3)
rnn = tf.keras.layers.RNN(cell)

inp_1 = tf.keras.Input((None, input_1))
inp_2 = tf.keras.Input((None, input_2, input_3))

outputs = rnn(NestedInput(feature1=inp_1, feature2=inp_2))

model = tf.keras.models.Model([inp_1, inp_2], outputs)

model.compile(optimizer='adam', loss='mse', metrics=['accuracy'])unit_1 = 10
unit_2 = 20
unit_3 = 30

input_1 = 32
input_2 = 64
input_3 = 32
batch_size = 64
num_batch = 100
timestep = 50

cell = NestedCell(unit_1, unit_2, unit_3)
rnn = tf.keras.layers.RNN(cell)

inp_1 = tf.keras.Input((None, input_1))
inp_2 = tf.keras.Input((None, input_2, input_3))

outputs = rnn(NestedInput(feature1=inp_1, feature2=inp_2))

model = tf.keras.models.Model([inp_1, inp_2], outputs)

model.compile(optimizer='adam', loss='mse', metrics=['accuracy'])

рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдбреЗрдЯрд╛ рдкрд░ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВ


рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдбреЗрдЯрд╛рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП Numpy рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

input_1_data = np.random.random((batch_size * num_batch, timestep, input_1))
input_2_data = np.random.random((batch_size * num_batch, timestep, input_2, input_3))
target_1_data = np.random.random((batch_size * num_batch, unit_1))
target_2_data = np.random.random((batch_size * num_batch, unit_2, unit_3))
input_data = [input_1_data, input_2_data]
target_data = [target_1_data, target_2_data]

model.fit(input_data, target_data, batch_size=batch_size)

рдПрдХ рдкрд░рдд рдХреЗ рд╕рд╛рде, tf.keras.layers.RNNрдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЕрдиреБрдХреНрд░рдо рдХреЗ рднреАрддрд░ рдПрдХ рдПрдХрд▓ рдЪрд░рдг рдХреЗ рдЧрдгрд┐рддреАрдп рддрд░реНрдХ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдкрд░рдд tf.keras.layers.RNNрдЖрдкрдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдо рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓ рд▓реЗрдЧреАред рдпрд╣ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд░рдПрдирдПрди (рдЬреИрд╕реЗ рдПрд▓рдПрд╕рдЯреАрдПрдо рд╕рдВрд╕реНрдХрд░рдг) рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рддрд░реАрдХрд╛ рд╣реИред

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

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


All Articles