LoginSignup
15
18

More than 5 years have passed since last update.

Kerasで1チャネル画像をCNNするときに詰まった話

Last updated at Posted at 2019-04-30

これは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読しておくべきでした.

参考 🙇‍♂️

Coreレイヤー - Keras Documentation

15
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
18