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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

深層学習

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

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

機械学習

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

Python

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

Q&A

解決済

2回答

791閲覧

CNNの学習が始まらずに、すでに定義した変数が未定義扱いになる

shoo.

総合スコア2

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

深層学習

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

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

機械学習

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

Python

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

0グッド

0クリップ

投稿2021/07/03 04:18

前提・実現したいこと

・前提
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

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

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

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

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

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

jbpb0

2021/07/03 04:54 編集

batch_size=1000 の数値を、2とか4とか、思いっきり小さい数値で実行してみてください もしそれで動いたら、数値をどこまで増やせるか、少しずつ増やしてみてください
shoo.

2021/07/03 05:30

バッチサイズの意味が明確にわかってないまま、コード例のままにしていましたが、今理解しました。testデータ数が225なのにバッチサイズを1000にしてました。 batch_sizeが90だと学習できました。 95だと先ほどと同様に未定義になるエラーが起こりました。 model.predictの方は、vaildデータ数は25なのでバッチサイズも25にしました。
guest

回答2

0

自己解決

google colab を使うことで解決しました。
GPUをタダで使えて、すごく便利ですね!

投稿2021/07/05 11:20

shoo.

総合スコア2

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

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

0

history = model.fit(...

batch_size=1000
の数値「1000」を、2とか4とかの思いっきり小さい数値に変えて実行すれば、おそらく動くと思います

それで動いたら、数値をどこまで増やせるか、少しずつ増やしてみてください

投稿2021/07/03 11:45

jbpb0

総合スコア7653

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問