質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.59%

「AttributeError: module 'keras.backend' has no attribute 'image_dim_ordering'」の解消方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,032

score 5

前提・実現したいこと

下記URLのコードを参考に、手書き文字認識プログラムを作成したいです。
https://github.com/yukoba/CnnJapaneseCharacter 
(紹介記事:https://qiita.com/yukoba/items/7a687e44395783eb32b1)

conda環境にて「learn.py」を実行したところ、以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

Traceback (most recent call last):
  File "learn.py", line 32, in <module>
    if K.image_dim_ordering() == 'th':
AttributeError: module 'keras.backend' has no attribute 'image_dim_ordering'

該当のソースコード

# This code is based on
# https://github.com/fchollet/keras/blob/master/examples/mnist_cnn.py
# https://github.com/fchollet/keras/blob/master/examples/cifar10_cnn.py

import numpy as np
#import scipy.misc
from PIL import Image
from keras import backend as K
from keras import initializers
from keras.layers import Convolution2D, MaxPooling2D
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.models import Sequential
from keras.preprocessing.image import ImageDataGenerator
from keras.utils import np_utils
from sklearn.model_selection import train_test_split

nb_classes = 72
# input image dimensions
img_rows, img_cols = 32, 32
# img_rows, img_cols = 127, 128

ary = np.load("hiragana.npz")['arr_0'].reshape([-1, 127, 128]).astype(np.float32) / 15
X_train = np.zeros([nb_classes * 160, img_rows, img_cols], dtype=np.float32)
for i in range(nb_classes * 160):
    X_train[i] = np.array(Image.fromarray(ary[i]).resize((img_cols,img_rows)))
    # X_train[i] = scipy.misc.imresize(ary[i], (img_rows, img_cols), mode='F')
    # X_train[i] = ary[i]
    Y_train = np.repeat(np.arange(nb_classes), 160)

X_train, X_test, Y_train, Y_test = train_test_split(X_train, Y_train, test_size=0.2)

if K.image_dim_ordering() == 'th':
    X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols)
    X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols)
    input_shape = (1, img_rows, img_cols)
else:
    X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 1)
    X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1)
    input_shape = (img_rows, img_cols, 1)

# convert class vectors to binary class matrices
Y_train = np_utils.to_categorical(Y_train, nb_classes)
Y_test = np_utils.to_categorical(Y_test, nb_classes)

datagen = ImageDataGenerator(rotation_range=15, zoom_range=0.20)
datagen.fit(X_train)

model = Sequential()


def my_init(shape, name=None):
    return initializers.normal(shape, scale=0.1, name=name)


# Best val_loss: 0.0205 - val_acc: 0.9978 (just tried only once)
# 30 minutes on Amazon EC2 g2.2xlarge (NVIDIA GRID K520)
def m6_1():
    model.add(Convolution2D(32, 3, 3, init=my_init, input_shape=input_shape))
    model.add(Activation('relu'))
    model.add(Convolution2D(32, 3, 3, init=my_init))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.5))

    model.add(Convolution2D(64, 3, 3, init=my_init))
    model.add(Activation('relu'))
    model.add(Convolution2D(64, 3, 3, init=my_init))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.5))

    model.add(Flatten())
    model.add(Dense(256, init=my_init))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(nb_classes))
    model.add(Activation('softmax'))


def classic_neural():
    model.add(Flatten(input_shape=input_shape))
    model.add(Dense(256))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))

    model.add(Dense(nb_classes))
    model.add(Activation('softmax'))


m6_1()
# classic_neural()

model.summary()
model.compile(loss='categorical_crossentropy', optimizer='adadelta', metrics=['accuracy'])
model.fit_generator(datagen.flow(X_train, Y_train, batch_size=16), samples_per_epoch=X_train.shape[0],
                    nb_epoch=400, validation_data=(X_test, Y_test))

試したこと

①32行目「K.image_dim_ordering()」を「K.image_data_format()」に置換
TypeError: ('Keyword argument not understood:', 'init')が発生
参考URL:https://github.com/keras-team/keras/issues/12649

②kerasのバージョンを2.2.4にダウン
AttributeError: module 'tensorflow' has no attribute 'get_default_graph'が発生
参考URL:https://qiita.com/ryoo/items/89e29ec4cfb956e7af9c

③②のバージョン状態で下記参考URLの①~⑤を実行
→①~③:ImportError: cannot import name 'np_utils' from 'tensorflow.keras.utils'が発生
④:Could not find a version that satisfies the requirement keras==1.4 が発生
⑤:AttributeError: module 'keras.backend' has no attribute 'image_dim_ordering'が発生(振出しに戻る)
参考URL:https://qiita.com/white1107/items/67ec0826a07a84442d31

お答えいただける範囲でアドバイスいただければ幸いです。
追加すべき情報等ありましたらご指摘ください。

補足情報(FW/ツールのバージョンなど)

conda 4.9.2
keras 2.3.1
※※同プログラムについて以下URLにて質問させていただきました。当該エラーは解消できたのですが、新たにエラーが発生したため、改めて質問させていただいた次第です。ソースコードからの変更箇所等は下記URLもご参照いただければ幸いです※※
https://teratail.com/questions/315642

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

既に解決策が判明しているかもしれませんが、、
keras 2.3.1 では keras.backend.image_dim_ordering() がなく、代わりに keras.backend.image_data_format() が使用できるようです。

そこで以下のように keras.backend.image_data_format() を使用すれば該当エラーが解消されるかと思います:

if K.image_data_format() == 'channels_first': # <- ココを変更
    X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols)
    X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols)
    input_shape = (1, img_rows, img_cols)
else:
    X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 1)
    X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1)
    input_shape = (img_rows, img_cols, 1)

このことに関しては以下の Issue の一連が多少参考になるかと思います。
https://github.com/keras-team/keras/issues/12649
関数が返す値の対応関係については、上記 Issue の TheHugeManatee commented on 7 Apr 2020 をご参考ください:

# TheHugeManatee commented on 7 Apr 2020
The way I understand it, with the new API:
setting:
K.set_image_dim_ordering('tf') --> K.set_image_data_format('channels_last')
K.set_image_dim_ordering('th') --> K.set_image_data_format('channels_first')

checking:
K.image_dim_ordering() == 'tf' --> K.image_data_format() == 'channels_last'
K.image_dim_ordering() == 'th' --> K.image_data_format() == 'channels_first'

I'm not very familiar with it so there might be other edge cases.

[Edited: Corrected the order as per @CarMiranda 's comment below]

また、上記 Issue の aclex commented on 20 Sep 2019 によれば v2.2.4 -> v2.2.5 のタイミングで関数の変更が入ったようです:

# aclex commented on 20 Sep 2019
From my little version-wise research, this attribute disappears in 2.2.4 -> 2.2.5 version change. So in my case everything still works fine with 2.2.4.

Thanks everyone for suggestions to fix it!

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/01/14 14:50

    ご回答ありがとうございます。いただいた情報で解決できました!image_dim_ordering()だけでなく右辺も修正する必要が合ったのですね。勉強になりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る