Posted at

plaidMLの落とし穴

More than 1 year has passed since last update.


plaidMLでKerasのコードをそのまま実行

TypeError: Failed to convert object of type <class 'plaidml.tile.Value'> to Tensor. Contents: Tanh FLOAT32(<tile.Value Operation UINT64()>, 64). Consider casting elements to a supported type.

こんなエラーが出ることがあります。よくあるのが

layer = Lambda(lambda x: tf.sqrt(x))(prev_layer)

こんな感じでKerasのLambda内部でTensorflowのメソッドを直接使っている場合です。plaidMLが定義しているクラスのインスタンスをTensorflowのメソッドの引数にしたらクラスが違うのだからそりゃダメだよね、という事で

import keras.backend as K

layer = Lambda(lambda x: K.sqrt(x))(prev_layer)

kerasのバックエンドメソッドを利用しましょう。これらのメソッドはplaidML側で受け皿がちゃんと用意されているようです。

ただし、Tensorflowの豊富なメソッドが全てバックエンド関数で使える訳ではないので工夫が必要になることも多いです。