前提・実現したいこと
・前提
pythonでSIGNATE(機械学習コンペ)の練習問題のアルゴリズムを構築しています。
学習を開始するコード(model.fit)を実行しても、学習が始まらずに実行が終了し(エラーが表示されない)、問題点を探すためにアルゴリズムのはじめの方のコードを再び実行すると、変数やライブラリが未定義のエラーが表示されます。
・実現したいこと
学習の開始
未定義になるエラーの解消
発生している問題・エラーメッセージ
アルゴリズムの上から順にコードを実行実行した場合、学習開始の手前までは正常に動作します。例として2つのコード(①,②)を紹介します。
① trainデータをtrainとvalidに分割するコード
print(x_train.shape) x_train, x_valid, y_train, y_valid = train_test_split(x_train, y_train, test_size=0.1, random_state=0) # モデルの「容器」を作成 model = Sequential() print(x_train.shape) print(x_valid.shape) print(y_train.shape) print(y_valid.shape)
① trainデータをtrainとvalidに分割するコード(実行結果)
(250, 300, 300, 3) (225, 300, 300, 3) (25, 300, 300, 3) (225,) (25,)
② モデルを設計するコード
model.add(Conv2D(6, kernel_size=(5, 5), activation='relu', kernel_initializer='he_normal', input_shape=(300, 300, 3))) # 300x300x3 -> 296x296x6 model.add(MaxPooling2D(pool_size=(2, 2))) # 296x296x6 -> 148x148x6 model.add(Conv2D(12, kernel_size=(5, 5), activation='relu', kernel_initializer='he_normal')) # 148x148x6 -> 144x144x12 model.add(MaxPooling2D(pool_size=(2, 2))) # 144x144x12 -> 72x72x12 model.add(Conv2D(20, kernel_size=(5, 5), activation='relu', kernel_initializer='he_normal')) # 72x72x12 -> 68x68x20 model.add(MaxPooling2D(pool_size=(2, 2))) # 68x68x20 -> 34x34x20 model.add(Conv2D(40, kernel_size=(5, 5), activation='relu', kernel_initializer='he_normal')) # 34x34x20 -> 30x30x40 model.add(MaxPooling2D(pool_size=(2, 2))) # 30x30x40 -> 15x15x40 model.add(Conv2D(40, kernel_size=(5, 5), activation='relu', kernel_initializer='he_normal')) # 15x15x40 -> 11x11x40 model.add(MaxPooling2D(pool_size=(2, 2))) # 11x11x40 -> 5x5x40 model.add(Flatten()) # 5x5x40 -> 1000 model.add(Dense(100, activation='relu', kernel_initializer='he_normal')) # 1000 ->100 model.add(Dense(1, activation='sigmoid')) # 100 ->1 model.compile( loss=keras.losses.binary_crossentropy, optimizer='adam', metrics=['accuracy'] ) model.summary()
② モデルを設計するコード(実行結果)
Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d (Conv2D) (None, 296, 296, 6) 456 _________________________________________________________________ max_pooling2d (MaxPooling2D) (None, 148, 148, 6) 0 _________________________________________________________________ conv2d_1 (Conv2D) (None, 144, 144, 12) 1812 _________________________________________________________________ max_pooling2d_1 (MaxPooling2 (None, 72, 72, 12) 0 _________________________________________________________________ conv2d_2 (Conv2D) (None, 68, 68, 20) 6020 _________________________________________________________________ max_pooling2d_2 (MaxPooling2 (None, 34, 34, 20) 0 _________________________________________________________________ conv2d_3 (Conv2D) (None, 30, 30, 40) 20040 _________________________________________________________________ max_pooling2d_3 (MaxPooling2 (None, 15, 15, 40) 0 _________________________________________________________________ conv2d_4 (Conv2D) (None, 11, 11, 40) 40040 _________________________________________________________________ max_pooling2d_4 (MaxPooling2 (None, 5, 5, 40) 0 _________________________________________________________________ flatten (Flatten) (None, 1000) 0 _________________________________________________________________ dense (Dense) (None, 100) 100100 _________________________________________________________________ dense_1 (Dense) (None, 1) 101 ================================================================= Total params: 168,569 Trainable params: 168,569 Non-trainable params: 0
というように正常に動作しますが、
その後に学習を始めるコードを実行すると、
early_stopping = EarlyStopping(patience=3, verbose=1) history = model.fit(x_train, y_train, batch_size=1000, epochs=10, verbose=1, validation_data=(x_valid, y_valid), callbacks=[early_stopping]) classes = model.predict(x_valid, batch_size=128)
以下だけが表示され、途中経過もエラーも表示されることなく、実行が終了します。
Epoch 1/10
その後に①,②のコードを再び実行すると、未定義エラーになります。
① trainデータをtrainとvalidに分割するコード(再実行結果)
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-2-b3a90153d7de> in <module> ----> 1 print(x_train.shape) 2 x_train, x_valid, y_train, y_valid = train_test_split(x_train, y_train, test_size=0.1, random_state=0) 3 4 # モデルの「容器」を作成 5 model = Sequential() NameError: name 'x_train' is not defined
② モデルを設計するコード(再実行結果)
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-1-61c4e333f845> in <module> ----> 1 model.add(Conv2D(6, kernel_size=(5, 5), activation='relu', 2 kernel_initializer='he_normal', input_shape=(300, 300, 3))) # 300x300x3 -> 296x296x6 3 model.add(MaxPooling2D(pool_size=(2, 2))) # 296x296x6 -> 148x148x6 4 model.add(Conv2D(12, kernel_size=(5, 5), activation='relu', 5 kernel_initializer='he_normal')) # 148x148x6 -> 144x144x12 NameError: name 'model' is not defined
試したこと
解決の見当がつかなかったため、何もしていません
「学習の実行でメモリが不足し、一度定義した変数が消去される」といったことがあるのかな?と思ったりしました。
タスクマネージャーでメモリ使用量の変化を確認
60%(コードを実行前)→70%(学習前のコードまで実行)→80%(学習のコードを実行すると一時的に上昇)→60%(すぐに使用量が落ちる)
メモリ使用量の変化をみても、学習のコードを実行した後に、コードを実行前の使用量まで戻っているので、やはり定義した変数が消されたのではないかと思っています。
補足情報(FW/ツールのバージョンなど)
windows10
プロセッサ: Intel(R) Core(TM) i5-7200U CPU
バージョン: 20H2
メモリ: 8GB
CPUのみ、内蔵GPUは学習中も使用率がほぼ0%
※深層学習をやるには低スペックであることは承知しています。
python 3.8.5
docker上でjupyter labを使用
docker 20.10.7
回答2件
あなたの回答
tips
プレビュー