前提・実現したいこと
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
エラーが出る行のすぐ上に
print(train_x.shape)
を追加して実行したら、何て表示されますか?
まったく同じエラーメッセージが出ました。
img = cv2.imread(path)
のすぐ下に
print(img.shape)
を(インデントを合わせて)追加した場合は、どうでしょうか?
もしそこならエラー出ないなら、「print(img.shape)」を追加する位置を、
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
のすぐ下や、
img = cv2.resize(img, (100, 100))
のすぐ下に変えてみてください
img = cv2.imread(path)の下に置いた場合、
for path in tqdm(glob.glob('./data/flower_images/*.png')):
AttributeError: 'function' object has no attribute 'glob'
に変わりました。
他の場所に置いた場合も同様でした。
確認ですが、
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(...」は、削除していいです)
もう一つ、
org_x, train_x = [], []
のすぐ上に下記を追加(インデント無し)して実行したら、読み込もうとしてるPNGファイル名が表示されますでしょうか?
import os
print(os.listdir('./data/flower_images'))
はい、ファイル名は表示されました。
img = cv2.imread(path)
のすぐ上に
print(path)
を、「img = cv2.imread(path)」にインデントを合わせて追加した場合の結果はどうでしょうか?
「./data/flower_images/*.png」の実際のファイル名がパス(./data/flower_images/)付きで表示されますでしょうか?
同様のエラーは表示されましたが、ファイル名も表示されました。
img = cv2.imread(path)
のすぐ上に
print(path)
を追加して実行したら、正しい画像ファイル名がパス付きで表示されるのなら、画像ファイルが壊れてない限り、「img = cv2.imread(path)」でファイル読み込みができるはずなので、そのすぐ下に
print(img.shape)
を追加して実行したら、読み込んだ画像ファイルの「shape」(画素数とチャンネル数)が表示されるはずなのですが、それはうまくいかないのですよね?
変だなぁー
質問に掲載のコードに、先頭に
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エポック終わるのが待てないので、すぐに中断しましたが)
なので、コードは間違ってないと思いますので、画像ファイルがあるディレクトリパスの指定が合ってれば、動くと思うのですが、なんでしょうね??
画像ファイルは、大丈夫ですよね?
壊れてませんよね?
print(path)はきちんと実行されているようですが、その後の
print(img.shape)にて以下のエラーが出ました。
AttributeError: 'NoneType' object has no attribute 'shape'
パスが間違っているとかではなさそうでした。
画像ファイルは壊れていませんでした。
print(img.shape)で動かなくなった理由がわかりました。
お恥ずかしい話、当方がパスを指定した際、*を抜かして書いていました。
これでは動くはずがありません。
*を追加して実行したところ、きちんと学習が開始されました。
jbpb0様、教えていただき本当にありがとうございました。
回答1件
あなたの回答
tips
プレビュー