Kerasの開発終了
投稿はかなり久しぶりになってしまいました。
githubにある通り、マルチバックエンドのKerasは2020年4月で開発終了となったようです。
今後はTensorflowにあるKerasに置き換わるとの事。
keras-team
(便宜上、マルチバックエンドのKerasをmb-keras、TensorflowのKerasをtf-kerasと表現する)
mb-kerasとtf-kerasの比較と検証を本記事でしておきたい。
※今回は#1としておき、随時記事を追加していきたい。
mb-kerasのTensorflowのサポートについて
前述のgithubにある通り、Tensorflow2.0までのサポートとなっている模様です。
この記事を書いている2020年5月4日現在、Tensorflowの最新安定板は2.1.0です。
環境
この記事を書くにあたって、TensorflowをCUDAなどから入れなおしたが、イマイチな環境を作ってしまった。
mb-kerasはPython3.6までのサポートだ・・・・(tensorflowはPython3.7までサポート)
mb-keras 2.3.1はtensorflow 2.0までサポートなので、こちらは良い。
python -V
3.7.6
>>> import keras
>>> keras.__version__
'2.3.1'
>>> import tensorflow
>>> tensorflow.__version__
'2.0.0'
エイリアス
基本的にそのままで、頭にtensorflowが付くだけです。
from keras.layers import Dense, Conv2D
from tensorflow.keras.layers import Dense, Conv2D
オブジェクトの互換性
多分無いです。ただし、互換性の必要も無いかと・・・
下記コードにて、確認。
ModelとLayerについて
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
※1の実行時エラー発生(mb-kerasのModelにtf-kerasのLayerを突っ込む)
TypeError: object of type 'Dense' has no len()
※2の実行時エラー発生(tf-kerasのModelにmb-kerasのLayerを突っ込む)
AttributeError: 'tuple' object has no attribute 'layer'
※3の実行結果
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
_________________________________________________________________
※4の実行結果
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
_________________________________________________________________
InputLayerのOutput shapeの出方が違うんだが、同じアーキテクチャとして実装できているのだろうか・・・?
次回以降で確認したい。
とりあえず、Layerの作りがmb-kerasとtf-kerasで違うみたいなので、Modelに放り込めないことは確かだ。
Optimizerについて
Optimizerはmb-kerasで作ったModelにtf-kerasのOptimizerが使える。
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
※1はエラーにならない。
※2は下記のエラー。
ValueError: ('Could not interpret optimizer identifier:', <keras.optimizers.Adam object at 0x000001A4FC663F08>)
使えるレイヤーについて
これは結構な差がある模様。それぞれ○は実装あり、×は実装なし。
dir()で取り出したものをほとんどそのまま並べただけなので、すべてがLayerではないことに注意。
Attentionの差とか見ると、改廃はtf-kerasの方が進んでいるのかな・・・?
(オーバーライドメソッドと全小文字はfunctionぽいので一覧から削除した)
| 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 | ○ | ○ |
※mb-kerasにはwrapperが実装されている。 |
今回のまとめ
mb-kerasとtf-kerasはほとんど互換性は無いことが分かった。
ただし、あまり必要性は感じない。
問題になると考えられるケースとしてはmb-kerasはPython3.6までのサポートなので、今後Pythonがアップデートしていってもこちらはサポートされない。
また、一方でtf-kerasの方は今後も開発が継続される。
mb-kerasを使ったAIシステムを作りこんでしまっていると、時代に置いてけぼりを食らう可能性があるのでtf-kerasへのリプレースを早急に検討すべきではないかと。
真っ先に思いつく具体例としては**mb-kerasで作った学習済みモデルはtf-kerasでロードして推論できるのか・・・?**とかとか・・・
(いつになるかわからない#2以降に記録したい。)
実はGW前にmb-kerasで社内AIシステムを構築したばかりである・・・
kerasのアップデートが最近ないなと思ったらこのザマである。
まずった・・・