[PYTHON] Vérification de la différence et de la compatibilité entre keras et tf.keras # 1

Fin du développement de Keras

Cela fait un moment que je ne l'ai pas posté. Comme vous pouvez le voir sur github, le multi-backend Keras semble avoir terminé son développement en avril 2020. Il sera remplacé par Keras dans Tensorflow à l'avenir. keras-team (Pour plus de commodité, Keras multi-backend est appelé mb-keras et Tensorflow Keras est appelé tf-keras.) Je voudrais comparer et vérifier mb-keras et tf-keras dans cet article.

À propos de la prise en charge de Tensorflow pour mb-keras

Comme mentionné dans github mentionné ci-dessus, il semble qu'il prenne en charge jusqu'à Tensorflow 2.0. Au 4 mai 2020, au moment de la rédaction de cet article, le dernier stabilisateur de Tensorflow est 2.1.0.

environnement

En écrivant cet article, j'ai réinstallé Tensorflow à partir de CUDA, etc., mais j'ai créé un environnement médiocre. mb-keras prend en charge jusqu'à Python 3.6 ... (tensorflow prend en charge jusqu'à Python 3.7) mb-keras 2.3.1 prend en charge jusqu'à tensorflow 2.0, donc c'est bien.

python -V
3.7.6
>>> import keras
>>> keras.__version__
'2.3.1'
>>> import tensorflow
>>> tensorflow.__version__
'2.0.0'

alias

C'est fondamentalement la même chose, juste un flux tenseur au début.

mb-keras


from keras.layers import Dense, Conv2D

tf-keras


from tensorflow.keras.layers import Dense, Conv2D

Compatibilité des objets

Probablement pas **. Cependant, il n'y a pas besoin de compatibilité ... Vérifiez avec le code ci-dessous.

A propos du modèle et du calque

def mb_layers():
    from keras.layers import Input, Dense, Activation
    input_l = Input(shape=(64,))
    hidden = Dense(10)(input_l)
    output_l = Activation('softmax')(hidden)
    return input_l, output_l
def tf_layers():
    from tensorflow.keras.layers import Input, Dense, Activation
    input_l = Input(shape=(64,))
    hidden = Dense(10)(input_l)
    output_l = Activation('softmax')(hidden)
    return input_l, output_l

if __name__ == '__main__':
    mb_i, mb_o = mb_layers()
    tf_i, tf_o = tf_layers()
    
    from keras.models import Model as mbModel
    from tensorflow.keras.models import Model as tfModel
    
    # mb_in_tf = mbModel(tf_i, tf_o) #---- ※1
    # tf_in_mb = tfModel(mb_i, mb_o) #---- ※2
    mb_in_mb = mbModel(mb_i, mb_o)
    mb_in_mb.summary()               #---- ※3
    tf_in_tf = tfModel(tf_i, tf_o)
    tf_in_tf.summary()               #---- ※4

stdout


Model: "model_7"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_23 (InputLayer)        (None, 64)                0         
_________________________________________________________________
dense_14 (Dense)             (None, 10)                650       
_________________________________________________________________
activation_12 (Activation)   (None, 10)                0         
=================================================================
Total params: 650
Trainable params: 650
Non-trainable params: 0
_________________________________________________________________

stdout


Model: "model_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_24 (InputLayer)        [(None, 64)]              0         
_________________________________________________________________
dense_14 (Dense)             (None, 10)                650       
_________________________________________________________________
activation_11 (Activation)   (None, 10)                0         
=================================================================
Total params: 650
Trainable params: 650
Non-trainable params: 0
_________________________________________________________________

La forme de sortie de InputLayer est différente, mais peut-elle être implémentée avec la même architecture? Je veux le vérifier à partir de la prochaine fois. Pour le moment, il semble que la création de Layer soit différente entre mb-keras et tf-keras, il est donc certain qu'il ne peut pas être jeté dans Model.

À propos de l'Optimizer

L'optimiseur peut utiliser l'optimiseur tf-keras pour les modèles réalisés avec mb-keras.

model.compile


    from keras.optimizers import Adam as mbAdam
    from tensorflow.keras.optimizers import Adam as tfAdam
    mb_in_mb.compile(tfAdam(), 'mse')    #----※1
    tf_in_tf.compile(mbAdam(), 'mse')    #----※2

À propos des couches utilisables

Cela semble être tout à fait différent. ○ est implémenté, × n'est pas implémenté. Notez que tous ne sont pas des calques, car nous venons de disposer ceux extraits par dir () presque tels quels. En regardant la différence de Attention, tf-keras est-il plus avancé en révision et en abolition? (Méthode de remplacement et toutes les lettres minuscules sont des fonctions, donc je les ai supprimées de la liste)

Layer mb-keras tf-keras
AbstractRNNCell ×
Activation
ActivityRegularization
Add
AdditiveAttention ×
AlphaDropout
AtrousConvolution1D ×
AtrousConvolution2D ×
Attention ×
Average
AveragePooling1D
AveragePooling2D
AveragePooling3D
AvgPool1D
AvgPool2D
AvgPool3D
BatchNormalization
Bidirectional
Concatenate
Conv1D
Conv2D
Conv2DTranspose
Conv3D
Conv3DTranspose
ConvLSTM2D
ConvLSTM2DCell ×
ConvRecurrent2D ×
Convolution1D
Convolution2D ×
Convolution2D ×
Convolution3D
Convolution3DTranspose ×
Cropping1D
Cropping2D
Cropping3D
CuDNNGRU ×
CuDNNLSTM ×
Deconvolution2D ×
Deconvolution3D ×
Dense
DenseFeatures ×
DepthwiseConv2D
Dot
Dropout
ELU
Embedding
Flatten
GRU
GRUCell
GaussianDropout
GaussianNoise
GlobalAveragePooling1D
GlobalAveragePooling2D
GlobalAveragePooling3D
GlobalAvgPool1D
GlobalAvgPool2D
GlobalAvgPool3D
GlobalMaxPool1D
GlobalMaxPool2D
GlobalMaxPool3D
GlobalMaxPooling1D
GlobalMaxPooling2D
GlobalMaxPooling3D
Highway ×
Input
InputLayer
InputSpec
LSTM
LSTMCell
Lambda
Layer
LayerNormalization ×
LeakyReLU
LocallyConnected1D
LocallyConnected2D
Masking
MaxPool1D
MaxPool2D
MaxPool3D
MaxPooling1D
MaxPooling2D
MaxPooling3D
Maximum
MaxoutDense ×
Minimum
Multiply
PReLU
Permute
RNN
ReLU
Recurrent ×
RepeatVector
Reshape
SeparableConv1D
SeparableConv2D
SeparableConvolution1D ×
SeparableConvolution2D ×
SimpleRNN
SimpleRNNCell
Softmax
SpatialDropout1D
SpatialDropout2D
SpatialDropout3D
StackedRNNCells
Subtract
ThresholdedReLU
TimeDistributed
UpSampling1D
UpSampling2D
UpSampling3D
Wrapper ※ ×
ZeroPadding1D
ZeroPadding2D
ZeroPadding3D

Ce résumé

Il s'avère que mb-keras et tf-keras sont presque incompatibles. Cependant, je n'en ressens pas le besoin.

Comme un cas qui semble être un problème, mb-keras prend en charge jusqu'à Python 3.6, il ne sera donc pas pris en charge même si Python est mis à jour à l'avenir. D'autre part, tf-keras continuera à être développé. Si vous avez créé un système d'IA qui utilise mb-keras, vous pouvez être dépassé par le temps, vous devriez donc immédiatement envisager de le remplacer par tf-keras. Voici un exemple concret qui vient à l'esprit en premier: ** Un modèle entraîné créé avec mb-keras peut-il être chargé avec tf-keras et déduit? ** Toka Toka ··· (Je veux enregistrer après le # 2 quand je ne sais pas quand.)

En fait, je viens de construire un système d'IA en interne avec mb-keras avant GW ... Si vous pensez que keras n'a pas été mis à jour récemment, c'est l'endroit où aller. J? ai compris ...

Recommended Posts

Vérification de la différence et de la compatibilité entre keras et tf.keras # 1
Différence entre processus et travail
Différence entre "categorical_crossentropy" et "sparse_categorical_crossentropy"
Différence entre régression et classification
Différence entre np.array et np.arange
Différence entre MicroPython et CPython
Différence entre ps a et ps -a
Différence entre return et print-Python
Différence entre Ruby et Python Split
Différence entre java et python (mémo)
Différence entre list () et [] en Python
Différence entre SQLAlchemy filter () et filter_by ()
Mémorandum (différence entre csv.reader et csv.dictreader)
(Remarque) Différence entre la passerelle et la passerelle par défaut
Différence entre le randint de Numpy et le randint de Random
Différence entre tri et tri (mémorial)
Différence entre la série python2 et la série python3 dict.keys ()
Python - Différence entre exec et eval
[Python] Différence entre randrange () et randint ()
[Python] Différence entre trié et trié (Colaboratoire)
[Xg boost] Différence entre softmax et softprob
différence entre les instructions (instructions) et les expressions (expressions) en Python
[Django ORM] Différence entre values () et only ()
Différence entre @classmethod et @staticmethod en Python
Différence entre append et + = dans la liste Python
Différence entre non local et global en Python
Différence entre la régression linéaire, la régression Ridge et la régression Lasso
Différence entre le fichier env_file docker-compose et le fichier .env
[Python Iroha] Différence entre List et Tuple
[python] Différence entre la sortie rand et randn
Différence de vitesse entre wsgi, bouteille et flacon
Différence entre ls -l et la commande cat
Quelle est la différence entre «pip» et «conda»?
Différence entre l'utilisation et l'importation sur le langage de bouclier
[python] Différence entre variable et self. Variable dans la classe
À propos de la différence entre "==" et "is" en python
À propos de la différence entre PostgreSQL su et sudo
Quelle est la différence entre Unix et Linux?
Prise en compte de la différence entre la courbe ROC et la courbe PR
Différence approximative entre Unicode et UTF-8 (et ses compagnons)
Examiner la relation entre TensorFlow et Keras pendant la période de transition
BERT peut-il comprendre la différence entre «Ame (bonbons)» et «Ame (pluie)»?
Différence entre Ruby et Python en termes de variables
Quelle est la différence entre usleep, nanosleep et clock_nanosleep?
Différence entre la notation Numpy (n,) et (n, 1) [Différence entre le vecteur horizontal et le vecteur vertical]
Différence entre return, return None et no return description en Python
Comment utiliser argparse et la différence entre optparse
optuna, keras et titanic
Entre paramétrique et non paramétrique
Quelle est la différence entre les liens symboliques et les liens durs?
Module Python num2words Différence de comportement entre l'anglais et le russe
Python> Différence entre la sortie inpbt et print (inpbt)> [1. 2. 3.] / array ([1., 2., 3.], dtype = float32)
Comprendre la différence entre l'affectation cumulative aux variables et l'affectation cumulative aux objets
Méthode de concaténation de liste en python, différence entre list.extend () et opérateur «+»
Différence entre les back_populates et backref de SQL Alchemy et lorsque ni l'un ni l'autre n'est utilisé
Différence entre le processus de premier plan et le processus d'arrière-plan compris par principe