Keras 如何修改圖片通道的順序
1. Error
在使用Keras.layers.convolutional.Convolution2D的時候
Convolution2D(32, 5, 5, border_mode='valid', input_shape=(1, 28, 28), activation='relu')
報如下錯誤:
OverflowError: Range exceeds valid bounds
這是因為Keras配置圖片通道順序錯誤導致的。上面代碼使用圖片通道順序是[channels][height][width]
2. 修改圖片通道順序
檢查 ~/.keras/keras.json文件
if "image_dim_ordering": is "th" and "backend": "theano", your input_shape must be (channels, height, width) if "image_dim_ordering": is "tf" and "backend": "tensorflow", your input_shape must be (height, width, channels)
所以,要保證你使用的通道順序和配置的通道順序一致
或者通過這樣修改
from keras import backend backend.set_image_dim_ordering('th')
補充:Keras設置後端數據維度順序
Keras是比較高級的深度學習框架,其對幾個比較常見的主流深度學習框架的封裝而來,也就是按照Keras的說法就是其後端是以Tensorflow、Theano和CNTK為基礎封裝而來。
CNTK我沒做過多瞭解,tensorflow的tensor的維度順序和Theano的維度順序是不一樣的,所以在使用Keras的時候要格外註意這一點,如果後端不同的話,設置的數據維度順序也是要不一樣的。
tensorflow的數據維度默認順序是channels_last的好像,也就是說其一個tensor的數據維度是[samples,rows,cols,channels],而Theano不同,其數據順序是channels_first,也就是[samples,rows,cols,channels],這個其實也就是這兩個框架的不同而已,如果用keras來寫深度學習模型的話,其實就隻要設置好後端基本也沒啥問題,也不必太考慮數據維度的問題。
但是Keras的數據維度是可以改變的,即使是使用tensorflow為後端,Keras的數據格式也可以是channels_first的,並且這個是可以通過配置文件來改,也可以通過代碼來改的。
Keras的配置文件默認是在$HOME/.keras/keras.json,可以用txt編輯器打開直接修改後端配置的:
{ "floatx": "float32", "epsilon": 1e-07, "image_data_format": "channels_last", "backend": "tensorflow" }
這是我的windows下的配置信息,默認是以tensorflow為後端,數據格式是channels_last,但是我有個小項目是一開始是以Theano為後端來寫的,本來就隻要稍微改一下就好,但是因為隻是這個項目需要改為Theano,所以我並沒有直接改配置文件,而是在代碼裡修改後端,這裡需要用到Keras的後端backend來實現,修改的代碼如下:
from keras import backend as BK BK.set_image_data_format("channels_first") BK.set_image_dim_ordering("th")
這樣設置之後再這個程序跑起來的時候其後端並不會被改變,改變的隻是數據的維度順序而已,而且僅僅是針對當前的程序,對其它程序是不影響的。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 基於keras中import keras.backend as K的含義說明
- keras修改backend的簡單方法
- 關於keras中的Reshape用法
- 關於keras中卷積層Conv2D的學習記錄
- pycharm中keras導入報錯無法自動補全cannot find reference分析