Vấn đề Channel_first khi sử dụng MXNet là Keras Backend

keras

#1

Mình có thử sử dụng Keras với backend là MXNet. Sau khi tạo môi trường mới với conda và cài đặt mxnet, mxnet-cu90, keras-gpu, etc., mình sửa file .keras.json theo hướng dẫn

{
    "image_data_format": "channels_first",
    "epsilon": 1e-07,
    "floatx": "float32",
    "backend": "mxnet"
}

sau đó mình dùng input với format sau: input = Input(shape=(img_channels, img_height, img_width))

nhưng khi stack Conv2D, mình vẫn gặp lỗi sau:

UserWarning: MXNet Backend performs best with `channels_first` format. Using `channels_last` will significantly reduce performance due to the Transpose operations. For performance improvement, please use this API`keras.utils.to_channels_first(x_input)`to transform `channels_last` data to `channels_first` format and also please change the `image_data_format` in `keras.json` to `channels_first`.Note: `x_input` is a Numpy tensor or a list of Numpy tensorRefer to: https://github.com/awslabs/keras-apache-mxnet/tree/master/docs/mxnet_backend/performance_guide.md
  train_symbol = func(*args, **kwargs)

và khi stack thêm nhiều Conv2D hơn thì bị lỗi dimension:

 File "/home/cngc3/anaconda3/envs/mxnet-gpu/lib/python3.5/site-packages/mxnet/base.py", line 149, in check_call
    raise MXNetError(py_str(_LIB.MXGetLastError()))
mxnet.base.MXNetError: Error in operator max_pooling2d_6/pool2d1: [14:16:41] src/operator/nn/pooling.cc:141: Check failed: param.kernel[0] <= dshape[2] + 2 * param.pad[0] kernel size (3) exceeds input (1 padded to 1)

khi mình sửa lại input thành (shape=(img_height, img_width, img_channels)) thì vẫn bị UserWarning nhưng network train được bình thường.

Mọi người có thể giúp xem mình có thể sửa lỗi vấn đề này như thế nào được không?


#2

Đây là warning không phải lỗi bạn ạ. Nếu bạn khó chịu về warning thì bạn có thể tắt nó đi.

import warnings
warnings.filterwarnings("ignore")

Lỗi này mình nghĩ không đến từ việc bạn set channel là last hay first. Mình nghĩ là do setting Conv2D của bạn sai. Bởi vì trên kia bạn thử một vài Conv2D đã thành công rồi. Bạn check xem có padding không? Hãy thử padding=“same” xem sao.


#3

mình có sử dụng padding bạn ạ. Bình thường với TF Backend thì mình có thể stack thêm 2 block Conv2D và MaxPooling nữa mà không gặp vấn đề gì. Nên mình nghĩ MXNet vẫn đang sử dụng format channel last chứ chưa nhận format channel first