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.
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.
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'
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
Probablement pas **. Cependant, il n'y a pas besoin de compatibilité ... Vérifiez avec le code ci-dessous.
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
TypeError: object of type 'Dense' has no len()
AttributeError: 'tuple' object has no attribute 'layer'
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.
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
ValueError: ('Could not interpret optimizer identifier:', <keras.optimizers.Adam object at 0x000001A4FC663F08>)
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 | ○ | ○ |
Wrapper
est implémenté dans mb-keras.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