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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1478閲覧

Kerasによる、ものすごくシンプルな深層学習の例のコードにおけるエラー

phpuser567

総合スコア12

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/06/18 10:52

編集2023/07/03 02:49

fruit.py

1import tensorflow as tf 2from tensorflow import keras 3from tensorflow.keras.models import Sequential 4from tensorflow.keras.layers import Activation, Dense, Dropout 5from tensorflow.keras.utils import to_categorical 6from tensorflow.keras.optimizers import Adagrad 7from tensorflow.keras.optimizers import Adam 8import numpy as np 9from PIL import Image 10import os 11 12# 学習用のデータを作る. 13image_list = [] 14label_list = [] 15 16# ./data/train 以下のorange,appleディレクトリ以下の画像を読み込む。 17for dir in os.listdir("data/train"): 18 if dir == ".DS_Store": 19 continue 20 21 dir1 = "data/train/" + dir 22 label = 0 23 24 if dir == "apple": # appleはラベル0 25 label = 0 26 elif dir == "orange": # orangeはラベル1 27 label = 1 28 29 for file in os.listdir(dir1): 30 if file != ".DS_Store": 31 # 配列label_listに正解ラベルを追加(りんご:0 オレンジ:1) 32 label_list.append(label) 33 filepath = dir1 + "/" + file 34 # 画像を25x25pixelに変換し、1要素が[R,G,B]3要素を含む配列の25x25の2次元配列として読み込む。 35 # [R,G,B]はそれぞれが0-255の配列。 36 image = np.array(Image.open(filepath).resize((25, 25))) 37 print(filepath) 38 # 配列を変換し、[[Redの配列],[Greenの配列],[Blueの配列]] のような形にする。 39 image = image.transpose(2, 0, 1) 40 # さらにフラットな1次元配列に変換。最初の1/3はRed、次がGreenの、最後がBlueの要素がフラットに並ぶ。 41 image = image.reshape(1, image.shape[0] * image.shape[1] * image.shape[2]).astype("float32")[0] 42 # 出来上がった配列をimage_listに追加。 43 image_list.append(image / 255.) 44 45# kerasに渡すためにnumpy配列に変換。 46image_list = np.array(image_list) 47 48# ラベルの配列を1と0からなるラベル配列に変更 49# 0 -> [1,0], 1 -> [0,1] という感じ。 50Y = to_categorical(label_list) 51 52# モデルを生成してニューラルネットを構築 53model = Sequential() 54model.add(Dense(200, input_dim=1875)) 55model.add(Activation("relu")) 56model.add(Dropout(0.2)) 57 58model.add(Dense(200)) 59model.add(Activation("relu")) 60model.add(Dropout(0.2)) 61 62model.add(Dense(2)) 63model.add(Activation("softmax")) 64 65# オプティマイザにAdamを使用 66opt = Adam(lr=0.001) 67# モデルをコンパイル 68model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"]) 69# 学習を実行。10%はテストに使用。 70model.fit(image_list, Y, epochs=1500, batch_size=100, validation_split=0.1) 71 72# テスト用ディレクトリ(./data/train/)の画像でチェック。正解率を表示する。 73total = 0. 74ok_count = 0. 75 76for dir in os.listdir("data/train"): 77 if dir == ".DS_Store": 78 continue 79 80 dir1 = "data/test/" + dir 81 label = 0 82 83 if dir == "apple": 84 label = 0 85 elif dir == "orange": 86 label = 1 87 88 for file in os.listdir(dir1): 89 if file != ".DS_Store": 90 label_list.append(label) 91 filepath = dir1 + "/" + file 92 image = np.array(Image.open(filepath).resize((25, 25))) 93 print(filepath) 94 image = image.transpose(2, 0, 1) 95 image = image.reshape(1, image.shape[0] * image.shape[1] * image.shape[2]).astype("float32")[0] 96 result = model.predict_classes(np.array([image / 255.])) 97 print("label:", label, "result:", result[0]) 98 99 total += 1. 100 101 if label == result[0]: 102 ok_count += 1. 103 104print("seikai: ", ok_count / total * 100, "%")

これをコマンドプロンプトで実行すると、
IndentationError: unexpected indent
というエラーが最後に出て、おそらくこのエラーが原因か、結果らしきものが出てきません、
たぶんtensorflowが対応していないことが原因と思われるのですが、どこをどうなおせばよいのでしょう?ちなみに、コマンドプロンプトで、
pip install tensorflow==1.15.5 --user
とすると、
ERROR: Could not find a version that satisfies the requirement tensorflow==1.15.5 (from versions: 2.5.0, 2.5.1, 2.5.2, 2.5.3, 2.6.0rc0, 2.6.0rc1, 2.6.0rc2, 2.6.0, 2.6.1, 2.6.2, 2.6.3, 2.6.4, 2.6.5, 2.7.0rc0, 2.7.0rc1, 2.7.0, 2.7.1, 2.7.2, 2.7.3, 2.7.4, 2.8.0rc0, 2.8.0rc1, 2.8.0, 2.8.1, 2.8.2, 2.8.3, 2.8.4, 2.9.0rc0, 2.9.0rc1, 2.9.0rc2, 2.9.0, 2.9.1, 2.9.2, 2.9.3, 2.10.0rc0, 2.10.0rc1, 2.10.0rc2, 2.10.0rc3, 2.10.0, 2.10.1, 2.11.0rc0, 2.11.0rc1, 2.11.0rc2, 2.11.0, 2.11.1, 2.12.0rc0, 2.12.0rc1, 2.12.0, 2.13.0rc0, 2.13.0rc1)

(略)
Epoch 1500/1500
1/1 [==============================] - 0s 56ms/step - loss: 4.9603e-06 - accuracy: 1.0000 - val_loss: 0.0314 - val_accuracy: 1.0000
data/test/apple/1.jpg
Traceback (most recent call last):
File "C:\Users\TOSHIBA\Desktop\python\fruit.py", line 96, in <module>
result = model.predict_classes(np.array([image / 255.]))
AttributeError: 'Sequential' object has no attribute 'predict_classes'
という謎なエラーが出て、古いバージョンもインストールできないようになっています。

参考サイトは、https://zenn.dev/hiroe_orz17/articles/53af65f491122e
です。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fiveHundred

2023/06/18 10:56

> IndentationError: unexpected indent と「インデントが悪い」と堂々とエラーメッセージに書かれているのに、 > たぶんtensorflowが対応していないことが原因と思われるのですが、どこをどうなおせばよいのでしょう? と全く関係のない結論に至った理由は何でしょう?
phpuser567

2023/06/18 12:24

すいませんコピペするエラー間違えました訂正しました。
jbpb0

2023/06/19 01:43

> これをコマンドプロンプトで実行すると、 IndentationError: unexpected indent というエラーが最後に出て、おそらくこのエラーが原因か、結果らしきものが出てきません が現状の実際と異なるのなら、質問を編集して、削除するなり、現状の実際がどうかを追記するなりしてください
jbpb0

2023/06/19 22:15 編集

> AttributeError: 'Sequential' object has no attribute 'predict_classes' result = model.predict_classes(np.array([image / 255.])) ↓ 変更 result = np.argmax(model.predict(np.array([image / 255.])), axis=-1) で、どうでしょうか? 参考 https://stackoverflow.com/questions/68776790/model-predict-classes-is-deprecated-what-to-use-instead 【追記】 質問のコードから上記のみ変更して、実行してみてください pythonとtensorflowのバージョンは、質問のコードを実行したら > Epoch 1500/1500 1/1 [==============================] - 0s 56ms/step - loss: 4.9603e-06 - accuracy: 1.0000 - val_loss: 0.0314 - val_accuracy: 1.0000 data/test/apple/1.jpg Traceback (most recent call last): (以下略) となってた時のと同じで大丈夫だと思います
phpuser567

2023/06/21 02:34

お、jbpb0さんの1行の変更だけで、うまくいったっぽいです。 ただ、pipも新しいバージョンにしてからtensorflowをインストールする必要がありました、これもコマンドで簡単にできました。 結果これです。 Epoch 1496/1500 36/36 [==============================] - 0s 498us/sample - loss: 1.1332e-04 - acc: 1.0000 - val_loss: 0.0016 - val_acc: 1.0000 Epoch 1497/1500 36/36 [==============================] - 0s 333us/sample - loss: 2.3360e-04 - acc: 1.0000 - val_loss: 0.0016 - val_acc: 1.0000 Epoch 1498/1500 36/36 [==============================] - 0s 444us/sample - loss: 1.3859e-04 - acc: 1.0000 - val_loss: 0.0016 - val_acc: 1.0000 Epoch 1499/1500 36/36 [==============================] - 0s 389us/sample - loss: 3.3977e-04 - acc: 1.0000 - val_loss: 0.0016 - val_acc: 1.0000 Epoch 1500/1500 36/36 [==============================] - 0s 443us/sample - loss: 2.6229e-04 - acc: 1.0000 - val_loss: 0.0016 - val_acc: 1.0000 data/test/apple/1.jpg label: 0 result: 1 data/test/apple/2.jpg label: 0 result: 0 data/test/apple/3.jpg label: 0 result: 0 data/test/apple/4.jpg label: 0 result: 0 data/test/apple/5.jpg label: 0 result: 0 data/test/orange/1.jpg label: 1 result: 1 data/test/orange/2.jpg label: 1 result: 1 data/test/orange/3.jpg label: 1 result: 1 data/test/orange/4.jpg label: 1 result: 1 data/test/orange/5.jpg label: 1 result: 0 seikai: 80.0 % いまいち読み方分からないのですがどうなってるんでしょう・・・???
jbpb0

2023/06/21 03:45

> label: 0 result: 1 真値:0、予測値:1 (不正解) > seikai: 80.0 % (テストデータ全体の)正解率:80%
phpuser567

2023/06/30 14:54 編集

jbpb0さんの1行の変更だけで、うまくいきました。 あとPythonのバージョンは3.6.7ですね。 これつまり各画像に対して、appleだと0、orangeだと1として、10個試して2個不正解だったから正答率80ってことなんですかね。 これ、プログラムとしては一応、研究の世界でも使えるようなものなんですかね? 数値を変更すれば、それだけ重くなるが、精度が上がる感じですかね? もちろん、教師データを増やす事が大事ですが。
jbpb0

2023/06/30 16:19

> 10個試して2個不正解だったから正答率80 そうです
guest

回答2

0

ベストアンサー

(注:実際に試したわけではないので、自己責任でお願いします)

AttributeError: 'Sequential' object has no attribute 'predict_classes'

上記のエラーはSequentialにpredict_classesが存在しないというエラーです。
調べるとこちらの質問が見つかり、それによれば確かに1系でないと動作しないようです。

それで「tensorflow 1系」で検索するとこちらが見つかり、それによれば

原因
Pythonのバージョンが合っていないことが原因の可能性が高いです。

例えばPyPIのtensorflow 1.15.4 のページ↓を見ると、tensorflow 1.15.4 が用意しているパッケージはpython 3.5, 3.6, 3.7 用しか提供されていません。
https://pypi.org/project/tensorflow/1.15.4/#files

なので、Python 3.8や3.9でpip installしても対応するパッケージがないので入りません。

解決方法
Pythonのバージョンをpython 3.5, 3.6, 3.7にすればインストールできます。

という感じなので、Pythonのバージョンを3.7以前にすればインストールできるようになるかもしれません。

また、以下のように変更することで、2系で1系のコードを実行できるようになるそうなので、こちらも試してみるのもいいかもしれません(参考1参考2公式)。

Python

1import tensorflow.compat.v1 as tf 2tf.disable_v2_behavior()

投稿2023/06/18 12:38

fiveHundred

総合スコア10336

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

phpuser567

2023/06/18 13:08

このコード2行を最初に追加するだけでよいんでしょうか? または3.7以前にするか・・・ 自分のは3.9なので・・・
phpuser567

2023/06/18 14:25

このコードを2行を1行目のコードと置換すると Traceback (most recent call last): File "C:\Users\TOSHIBA\Desktop\python\fruit.py", line 69, in <module> model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"]) File "C:\Users\TOSHIBA\AppData\Local\Programs\Python\Python39\lib\site-packages\tensorflow\python\trackable\base.py", line 205, in _method_wrapper result = method(self, *args, **kwargs) File "C:\Users\TOSHIBA\AppData\Local\Programs\Python\Python39\lib\site-packages\keras\engine\training_v1.py", line 321, in compile self._set_optimizer(optimizer) File "C:\Users\TOSHIBA\AppData\Local\Programs\Python\Python39\lib\site-packages\keras\engine\training_v1.py", line 1473, in _set_optimizer self.optimizer = optimizers.get(optimizer) File "C:\Users\TOSHIBA\AppData\Local\Programs\Python\Python39\lib\site-packages\keras\optimizers\__init__.py", line 297, in get return convert_to_legacy_optimizer(identifier) File "C:\Users\TOSHIBA\AppData\Local\Programs\Python\Python39\lib\site-packages\keras\optimizers\__init__.py", line 221, in convert_to_legacy_optimizer config = optimizer.get_config() File "C:\Users\TOSHIBA\AppData\Local\Programs\Python\Python39\lib\site-packages\keras\optimizers\adam.py", line 207, in get_config "learning_rate": self._serialize_hyperparameter( File "C:\Users\TOSHIBA\AppData\Local\Programs\Python\Python39\lib\site-packages\keras\optimizers\optimizer.py", line 734, in _serialize_hyperparameter return hyperparameter.numpy() File "C:\Users\TOSHIBA\AppData\Local\Programs\Python\Python39\lib\site-packages\tensorflow\python\ops\resource_variable_ops.py", line 648, in numpy raise NotImplementedError( NotImplementedError: numpy() is only available when eager execution is enabled. うーんこんなエラーが出てしまいました・・・元のコードよりも手前でエラーが出ており、 trainができていないようです。
phpuser567

2023/06/18 22:09

また、バージョンを3.6.7にすると、 tensorflowのintallの段階で pip install --upgrade pip ERROR: To modify pip, please run the following command: c:\users\toshiba\appdata\local\programs\python\python36\python.exe -m pip install --upgrade pip You are using pip version 10.0.1, however version 21.3.1 is available. You should consider upgrading via the 'python -m pip install --upgrade pip' command. というエラー?が、またtensorflowがないので本家のコードは実行できないとか。
fiveHundred

2023/06/19 02:53

そのエラーの内容は試されましたか? 後、意見が変わって申し訳ないのですが、jbpb0さんが提示しているURLのように、predict_classes()ではなくpredict()にして、np.argmax()などで判別したほうがいいかもしれませんね。 2系のままでも出来るかもしれません。
phpuser567

2023/06/19 03:16

エラー内容は、、いまいちやり方がわかりません。 predict_classes()ではなくpredict()にし、 np.argmaxは、何の代わりに置換するのでしょうか バージョンを3.6.7ですかね またやってみます
phpuser567

2023/06/19 06:10

バージョンを3.6.7で良いですかね
fiveHundred

2023/06/19 06:18

「2系でエラーが出る内容の修正」なんですから、Pythonやtensorflowは質問時のバージョンに戻すのが適切かと。 私の回答は一旦忘れてください。
phpuser567

2023/06/30 13:44

jbpb0さんの、 > AttributeError: 'Sequential' object has no attribute 'predict_classes' result = model.predict_classes(np.array([image / 255.])) ↓ 変更 result = np.argmax(model.predict(np.array([image / 255.])), axis=-1) という変更でできました!バージョンは3.6.7です。 まだ少し疑問があるので、質問させて頂いておりますが、一区切りついたら完了にし、 また新たな疑問を質問させて頂こうと思います。
phpuser567

2023/07/01 15:26

ところで、これ画面内に2個とか3個同じ画像がある場合に、各画像を認識して判別させるようなプログラムはないんでしょうか??
fiveHundred

2023/07/02 02:14

> ところで、これ画面内に2個とか3個同じ画像がある場合に、各画像を認識して判別させるようなプログラムはないんでしょうか?? 詳細は分かりませんが、探せばありそうな気がします。 mediapipeに物体検出の機能(というかサンプル?)があったので、それを誰かが応用していても不思議ではないです。
phpuser567

2023/07/03 02:45

むむむ・・・確かにあるにはあるみたいですが、 検出し取り出して色々・・・となると現在の自分のPythonの言語力ではできそうにありません・・・ 誰かがQiitaとかで試すのを待つしかなさそうです・・・。
guest

0

質問文を読み返したところモデルの学習は開始されているようなので、「IndentationError: unexpected indent」はどこで発生しているのでしょうか?エラーメッセージは抜粋ではなくユーザー名等を除いた全文を掲載いただくと分かりやすいかと思います。


(以前の回答)

おそらくこのエラーが原因か、結果らしきものが出てきません、

エラーが発生するとそこで実行が止まります。コードは最後までは実行されません。

たぶんtensorflowが対応していないことが原因と思われるのですが、

IndentationErrorは構文エラーなのでtensorflowのバージョンなどは関係ありません。
コードのどこかの箇所でインデントが間違っているのがエラーの原因です。コードをよく見直して間違っているインデントを直してください。

投稿2023/06/18 12:27

編集2023/06/18 12:58
meg_

総合スコア10912

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

winterboum

2023/06/18 12:37

101行の if のインデント 気になりますね
meg_

2023/06/18 12:54

質問文を読み返したところ、Epochは回ってるみたいなので「IndentationError: unexpected indent」は質問者さんが書いたコードで直接発生したものではないかもですね。
phpuser567

2023/06/18 13:11

すいませんたぶんインデントエラー関係ないです、補足しました。
meg_

2023/06/18 13:29

> すいませんたぶんインデントエラー関係ないです それは、質問のコードを実行すると「IndentationError」は発生しないということですか? そうであれば質問文の訂正をお願いします。 それと確認ですが、質問タグが「Python 2.7」ですが質問内容と合ってますか?現在2.7を使用している人は少ないかと思いますが・・・
phpuser567

2023/06/18 22:31

コマンドプロンプトでfruit.pyを実行したコードではインデントエラーは出ていなかった気がします、もう消してしまいました・・・他のエラーが出てしまい、そこが問題です。 Pythonは正直どのバージョンを使えばよいのか「いまだにわかりません」、とりあえず3.xにしました。
meg_

2023/06/18 22:59

どのPythonとtensorflowのバージョンでどのようなエラーが発生しているのか明確にされないと回答しずらいかと思います。 質問のコードはご自身が書かれたものでしょうか?引用元がある場合は環境を合わせないとエラーが出やすいかと思います。(特に機械学習の場合)そうでない場合は何故あえて1系のtensorflowを使わなければならないのかの理由も書かれると良いかと思います。
phpuser567

2023/06/19 03:17

サイトからの引用です、バージョンは現在3.6.7で試してます。
meg_

2023/06/19 04:06

> サイトからの引用です、 コードにも著作権があります。引用元を明記するべきではないでしょうか?
phpuser567

2023/06/19 06:11

初回投稿時から今までずっと明記してますが、あれではだめなんでしょうか???
phpuser567

2023/06/30 13:44

jbpb0さんの、 > AttributeError: 'Sequential' object has no attribute 'predict_classes' result = model.predict_classes(np.array([image / 255.])) ↓ 変更 result = np.argmax(model.predict(np.array([image / 255.])), axis=-1) という変更でできました!バージョンは3.6.7です。 まだ少し疑問があるので、質問させて頂いておりますが、一区切りついたら完了にし、 また新たな疑問を質問させて頂こうと思います。
meg_

2023/06/30 14:07 編集

> 初回投稿時から今までずっと明記してますが、あれではだめなんでしょうか??? コードの参考元が書いてあったのですね。記載場所よりtensorflowのインストール方法について参考にされたサイトかと思っていました。先頭などコードに近い場所に書かないと第三者には伝わりにくいかと思います。 また、「参考」ということなので「どこをどう」変更されたのかを書かれると回答者が回答しやすくなるかと思います。 そしてリンク切れを起こしていますね。
phpuser567

2023/07/03 02:47

なるほど。 すいませんリンクに「です。」が入っていたためエラーになってます・・・。
phpuser567

2023/07/03 04:42

ところで以前あったOpenCVとやらは使われてないんでしょうか・・・?
meg_

2023/07/03 12:06

> ところで以前あったOpenCVとやらは使われてないんでしょうか・・・? 突然何の話か分かりませんが、OpenCVは現在も開発が続いていますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問