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

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

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

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Q&A

解決済

1回答

2892閲覧

Google colab_画像分類プログラムにおけるTypeError: cannot unpack non-iterable NoneType objectについて

shiratama_f

総合スコア2

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

0グッド

0クリップ

投稿2021/09/23 07:40

前提・実現したいこと

AI Academyのページを参考にGoogle colabを用いてPythonコードを記述してみたのですが、「TypeError: cannot unpack non-iterable NoneType object」のエラーが発生し、そこから先に進むことができません。

エラーが発生しているポイントは「X_train, y_train, X_test, y_test = load_data()」になります。

ド初心者であるため、有識者の方より打開策をご教示いただけると助かります。

サイトのURLは以下になります。
https://aiacademy.jp/texts/show/?id=164

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

TypeError Traceback (most recent call last) <ipython-input-11-793ffd2a1460> in <module>() 5 model = train(X_train, y_train, X_test, y_test) 6 ----> 7 main() 8 # dog1.jpgをColabにアップロードしている前提 9 <ipython-input-11-793ffd2a1460> in main() 1 def main(): 2 # データの読み込み ----> 3 X_train, y_train, X_test, y_test = load_data() 4 # モデルの学習 5 model = train(X_train, y_train, X_test, y_test) TypeError: cannot unpack non-iterable NoneType object

該当のソースコード

メイン関数 データの読込とモデル学習 """ def main(): # データの読み込み X_train, y_train, X_test, y_test = load_data() # モデルの学習 model = train(X_train, y_train, X_test, y_test) main() # dog1.jpgをColabにアップロードしている前提 import keras import sys, os import numpy as np from keras.models import load_model imsize = (64, 64)

試したこと

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

jbpb0

2021/09/23 08:27

「load_data()」がちゃんと実行できてるかが怪しいです 「load_data()」の定義の、 X_train, X_test, y_train, y_test = np.load("./dog_cat.npy", allow_pickle=True) のすぐ下に、インデントを合わせて、 print(X_train.shape) を追加して実行した時の結果表示を確認してみてください ちゃんとデータはファイルから読み込めてますでしょうか?
shiratama_f

2021/09/24 01:51

アドバイス頂きまして、ありがとうございます。print(X_train.shape)を入力して、結果が以下になります。 【結果】 (2176, 64, 64, 3) 【変更後のコード】 def load_data(): X_train, X_test, y_train, y_test = np.load("./dog_cat.npy", allow_pickle=True) print(X_train.shape) # 入力データの各画素値を0-1の範囲で正規化(学習コストを下げるため) X_train = X_train.astype("float") / 255 X_test = X_test.astype("float") / 255 # to_categorical()にてラベルをone hot vector化 y_train = np_utils.to_categorical(y_train, num_classes) y_test = np_utils.to_categorical(y_test, num_classes) y_test = np_utils.to_categorical(y_test, num_classes)
jbpb0

2021/09/24 03:39

> (2176, 64, 64, 3) そこでは大丈夫なようですが、念の為に、同じ場所に下記を追加して、どれも大丈夫か確認してみてください print(X_train.shape) print(X_test.shape) print(y_train.shape) print(y_test.shape) 上記がどれも大丈夫な場合は、上記4行を追加する場所を、「load_data()」の定義の return X_train, y_train, X_test, y_test のすぐ上に変えて、実行してみてください
shiratama_f

2021/09/24 07:07

追加のアドバイス本当にありがとうございます。初心者であることから、的外れな返答をしてしまうかもしれませんがご了承ください。 アドバイスに基づき、同じ場所の下記に下記を追加し、実行しました。結果は以下の通りでした。 【検証①_追加コード部分の実行結果】 (1296, 64, 64, 3) (50, 64, 64, 3) (1296,) (50,) 【検証①_追加コード】 def main(): # データの読み込み X_train, y_train, X_test, y_test = load_data() print(X_train.shape) print(X_test.shape) print(y_train.shape) print(y_test.shape) # モデルの学習 model = train(X_train, y_train, X_test, y_test) main() # dog1.jpgをColabにアップロードしている前提 import keras import sys, os import numpy as np from keras.models import load_model imsize = (64, 64) ---------------------------------------- 上記結果を受け、個人的に問題ないと判断したことから、上記4行の記述場所を「load_data()」の定義「return X_train, y_train, X_test, y_test」の上に変更しました。実行結果は下記のとおりです。 【検証①_追加コード】 def main(): # データの読み込み print(X_train.shape) print(X_test.shape) print(y_train.shape) print(y_test.shape) X_train, y_train, X_test, y_test = load_data() # モデルの学習 model = train(X_train, y_train, X_test, y_test) main() # dog1.jpgをColabにアップロードしている前提 import keras import sys, os import numpy as np from keras.models import load_model imsize = (64, 64) 【検証②_追加コード部分の実行結果】 検証したところ、以下のエラーが発生しました。 UnboundLocalError Traceback (most recent call last) <ipython-input-2-98ce58d3036f> in <module>() 238 model = train(X_train, y_train, X_test, y_test) 239 --> 240 main() 241 # dog1.jpgをColabにアップロードしている前提 242 <ipython-input-2-98ce58d3036f> in main() 229 def main(): 230 # データの読み込み --> 231 print(X_train.shape) 232 print(X_test.shape) 233 print(y_train.shape) UnboundLocalError: local variable 'X_train' referenced before assignment
shiratama_f

2021/09/24 07:09

差し出がましいようで恐縮ですが、念のためコード全体も共有させて頂きます。 !pip install icrawler from icrawler.builtin import BingImageCrawler #猫の画像を100枚取得 crawler = BingImageCrawler(storage={"root_dir": "cat"}) crawler.crawl(keyword="猫",max_num=100) from icrawler.builtin import BingImageCrawler #猫の画像を表示 #from IPython.display import Image,display_jpeg #display_jpeg(Image("./cat/000001.jpg")) #犬の画像を100枚収集 crawler = BingImageCrawler(storage={"root_dir": "dog"}) crawler.crawl(keyword="犬",max_num=100) #データの整形と学習データの作成 from PIL import Image import os, glob import numpy as np from PIL import ImageFile # I0Error: image file is truncated(0 bytes not processed)回避のため ImageFile.LOAD_TRUNCATED_IMAGES = True classes = ["dog", "cat"] num_classes = len(classes) image_size = 64 num_testdata = 25 X_train = [] X_test = [] y_train = [] y_test = [] for index, classlabel in enumerate(classes): photos_dir = "./" + classlabel files = glob.glob(photos_dir + "/*.jpg") for i, file in enumerate(files): image = Image.open(file) image = image.convert("RGB") image = image.resize((image_size, image_size)) data = np.asarray(image) if i < num_testdata: X_test.append(data) y_test.append(index) else: # angleに代入される値 # -20 # -15 # -10 # -5 # 0 # 5 # 10 # 15 for angle in range(-20, 20, 5): img_r = image.rotate(angle) data = np.asarray(img_r) X_train.append(data) y_train.append(index) #FLIP_LEFT_RIGHTは左右反転 img_trains = img_r.transpose(Image.FLIP_LEFT_RIGHT) data = np.asarray(img_trains) X_train.append(data) y_train.append(index) X_train = np.array(X_train) X_test = np.array(X_test) y_train = np.array(y_train) y_test = np.array(y_test) xy = (X_train, X_test, y_train, y_test) np.save("./dog_cat.npy", xy) #学習フェーズ 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 = ["dog","cat"] num_classes = len(classes) image_size = 64 """ データを読み込む関数 """ def load_data(): X_train, X_test, y_train, y_test = np.load("./dog_cat.npy", allow_pickle=True) print(X_train.shape) #入力データの各画素値を0-1の範囲で正規化(学習コストを下げるため) X_train = X_train.astype("float")/255 X_test = X_test.astype("float")/255 #to_categorical()にてラベルをone hot vector化 y_train = np_utils.to_categorical(y_train, num_classes) y_test = np_utils.to_categorical(y_test, num_classes) return X_train, y_train, X_test, y_test """ モデルを学習する関数 """ def train(X, y, X_test, y_test): model = Sequential() #Xは(1200,64,64,3) #X.shape[1:]とすることで、(64,64,3)となり、入力にすることが可能 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.1)) 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)) model.add(Flatten()) model.add(Dense(512)) model.add(Activation('relu')) model.add(Dropout(0.45)) model.add(Dense(2)) model.add(Activation('softmax')) # https://keras.io/ja/optimizers/ # 今回は、最適化アルゴリズムにRMSpropを利用 from tensorflow import keras from tensorflow.keras import optimizers opt = keras.optimizers.RMSprop(lr=0.00005, decay=1e-6) # https://keras.io/ja/models/sequential/ model.compile(loss='categorical_crossentropy',optimizer=opt,metrics=['accuracy']) model.fit(X, y, batch_size=28, epochs=40) # HDF5ファイルにKerasのモデルを保存 model.save('./cnn.h5') return model """ メイン関数 """ def main(): # データの読み込み X_train, y_train, X_test, y_test = load_data() # モデルの学習 model = train(X_train, y_train, X_test, y_test) main() 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 = ["dog", "cat"] num_classes = len(classes) image_size = 64 """ データを読み込む関数 """ def load_data(): X_train, X_test, y_train, y_test = np.load("./dog_cat.npy", allow_pickle=True) print(X_train.shape) # 入力データの各画素値を0-1の範囲で正規化(学習コストを下げるため) X_train = X_train.astype("float") / 255 X_test = X_test.astype("float") / 255 # to_categorical()にてラベルをone hot vector化 y_train = np_utils.to_categorical(y_train, num_classes) y_test = np_utils.to_categorical(y_test, num_classes) y_test = np_utils.to_categorical(y_test, num_classes) """ モデルを学習する関数 """ def train(X, y, X_test, y_test): model = Sequential() # Xは(1200, 64, 64, 3) # X.shape[1:]とすることで、(64, 64, 3)となり、入力にすることが可能 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.1)) 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)) model.add(Flatten()) model.add(Dense(512)) model.add(Activation('relu')) model.add(Dropout(0.45)) model.add(Dense(2)) model.add(Activation('softmax')) # https://keras.io/ja/optimizers/ # 今回は、最適化アルゴリズムにRMSpropを利用 opt = keras.optimizers.RMSprop(learning_rate=0.00005, decay=1e-6) # https://keras.io/ja/models/sequential/ model.compile(loss='categorical_crossentropy',optimizer=opt,metrics=['accuracy']) model.fit(X, y, batch_size=28, epochs=40) # HDF5ファイルにKerasのモデルを保存 model.save('./cnn.h5') return model """ メイン関数 データの読込とモデル学習 """ def main(): # データの読み込み print(X_train.shape) print(X_test.shape) print(y_train.shape) print(y_test.shape) X_train, y_train, X_test, y_test = load_data() # モデルの学習 model = train(X_train, y_train, X_test, y_test) main() # dog1.jpgをColabにアップロードしている前提 import keras import sys, os import numpy as np from keras.models import load_model imsize = (64, 64) """ dog1.jpgというファイル名の画像をGoogle Colab上にアップロードする方法は2通りあります。 1つが、下記のコードを実行し画像をアップロードする方法 from google.colab import files uploaded = files.upload() 2つが、Colab左メニューの>アイコンを押して、目次、コード スニペット、ファイル の3つ表示されるますが、右のファイルタブから画像をアップロードする方法です。 このファイルタブをクリックするとアップロードと更新の2つがありますが、 アップロードを押すと画像をアップロードすることが可能 """ testpic = "./dog1.jpg" keras_param = "./cnn.h5" def load_image(path): img = Image.open(path) img = img.convert('RGB') # 学習時に、(64, 64, 3)で学習したので、画像の縦・横は今回 変数imsizeの(64, 64)にリサイズします。 img = img.resize(imsize) # 画像データをnumpy配列の形式に変更 img = np.asarray(img) img = img / 255.0 return img model = load_model(keras_param) img = load_image(testpic) prd = model.predict(np.array([img])) print(prd) # 精度の表示 prelabel = np.argmax(prd, axis=1) if prelabel == 0: print(">>> 犬") elif prelabel == 1: print(">>> 猫")
jbpb0

2021/09/24 11:34

依頼してたのは、「main()」内に追加するのではなく、「load_data()」内です 追加した「load_data()」は以下のようになりますので、この状態で実行して、追加した8ヶ所の「print()」の結果が全部大丈夫かを確認してみてください def load_data(): X_train, X_test, y_train, y_test = np.load("./dog_cat.npy", allow_pickle=True) print(X_train.shape) print(X_test.shape) print(y_train.shape) print(y_test.shape) # 入力データの各画素値を0-1の範囲で正規化(学習コストを下げるため) X_train = X_train.astype("float") / 255 X_test = X_test.astype("float") / 255 # to_categorical()にてラベルをone hot vector化 y_train = np_utils.to_categorical(y_train, num_classes) y_test = np_utils.to_categorical(y_test, num_classes) print(X_train.shape) print(X_test.shape) print(y_train.shape) print(y_test.shape) return X_train, y_train, X_test, y_test なお、上記はインデントが消えて見えると思いますが、「def load_data():」以外の行はもちろんインデントが要ります
jbpb0

2021/09/24 11:48 編集

> 【検証①_追加コード部分の実行結果】 (1296, 64, 64, 3) (50, 64, 64, 3) (1296,) (50,) は、本当に > 【検証①_追加コード】 def main(): # データの読み込み X_train, y_train, X_test, y_test = load_data() print(X_train.shape) print(X_test.shape) print(y_train.shape) print(y_test.shape) とした場合の結果でしょうか? 間違い無いでしょうか? と聞きますのは、質問に書かれてるエラー ----> 3 X_train, y_train, X_test, y_test = load_data() 4 # モデルの学習 5 model = train(X_train, y_train, X_test, y_test) TypeError: cannot unpack non-iterable NoneType object が発生したら、エラーの行よりも下に追加した「print()」は実行されないはずなので、本当に上記の場所に「print()」を追加して結果表示がされてるのなら、質問に書かれてるエラーはその時には発生してないことになるからです そこは重要なとこなので、間違い無いか、もう一度確認してください 上記の検証を行った時には、質問のエラーは起きて無かったのでしょうか?
shiratama_f

2021/09/24 13:20

繰り返し、助言を頂きありがとうございます。 追加した8ヶ所の「print()」の結果を確認しようとしたところ、 ---------------------- def load_data(): X_train, X_test, y_train, y_test = np.load("./dog_cat.npy", allow_pickle=True) print(X_train.shape) # 入力データの各画素値を0-1の範囲で正規化(学習コストを下げるため) X_train = X_train.astype("float") / 255 X_test = X_test.astype("float") / 255 # to_categorical()にてラベルをone hot vector化 y_train = np_utils.to_categorical(y_train, num_classes) y_test = np_utils.to_categorical(y_test, num_classes) y_test = np_utils.to_categorical(y_test, num_classes) -------------------- のところ最後のコードが、「return X_train, y_train, X_test, y_test」にすべきところ、y_test = np_utils.to_categorical(y_test, num_classes)になっていることに気づきました。コードを修正したところ、該当のエラーは復旧できました。 サポート頂きまして、本当にありがとうございました。
guest

回答1

0

自己解決


def load_data():
X_train, X_test, y_train, y_test = np.load("./dog_cat.npy", allow_pickle=True)
print(X_train.shape)

X_train = X_train.astype("float") / 255
X_test = X_test.astype("float") / 255

y_train = np_utils.to_categorical(y_train, num_classes)
y_test = np_utils.to_categorical(y_test, num_classes)

y_test = np_utils.to_categorical(y_test, num_classes)

のところ最後のコードを、「return X_train, y_train, X_test, y_test」に変更

投稿2021/09/24 13:21

編集2021/09/24 13:36
shiratama_f

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問