hetare
@hetare

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

AttributeError: module 'keras.api._v2.keras.optimizers' has no attribute 'adam'

解決したいこと

エラーを解決して下記のコード animal_cnn.pyを実行できるようにしたいです。

ちなみにtechpitの「TensorFlow・Keras・Python・Flaskで作る機械学習アプリ開発入門」という教材の
「1-4 モデルを定義してトレーニングとテストを行おう」の箇所になります。
該当の教材内では質問ができないようになっているためこちらでさせていただいた次第です。

発生している問題・エラー

python3 animal_cnn.py を実行するとこうなります。

% python3 animal_cnn.py
File "animal_cnn.py", line 12, in <module>
    opt = tf.keras.optimizers.adam()
AttributeError: module 'keras.api._v2.keras.optimizers' has no attribute 'adam'

調べて参考記事をもとにいろいろコードをいじったのですがそれでもこうなります。

 % python3 animal_cnn.py
 File "animal_cnn.py", line 10, in <module>
    from keras.optimizers import Adam
ImportError: cannot import name 'Adam' from 'keras.optimizers' (/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/keras/optimizers.py)

該当するソースコード

現在のコードです。

animal_cnn.py
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.utils import np_utils

import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import optimizers
from keras.optimizers import Adam

opt = tf.keras.optimizers.Adam()

classes = ["monkey", "boar", "crow"]
num_classes = len(classes)
image_size = 50

def main():
    # NumPy形式の配列データを読み込む
    X_train, X_test, y_train, y_test = np.load("./animal.npy",allow_pickle=True)

    # 255で割って0~1の値に正規化する
    X_train = X_train.astype("float") / 255
    X_test = X_test.astype("float") / 255

    # to_categorical関数でone-hotベクトル形式に変換する
    y_train = np_utils.to_categorical(y_train, num_classes)
    y_test = np_utils.to_categorical(y_test, num_classes)

    # トレーニングの実行
    model = model_train(X_train, y_train)
    # モデルの精度評価(未使用データの推定精度を計算する)
    model_eval(model, X_test, y_test)


def model_train(X, y):
    # ニューラルネットワークを新規に生成する
    model = Sequential()

    # 2つの畳込み層を追加する。プーリング処理でデータ削減、 ドロップアウト処理を加える
    model.add(Conv2D(32,(3, 3),  padding='same', input_shape=X.shape[1:]))
    model.add(Activation('relu'))
    model.add(Conv2D(32,(3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    # 2つの畳込み層を追加する。プーリング処理でデータ削減、 ドロップアウト処理を加える 
    model.add(Conv2D(64, (3,3), padding='same'))
    model.add(Activation('relu'))
    model.add(Conv2D(64, (3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    # データを直列に並べて全結合層を追加、 最終的に3つのノードにデータを出力
    model.add(Flatten())
    model.add(Dense(512))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(3))
    model.add(Activation('softmax'))

    # 最適化アルゴリズムの指定(adam、 rmsprop、 sgdなどがある)
    opt = tf.keras.optimizers.adam()

    # 損失関数の宣言(カテゴリカルクロスエントロピー)
    model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])

    # トレーニングの実行
    model.fit(X, y, batch_size=32, epochs=100)

    # モデルの保存
    model.save('./animal_cnn.h5')

    return model

def model_eval(model, X, y):
    scores = model.evaluate(X, y, verbose=1) # 評価関数に投入
    print('Test Loss: ', scores[0]) # スコアの先頭のデータを取得・表示
    print('Test Accuracy: ', scores[1]) # スコアの2番めのデータを取得・表示

if __name__ == "__main__":
    main()

自分で試したこと

教材のとおりですと最初はコードは下記のとおりでした。

animal_cnn.py
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.utils import np_utils
import keras
import numpy as np

classes = ["monkey", "boar", "crow"]
num_classes = len(classes)
image_size = 50

def main():
    # NumPy形式の配列データを読み込む
    X_train, X_test, y_train, y_test = np.load("./animal.npy",allow_pickle=True)

    # 255で割って0~1の値に正規化する
    X_train = X_train.astype("float") / 255
    X_test = X_test.astype("float") / 255

    # to_categorical関数でone-hotベクトル形式に変換する
    y_train = np_utils.to_categorical(y_train, num_classes)
    y_test = np_utils.to_categorical(y_test, num_classes)

    # トレーニングの実行
    model = model_train(X_train, y_train)
    # モデルの精度評価(未使用データの推定精度を計算する)
    model_eval(model, X_test, y_test)


def model_train(X, y):
    # ニューラルネットワークを新規に生成する
    model = Sequential()

    # 2つの畳込み層を追加する。プーリング処理でデータ削減、 ドロップアウト処理を加える
    model.add(Conv2D(32,(3, 3),  padding='same', input_shape=X.shape[1:]))
    model.add(Activation('relu'))
    model.add(Conv2D(32,(3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    # 2つの畳込み層を追加する。プーリング処理でデータ削減、 ドロップアウト処理を加える 
    model.add(Conv2D(64, (3,3), padding='same'))
    model.add(Activation('relu'))
    model.add(Conv2D(64, (3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    # データを直列に並べて全結合層を追加、 最終的に3つのノードにデータを出力
    model.add(Flatten())
    model.add(Dense(512))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(3))
    model.add(Activation('softmax'))

    # 最適化アルゴリズムの指定(adam、 rmsprop、 sgdなどがある)
    opt = tf.keras.optimizers.adam()

    # 損失関数の宣言(カテゴリカルクロスエントロピー)
    model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])

    # トレーニングの実行
    model.fit(X, y, batch_size=32, epochs=100)

    # モデルの保存
    model.save('./animal_cnn.h5')

    return model

def model_eval(model, X, y):
    scores = model.evaluate(X, y, verbose=1) # 評価関数に投入
    print('Test Loss: ', scores[0]) # スコアの先頭のデータを取得・表示
    print('Test Accuracy: ', scores[1]) # スコアの2番めのデータを取得・表示

if __name__ == "__main__":
    main()

いろいろ調べたりしてよくわからないながら下記の記事を参考にし、

kerasやtensorflowのimportあたりで何か問題があるのかなと思って下記の部分を変更し現在のコードに至っています。

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.utils import np_utils
import keras
import numpy as np

↓ 変更

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.utils import np_utils

import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import optimizers
from keras.optimizers import Adam

opt = tf.keras.optimizers.Adam()

対応方法についてアドバイスいただけますと幸いです。

0

1Answer

投稿し失礼します。
僕も同じ講座をやっておりまして、同じ個所で、同じエラーがでました。

下記のドキュメントを見まして、解決できました。
https://www.tensorflow.org/api_docs/python/tf/keras/optimizers/Adam

*** 解決 ***

  ### 変更
  # import keras  # 講座記載のコード
  from tensorflow import keras # 変更
  
  X_train, X_test, y_train, y_test = np.load("./animal.npy") # 講座コード
  X_train, X_test, y_train, y_test = np.load("./animal.npy", allow_pickle=True) # 変更

#opt = keras.optimizers.adam() # 講座記載のコード
opt = keras.optimizers.Adam() # 変更

*** 一応 ソース全文です。 ***
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.utils import np_utils

from sklearn import datasets, svm, metrics
from sklearn.model_selection import train_test_split

変更

import keras

from tensorflow import keras

import numpy as np

classes = ["monkey", "boar", "crow"]
num_classes = len(classes)
image_size = 50

def main():

# NumPy形式の配列データを読み込む
X_train, X_test, y_train, y_test = np.load("./animal.npy", allow_pickle=True)

# 255で割って0~1の値に正規化する
X_train = X_train.astype("float") / 255
X_test = X_test.astype("float") / 255

# to_categorical関数でone-hotベクトル形式に変換する
y_train = np_utils.to_categorical(y_train, num_classes)
y_test = np_utils.to_categorical(y_test, num_classes)

# トレーニングの実行
model = model_train(X_train, y_train)

# モデルの精度評価(未使用データの推定精度を計算する)
model_eval(model, X_test, y_test)

def model_train(X, y) :
# ニューラルネットワークを新規に生成する
model = Sequential()

# 2つの畳込み層を追加する。プーリング処理でデータ削減、 ドロップアウト処理を加える
model.add(Conv2D(32, (3,3), padding='same', input_shape=X.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32,(3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

# 2つの畳込み層を追加する。プーリング処理でデータ削減、 ドロップアウト処理を加える 
model.add(Conv2D(64, (3,3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

# データを直列に並べて全結合層を追加、 最終的に3つのノードにデータを出力
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(3))
model.add(Activation('softmax'))

# 最適化アルゴリズムの指定(adam、 rmsprop、 sgdなどがある)
#opt = keras.optimizers.adam()
opt = keras.optimizers.Adam()

# 損失関数の宣言(カテゴリカルクロスエントロピー)
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])

# トレーニングの実行
model.fit(X, y, batch_size=32, epochs=100)

# モデルの保存
model.save('./animal_cnn.h5')

return model

def model_eval(model, X, y) :
scores = model.evaluate(X, y, verbose=1) # 評価関数に投入
print('Test Loss: ', scores[0]) # スコアの先頭のデータを取得・表示
print('Test Accuracy:' , scores[1]) # スコアの2番めのデータを取得・表示

if name == "main" :
main()

1Like

Comments

  1. @hetare

    Questioner

    お教えいただきありがとうございます!
  2. @hetare さんが無事にプログラムが動きましたら幸いです。

Your answer might help someone💌