これはKerasを全く知らない人にはちんぷんかんぷんな記事となっています.
はじめに
Pythonの機械学習フレームワーク「Keras」を使って,
NNの練習をしていた時のこと.
これは, 1チャネル画像のCNNの実装で詰まった時の備忘録である.
ちなみに, ことの発端は次のようなエラーだった.
error_1
ValueError: Input 0 is incompatible with layer conv2d_1: expected ndim=4, found ndim=3
環境 🖥
- python 3.6.5
- keras 2.2.4
今回の役者たち
from keras.layer import(
Input, Conv2D, Reshape
)
なお、modelはSequential()ではなくFunctionalAPIを使ってます.
詰まったところ 😓
エラーを見る限り、Conv2D()への入力層_inputに問題がある.
「入力層の次元は3次元じゃなくて, 4次元でお願い!」とのことなので, 以下のように改善した.
modification_1
# === 変更前 ===
input = Input(shape = (28,28,))
hidden = Conv2D( /*some args*/ )(_input)
# === 変更後 ===
input = Input(shape = (28,28,1)) # <-- ここを変えた!
hidden = Conv2D( /*some args*/ )(_input)
しかし, またエラー.
error_2
ValueError: Error when checking input: expected input_1 to have 4 dimensions, but got array with shape (/*画像の枚数*/, 28, 28)
modelの期待する入力と入力データのshapeが合わない, と言われた.
...
当たり前だ.さっき自分で変えたではないか.
modelの期待する入力 | 実データのshape |
---|---|
(28,28,1) | (28,28) |
ここで詰まったわけです.
答えは公式ドキュメントにありました.
これで解決 😆
justice!!
input = Input(shape = (28,28))
hidden = Reshape((28, 28, 1), input_shape = (28, 28))(input) # <-- ここを加えた!
Conv2D( /*some args*/ )(hidden)
modelで受け取るときは (28,28)で, その後 (28, 28, 1) にreshapeして畳み込み層に渡せばオッケー.
感想 ♨️
エラーで調べても似て非なるものばっかりで,
かと言って「keras 1チャネル画像 cnn」とかで検索しても解決せず, 詰まってしまったのは反省.
公式ドキュメントは全体をバーっと1読しておくべきでした.