Es ist schon eine Weile her, seit ich es gepostet habe. Wie Sie auf Github sehen können, scheint das Multi-Backend-Keras die Entwicklung im April 2020 beendet zu haben. Es wird in Zukunft durch Keras in Tensorflow ersetzt. keras-team (Der Einfachheit halber wird das Multi-Backend-Keras als mb-keras und das Tensorflow-Keras als tf-keras bezeichnet.) Ich möchte mb-keras und tf-keras in diesem Artikel vergleichen und verifizieren.
Wie in dem oben erwähnten Github erwähnt, scheint es bis zu Tensorflow 2.0 zu unterstützen. Ab dem 4. Mai 2020, zum Zeitpunkt des Schreibens dieses Artikels, ist der neueste Stabilisator von Tensorflow 2.1.0.
Beim Schreiben dieses Artikels habe ich Tensorflow von CUDA usw. neu installiert, aber eine schlechte Umgebung geschaffen. mb-keras unterstützt bis zu Python 3.6 ... (Tensorflow unterstützt bis zu Python 3.7) mb-keras 2.3.1 unterstützt bis zu Tensorflow 2.0, das ist also gut so.
python -V
3.7.6
>>> import keras
>>> keras.__version__
'2.3.1'
>>> import tensorflow
>>> tensorflow.__version__
'2.0.0'
Es ist im Grunde das gleiche, nur ein Tensorfluss am Anfang.
mb-keras
from keras.layers import Dense, Conv2D
tf-keras
from tensorflow.keras.layers import Dense, Conv2D
Wahrscheinlich nicht **. Kompatibilität ist jedoch nicht erforderlich ... Überprüfen Sie mit dem Code unten.
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
_________________________________________________________________
Die Ausgabeform des InputLayer ist unterschiedlich, kann sie jedoch als dieselbe Architektur implementiert werden? Ich möchte es ab dem nächsten Mal überprüfen. Derzeit scheint es, dass die Erstellung von Layer zwischen mb-keras und tf-keras unterschiedlich ist, so dass es sicher ist, dass es nicht in Model geworfen werden kann.
Optimizer kann tf-keras Optimizer für Modelle verwenden, die mit mb-keras erstellt wurden.
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>)
Das scheint ganz anders zu sein. ○ ist implementiert, × ist nicht implementiert. Beachten Sie, dass nicht alle Ebenen sind, da wir die von dir () herausgenommenen Ebenen fast so angeordnet haben, wie sie sind. Wenn man den Unterschied in der Aufmerksamkeit betrachtet, ist tf-keras in Bezug auf Revision und Abschaffung weiter fortgeschritten? (Die Überschreibungsmethode und alle Kleinbuchstaben sind funktionsähnlich, daher habe ich sie aus der Liste entfernt.)
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
ist in mb-keras implementiert.Es stellt sich heraus, dass mb-keras und tf-keras fast inkompatibel sind. Ich habe jedoch kein Bedürfnis.
Als ein Fall, der ein Problem zu sein scheint, unterstützt mb-keras bis zu Python 3.6, so dass es auch dann nicht unterstützt wird, wenn Python in Zukunft aktualisiert wird. Andererseits wird die Entwicklung von tf-keras auch in Zukunft fortgesetzt. Wenn Sie ein KI-System erstellt haben, das mb-keras verwendet, sind Sie möglicherweise von der Zeit überfordert. Sie sollten daher sofort in Betracht ziehen, es durch tf-keras zu ersetzen. Als konkretes Beispiel, das zuerst in den Sinn kommt, ** Kann ein mit mb-keras erstelltes trainiertes Modell mit tf-keras geladen und abgeleitet werden? ** Toka Toka ··· (Ich weiß nicht, wann es # 2 oder später sein wird.)
Eigentlich habe ich gerade ein internes KI-System mit MB-Keras vor GW gebaut ... Wenn Sie der Meinung sind, dass Keras in letzter Zeit nicht aktualisiert wurde, ist dies der richtige Ort. Ich hab es geschafft ...
Recommended Posts