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

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

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

解決済

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

dangomusi
dangomusi

総合スコア0

1回答

0評価

0クリップ

284閲覧

投稿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

org_x, train_x = [], [] for path in tqdm(glob.glob('./data/flower_images/*.png')): img = cv2.imread(path) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) org_x.append(img) img = cv2.resize(img, (100, 100)) train_x.append(img) train_x = np.array(train_x, dtype='float32') plt.imshow(train_x[0].astype('uint8'), cmap='gray', vmin=0, vmax=255, interpolation='none') plt.show() s = train_x.shape flatten_size = s[1]*s[2]*s[3] train_x2 = train_x.reshape(len(train_x), flatten_size) N = len(train_x2) x_ = tf.placeholder(tf.float32, shape=(None, flatten_size)) h_size = 50 w_enc = tf.Variable(tf.random_normal([flatten_size, h_size], mean=0.0, stddev=0.05), dtype=tf.float32) b_enc = tf.Variable(tf.random_normal([h_size], mean=0.0, stddev=0.05), dtype=tf.float32) enc = tf.nn.softsign(tf.matmul(x_, w_enc) + b_enc) w_dec = tf.Variable(tf.random_normal([h_size, flatten_size], mean=0.0, stddev=0.05), dtype=tf.float32) b_dec = tf.Variable(tf.random_normal([flatten_size], mean=0.0, stddev=0.05), dtype=tf.float32) dec = tf.nn.relu(tf.matmul(enc, w_dec)+b_dec) loss = tf.nn.l2_loss(dec-x_) train_step = tf.train.AdamOptimizer().minimize(loss) sess = tf.Session() sess.run(tf.global_variables_initializer()) EPOCH_NUM = 500000 BATCH_SIZE = 100 for epoch in tqdm(range(EPOCH_NUM), file=sys.stdout): perm = np.random.permutation(N) total_loss = 0 for i in range(0, N, BATCH_SIZE): batch_x = train_x2[perm[i:i+BATCH_SIZE]] total_loss += loss.eval(session=sess, feed_dict={x_: batch_x}) train_step.run(session=sess, feed_dict={x_: batch_x}) if (epoch+1) % 1000 == 0: tqdm.write("epoch:\t{}\ttotal loss:\t{}".format(epoch+1, total_loss))

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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様、教えていただき本当にありがとうございました。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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