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

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

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

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

766閲覧

メモリ容量を超えた学習データを扱うためのfit_generator用Sequenceの自作について

Hagasuke

総合スコア8

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/01/21 10:08

編集2020/01/22 00:57

概要

メモリ容量を超えた画像を用いて、CNNを学習させるために、以下のプログラムを作成いたしました(抜粋)
その結果、学習がうまく開始できず、Sequenceから継承した"idx"の値や、
本来値が変わるはずのない、"self.length"が変わってしまいます。
また、与えているデータの長さは同じなのですが、最後にデータ数が一致しない結果となっています。

下記を試しましたがうまくいきませんでした。

・validation_data = Noneで実行
・再度プログラム実行 ⇒ idxの値が変化するが同様の挙動を示す

train用とvalidation用で同じclassを使用しており、"idx"と"self.length"の値が
非常に見にくく大変恐縮なのですが、
原因に心当たりがございましたらご教授いただけないでしょうか。

#追記
下記の点は解決いたしました。
・ランダムな"idx"の値について
⇒fit_generatorでshaffle=True(default)のためでした
・"self.length"の値の変化
⇒train_sequenceとval_sequenceのそれぞれで算出していました
・学習が進まない点
⇒self.length = int(np.ceil(DATA_ROW_NUM / float(batch_size)))
とすることで学習可能になりました

#残っている質問
・現在は学習は問題なく進みますが、上記のデータが合わなかった点については
最後にデータ数が一致しなかった理由はまだわかっていません。

#参考
https://qiita.com/simonritchie/items/d7168d1d9cea9ceb6af7

スクリプト

python

1class data_sequence(Sequence): 2 def __init__(self, X_paths, y_data, batch_size, image_size): 3 DATA_ROW_NUM = len(X_paths) 4 5 self.batch_size = batch_size 6 self.X_paths = X_paths 7 self.y_data = y_data 8 self.length = int(math.ceil(DATA_ROW_NUM / batch_size)) 9 self.image_size = image_size 10 11 def __getitem__(self, idx): 12 13 print("idx:", idx) 14 15 start_idx = idx * self.batch_size 16 last_idx = (idx + 1) * self.batch_size 17 18 print("start_idx:" ,start_idx) 19 20 print("self.length:", self.length) 21 22 print("last_idx:", last_idx) 23 24 batch_X = self.X_paths[start_idx:last_idx] 25 batch_y = self.y_data[start_idx:last_idx] 26 27 X = np.array([resize(imread(file_name), (self.image_size, self.image_size)) for file_name in batch_X]) 28 X = X / 255 29 y = np.array(batch_y) 30 31 32 return X, y 33 34 def __len__(self): 35 36 return self.length 37 38 39image_size = 224 40batch_size = 8 41 42# 指定フォルダ内のファイル名読み込み 43X_paths = glob.glob("./(ディレクトリ名)/" + "/*.bmp") 44 45# 画像とラベルをtrain, validation, testで分割 46X_train_paths, X_test_paths, y_train, y_test = train_test_split(X_paths, y_GroundTruth, test_size=0.2, random_state=1) 47X_train_paths, X_val_paths , y_train, y_val = train_test_split(X_train_paths, y_train, test_size=0.2, random_state=1) 48 49 50y_train = to_categorical(y_train) 51y_val = to_categorical(y_val) 52y_test = to_categorical(y_test) 53 54 55model = Sequential() 56 57# 入力画像は224 X 224 X 3 58model.add(Conv2D(16, kernel_size=(5, 5),padding='same', activation='relu', 59 kernel_initializer='he_normal', input_shape=(224, 224, 3))) 60model.add(MaxPooling2D(pool_size=(2, 2))) 61model.add(Conv2D(64, kernel_size=(5, 5),padding='same', activation='relu', 62 kernel_initializer='he_normal')) 63model.add(MaxPooling2D(pool_size=(2, 2))) 64model.add(Conv2D(128, kernel_size=(5, 5),padding='same', activation='relu', 65 kernel_initializer='he_normal')) 66model.add(MaxPooling2D(pool_size=(2, 2))) 67 68model.add(Flatten()) 69model.add(Dense(units=512)) 70model.add(Activation('relu')) 71model.add(Dense(units=256)) 72model.add(Activation('relu')) 73model.add(Dense(units=256)) 74model.add(Activation('relu')) 75model.add(Dense(8, activation='softmax')) 76model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 77 78 79train_sequence = data_sequence(X_paths=X_train_paths, y_data=y_train, batch_size=batch_size, image_size=image_size) 80val_sequence = data_sequence(X_paths=X_val_paths, y_data=y_val, batch_size=batch_size, image_size=image_size) 81 82history = model.fit_generator(generator=train_sequence, 83 verbose=1, 84 epochs=15, 85 validation_data=None) 86 87model.save('my_model.h5', include_optimizer=False)

結果

python

1Using TensorFlow backend. 2Epoch 1/15idx: 0 3start_idx: 0 4self.length: 39 5last_idx: 8 6 7idx: 71 8start_idx: 568 9self.length: 155 10last_idx: 576 11idx: 1 12start_idx: 8 13self.length: 39 14last_idx: 16 15idx: 2 16start_idx: 16 17self.length: 39 18last_idx: 24 19idx: 23 20start_idx: 184 21self.length: 155 22last_idx: 192 23idx: 38 24start_idx: 304 25self.length: 155 26last_idx: 312 27idx: 3 28start_idx: 24 29self.length: 39 30last_idx: 32 31idx: 90 32start_idx: 720 33self.length: 155 34last_idx: 728 35idx: 4 36start_idx: 32 37self.length: 39 38last_idx: 40 39idx: 144 40start_idx: 1152 41self.length: 155 42last_idx: 1160 43idx: 5 44start_idx: 40 45self.length: 39 46last_idx: 48 47idx: 74 48start_idx: 592 49self.length: 155 50last_idx: 600 51idx: 6 52start_idx: 48 53self.length: 39 54last_idx: 56 55idx: 47 56start_idx: 376 57self.length: 155 58last_idx: 384 59idx: 7 60start_idx: 56 61self.length: 39 62last_idx: 64 63idx: 80 64start_idx: 640 65self.length: 155 66last_idx: 648 67idx: 8 68start_idx: 64 69self.length: 39 70last_idx: 72 71idx: 135 72start_idx: 1080 73self.length: 155 74last_idx: 1088 75idx: 9 76start_idx: 72 77self.length: 39 78last_idx: 80 79idx: 112 80start_idx: 896 81self.length: 155 82last_idx: 904 83idx: 10 84start_idx: 80 85self.length: 39 86last_idx: 88 87idx: 12 88start_idx: 96 89self.length: 155 90last_idx: 104 91idx: 72 92start_idx: 576 93self.length: 155 94last_idx: 584 95 1/155 [..............................] - ETA: 30:42 - loss: 2.0789 - accuracy: 0.1250idx: 153 96start_idx: 1224 97self.length: 155 98last_idx: 1232 99Traceback (most recent call last): 100 101 File "<ipython-input-3-11fe17aecda1>", line 34, in <module> 102 validation_data=val_sequence) 103 104 File "C:\ProgramData\Anaconda3\envs\general\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper 105 return func(*args, **kwargs) 106 107 File "C:\ProgramData\Anaconda3\envs\general\lib\site-packages\keras\engine\training.py", line 1732, in fit_generator 108 initial_epoch=initial_epoch) 109 110 File "C:\ProgramData\Anaconda3\envs\general\lib\site-packages\keras\engine\training_generator.py", line 220, in fit_generator 111 reset_metrics=False) 112 113 File "C:\ProgramData\Anaconda3\envs\general\lib\site-packages\keras\engine\training.py", line 1508, in train_on_batch 114 class_weight=class_weight) 115 116 File "C:\ProgramData\Anaconda3\envs\general\lib\site-packages\keras\engine\training.py", line 621, in _standardize_user_data 117 exception_prefix='target') 118 119 File "C:\ProgramData\Anaconda3\envs\general\lib\site-packages\keras\engine\training_utils.py", line 145, in standardize_input_data 120 str(data_shape)) 121 122ValueError: Error when checking target: expected dense_12 to have shape (8,) but got array with shape (7,)

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問