【Keras】plaidmlとTensorflowの些細な違い

自分用のメモ。

非Nvidia製GPUを搭載するパソコンを使ってる人で、
plaidmlをバックエンドとして自PCからGPU高速学習することと
Google ColabでGPUを使うことを併用している人には役立つかもしれない。

逐次更新していこうと思う。

1.Keras.callbacks関連

1-1. 正解率を表す単語の違い

ModelCheckpointというコールバックでは、
1エポックごとにモデルをファイルに書き出してくれる。
しかもファイル名に正解率だったり損失だったりをつけることもできるという優れもの。
例えば、次のようにして使う。

from keras.callbacks import ModelCheckpoint
veae.fit(
   x=train_in,
   y=train_out,
   batch_size=len(train_in),   # フルバッチ学習(0)
   epochs=1000000,             # 事実上、エポック数に制限を設けない
   verbose=1,                  # 進捗表示モードの選択
   callbacks = [\
                               # コールバックを用いて各エポックごとにモデルを保存
                               # さらにファイル名に進捗を書き込む。
       ModelCheckpoint(
           path+"/"+str(experiment_id)+ \
           "/weights.{epoch:05d}-{loss:.5f}-{accuracy:.5f}-{val_loss:.5f}-{val_accuracy:.5f}.hdf5",
           monitor='val_loss', ## 監視する値。今回は無意味。保存ファイル名が静的で、
                               ## 上書きの必要があるとき、その基準を示すためのもの
           # save_best_only=False,
           # save_weight_only=False,
                               ## Trueだと重みテンソルのみが、Falseだとモデルそのものが保存される
           period=1            ## 何エポックごとに保存するか
       )
   ],
   validation_data = (val_in, val_out)
   # 検証データ   
)

こうすると、1エポックごとにモデルがファイルに書き出される。
例えば2エポック目、損失1.93241, 正解率0.61112, 検証データの損失2.47111, 正解率0.59227の場合、
ファイル名は、「weights.00002-1.93241-0.61112-2.47111-0.59227.hdf5」となる。

Kerasのバックエンドがplaidmlの場合、正解率に対応する単語は「{acc: .5f}」でもかまわない。検証データの正解率なら「{val_acc: .5f}」でよい。
しかし、Tensorflowでこのように指定すると、1エポック終わってからエラーが発生して止まる

2. レイヤのプロパティとして出力サイズを取得する方法の違い

plaidmlでは、

from keras.layers import Input
inputs = Input(shape=(16,32))

print(inputs.shape.dims[1]) # 16
print(inputs.shape.dims[2]) # 32

print(type(inputs.shape.dims[1])) # <class 'int'>

のようにして、レイヤの出力サイズにアクセスできる。

tensorflowでは次のようにする

from keras.layers import Input 
inputs = Input(shape=(16,32))

print(inputs.shape.as_list()[1]) # 16
print(inputs.shape.as_list()[2]) # 32

print(type(inputs.shape.as_list()[1])) # <class 'int'>


この記事が気に入ったらサポートをしてみませんか?