この問題にアプローチする最善の方法は、カスタム操作を作成することです。カスタム操作を追加する方法の詳細については、this tutorialを参照してください。 REGISTER_OP
は、tf.image.resize_bicubic()
opの呼び出しはtensorflow/core/ops/image_ops.cc
です。
別の方法としては、再使用するのと同じOP登録することであり、代替実装で新しいカーネルを登録します。これにより、(実験的)Graph.kernel_label_map()
APIを使用して"ResizeBicubic"
opの代替実装を選択することができます。
_ = tf.load_op_library(...) # Load the .so containing your implementation.
with tf.get_default_graph().kernel_label_map({"ResizeBicubic": "my_impl"}):
images = tf.image.resize_bicubic(...) # Will use your implementation.
を...そして、あなたのC++コードでラベル"my_impl"
を指定するカーネルの登録を追加します:たとえば、あなたはPythonプログラムで次の操作を行うことができ
template <typename Device, typename T>
class MyResizeBicubicOp<Device, T> : public OpKernel {
// Custom implementation goes here...
}
#define REGISTER_KERNEL(T) \
REGISTER_KERNEL_BUILDER(Name("ResizeBicubic") \
.Device(DEVICE_CPU) \
.Label("my_impl") \
.TypeConstraint<T>("T") \
.HostMemory("size"), \
MyResizeBicubicOp<CPUDevice, T>);
TF_CALL_REAL_NUMBER_TYPES(REGISTER_KERNEL);
をmrryありがとうございます。私は両方の方法を試して、彼らは働いています。しかし、パフォーマンスは非常に悪いです。カスタムopは組み込みのresize_bicubicよりも10倍遅いです。私はTensorflowのresize_bicubic実装から何も変更せずにコードを直接コピーしました(この新しいopを追加することによって必要とされる変更を除く)。それは普通ですか? – denru
10倍の減速は驚くべきことです。拡張機能をビルドする際にコンパイラの最適化フラグが同じであることを確認しましたか? – mrry
私はチュートリアルで提供されているコマンドを使用します:TF_INC = $(python -c 'tf; print(tf.sysconfig.get_include())'); g ++ -std = C++ 11 -shared zero_out.cc -o zero_out.so -fPIC -I $ TF_INC – denru