前提・実現したいこと
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/ツールのバージョンなど)
「load_data()」がちゃんと実行できてるかが怪しいです
「load_data()」の定義の、
X_train, X_test, y_train, y_test = np.load("./dog_cat.npy", allow_pickle=True)
のすぐ下に、インデントを合わせて、
print(X_train.shape)
を追加して実行した時の結果表示を確認してみてください
ちゃんとデータはファイルから読み込めてますでしょうか?
アドバイス頂きまして、ありがとうございます。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)
> (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
のすぐ上に変えて、実行してみてください
追加のアドバイス本当にありがとうございます。初心者であることから、的外れな返答をしてしまうかもしれませんがご了承ください。
アドバイスに基づき、同じ場所の下記に下記を追加し、実行しました。結果は以下の通りでした。
【検証①_追加コード部分の実行結果】
(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
差し出がましいようで恐縮ですが、念のためコード全体も共有させて頂きます。
!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(">>> 猫")
依頼してたのは、「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():」以外の行はもちろんインデントが要ります
> 【検証①_追加コード部分の実行結果】
(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()」を追加して結果表示がされてるのなら、質問に書かれてるエラーはその時には発生してないことになるからです
そこは重要なとこなので、間違い無いか、もう一度確認してください
上記の検証を行った時には、質問のエラーは起きて無かったのでしょうか?
繰り返し、助言を頂きありがとうございます。
追加した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)になっていることに気づきました。コードを修正したところ、該当のエラーは復旧できました。
サポート頂きまして、本当にありがとうございました。
回答1件
あなたの回答
tips
プレビュー