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

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

新規登録して質問してみよう
ただいま回答率
85.35%

Q&A

解決済

1回答

589閲覧

tensorflowを用いた自動符号化装置のindexerrorの解決法を知りたい

dangomusi

総合スコア0

0グッド

0クリップ

投稿2021/11/15 00:32

前提・実現したいこと

tensorflowを用いた画像認識AIを作っています。
自動符号化装置を実装中、以下のエラーメッセージが発生しました。
自動符号化装置単体で動かしても同様のエラーが起きたためこのコードに問題があり、インデックスがサイズ以上だというのはわかりますが、なぜこのような結果になるのかわかりません。
原因と、可能であれば解決策を教えていただけると幸いです。

使用したのはpycharm community editionです。

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

コードを実行したところ、以下のエラーが発生しました。

Traceback (most recent call last): File "C:/Users/daxia/Desktop/test/main.py", line 20, in <module> plt.imshow(train_x[0].astype('uint8'), cmap='gray', vmin=0, vmax=255, interpolation='none')IndexError: index 0 is out of bounds for axis 0 with size 0

該当のソースコード

python

1org_x, train_x = [], [] 2for path in tqdm(glob.glob('./data/flower_images/*.png')): 3 img = cv2.imread(path) 4 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 5 org_x.append(img) 6 img = cv2.resize(img, (100, 100)) 7 train_x.append(img) 8train_x = np.array(train_x, dtype='float32') 9 10plt.imshow(train_x[0].astype('uint8'), cmap='gray', vmin=0, vmax=255, interpolation='none') 11plt.show() 12 13s = train_x.shape 14flatten_size = s[1]*s[2]*s[3] 15train_x2 = train_x.reshape(len(train_x), flatten_size) 16N = len(train_x2) 17 18x_ = tf.placeholder(tf.float32, shape=(None, flatten_size)) 19 20h_size = 50 21w_enc = tf.Variable(tf.random_normal([flatten_size, h_size], mean=0.0, stddev=0.05), dtype=tf.float32) 22b_enc = tf.Variable(tf.random_normal([h_size], mean=0.0, stddev=0.05), dtype=tf.float32) 23enc = tf.nn.softsign(tf.matmul(x_, w_enc) + b_enc) 24w_dec = tf.Variable(tf.random_normal([h_size, flatten_size], mean=0.0, stddev=0.05), dtype=tf.float32) 25b_dec = tf.Variable(tf.random_normal([flatten_size], mean=0.0, stddev=0.05), dtype=tf.float32) 26dec = tf.nn.relu(tf.matmul(enc, w_dec)+b_dec) 27 28loss = tf.nn.l2_loss(dec-x_) 29train_step = tf.train.AdamOptimizer().minimize(loss) 30 31sess = tf.Session() 32sess.run(tf.global_variables_initializer()) 33 34EPOCH_NUM = 500000 35BATCH_SIZE = 100 36 37for epoch in tqdm(range(EPOCH_NUM), file=sys.stdout): 38 perm = np.random.permutation(N) 39 total_loss = 0 40 for i in range(0, N, BATCH_SIZE): 41 batch_x = train_x2[perm[i:i+BATCH_SIZE]] 42 total_loss += loss.eval(session=sess, feed_dict={x_: batch_x}) 43 train_step.run(session=sess, feed_dict={x_: batch_x}) 44 if (epoch+1) % 1000 == 0: 45 tqdm.write("epoch:\t{}\ttotal loss:\t{}".format(epoch+1, total_loss)) 46

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

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

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

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

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

jbpb0

2021/11/15 05:27

エラーが出る行のすぐ上に print(train_x.shape) を追加して実行したら、何て表示されますか?
dangomusi

2021/11/16 00:58

まったく同じエラーメッセージが出ました。
jbpb0

2021/11/16 02:56 編集

img = cv2.imread(path) のすぐ下に print(img.shape) を(インデントを合わせて)追加した場合は、どうでしょうか? もしそこならエラー出ないなら、「print(img.shape)」を追加する位置を、 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) のすぐ下や、 img = cv2.resize(img, (100, 100)) のすぐ下に変えてみてください
dangomusi

2021/11/16 03:11

img = cv2.imread(path)の下に置いた場合、 for path in tqdm(glob.glob('./data/flower_images/*.png')): AttributeError: 'function' object has no attribute 'glob' に変わりました。 他の場所に置いた場合も同様でした。
jbpb0

2021/11/16 06:01 編集

確認ですが、 org_x, train_x = [], [] for path in tqdm(glob.glob('./data/flower_images/*.png')): img = cv2.imread(path) print(img.shape) # 追加 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) という状態(実際は3〜5行目は同じインデント有り)で、 > for path in tqdm(glob.glob('./data/flower_images/*.png')): AttributeError: 'function' object has no attribute 'glob' が出るのですか? 上記で合ってるなら、 img = cv2.imread(path) のすぐ上に print(path) を、「img = cv2.imread(path)」にインデントを合わせて追加したら、何て表示されますでしょうか? (これまでに追加した他の「print(...」は、削除していいです)
jbpb0

2021/11/16 06:23 編集

もう一つ、 org_x, train_x = [], [] のすぐ上に下記を追加(インデント無し)して実行したら、読み込もうとしてるPNGファイル名が表示されますでしょうか? import os print(os.listdir('./data/flower_images'))
dangomusi

2021/11/16 07:24

はい、ファイル名は表示されました。
jbpb0

2021/11/16 07:32 編集

img = cv2.imread(path) のすぐ上に print(path) を、「img = cv2.imread(path)」にインデントを合わせて追加した場合の結果はどうでしょうか? 「./data/flower_images/*.png」の実際のファイル名がパス(./data/flower_images/)付きで表示されますでしょうか?
dangomusi

2021/11/16 09:40

同様のエラーは表示されましたが、ファイル名も表示されました。
jbpb0

2021/11/16 09:45

img = cv2.imread(path) のすぐ上に print(path) を追加して実行したら、正しい画像ファイル名がパス付きで表示されるのなら、画像ファイルが壊れてない限り、「img = cv2.imread(path)」でファイル読み込みができるはずなので、そのすぐ下に print(img.shape) を追加して実行したら、読み込んだ画像ファイルの「shape」(画素数とチャンネル数)が表示されるはずなのですが、それはうまくいかないのですよね? 変だなぁー
jbpb0

2021/11/16 10:03

質問に掲載のコードに、先頭に import numpy as np import matplotlib.pyplot as plt from tqdm import tqdm import glob import cv2 import sys import tensorflow as tf を追加し、「for path in tqdm(glob.glob('./data/flower_images/*.png')):」のディレクトリパスとファイル名の拡張子を当方の環境に合わせて変更し、それ以外はそのままで、当方のMacのPythonで実行したら、エラーが出ずに学習が開始されました (500000エポック終わるのが待てないので、すぐに中断しましたが) なので、コードは間違ってないと思いますので、画像ファイルがあるディレクトリパスの指定が合ってれば、動くと思うのですが、なんでしょうね?? 画像ファイルは、大丈夫ですよね? 壊れてませんよね?
dangomusi

2021/11/16 16:15

print(path)はきちんと実行されているようですが、その後の print(img.shape)にて以下のエラーが出ました。 AttributeError: 'NoneType' object has no attribute 'shape' パスが間違っているとかではなさそうでした。 画像ファイルは壊れていませんでした。
dangomusi

2021/11/16 16:47

print(img.shape)で動かなくなった理由がわかりました。 お恥ずかしい話、当方がパスを指定した際、*を抜かして書いていました。 これでは動くはずがありません。 *を追加して実行したところ、きちんと学習が開始されました。 jbpb0様、教えていただき本当にありがとうございました。
guest

回答1

0

自己解決

パスをきちんと書いているか確認する。

投稿2021/11/16 16:50

dangomusi

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問