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

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

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

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

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

機械学習

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

Q&A

解決済

2回答

511閲覧

コードの解釈が合っているか確認したい

tatata1111

総合スコア9

Keras

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

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

機械学習

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

0グッド

0クリップ

投稿2024/01/19 14:32

実現したいこと

コードを理解する

前提

適当にネットから拾ってきたコードを組み合わせてCNNで機械学習を行えるようになりました。
コードを見直していると、何を行っているのか理解できない部分があったため、解説していただきたく、質問させていただきました。

本コードでは間違えてvalidation dataにtrain_test_splitで分離したtestデータをvalidationに使用してしまっていたため、解決次第、trainデータ、validationデータ、testデータの3つに分けて学習・評価を行おうと思っています。

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

合計23940個のサンプルがあり、train_test_splitで30%をテストデータとし、16758個のtrainデータと7182個のtestデータに分けました。

質問1
9行目で
for train, test in kfold.split(x_train, y_train):
とありますが、これは何を層化k分割交差検証しているのでしょうか。そもそも層化k分割交差検証できているのでしょうか。次の①、②、③のうちどれが正しいのか、あるいはどれも正しくないのか教えてただきたいです。

①16758個のtrainデータをfold_numberの2で分け、前半の8329個のtrainデータで50エポックの学習を行いつつ7182個のデータでvalidationも行う。終了次第後半の8329個のtrainデータで50エポックの学習を最初から行いつつ、7182個のデータでvalidationも行う。

②16758個のtrainデータと7182個のtestデータをfold_numberの2で分け、前半の8329個のtrainデータで50エポックの学習を行いつつ前半の3591個のデータでvalidationも行う。終了次第後半の8329個のtrainデータで50エポックの学習を最初から行いつつ、後半の3591個のデータでvalidationも行う。

③16758個のtrainデータで50エポックの学習を行いつつ7182個のデータでvalidationも行う。それをただ2回繰り返す。

質問2
色んなサイトを見ていると、kfold.splitの引数にx_trainしか指定していないコードがたくさん見受けられました。
kfold.split(x_train, y_train)ではなく、kfold.split(x_train)でも同じ結果になるのかどうか教えていただきたいです。

該当のソースコード

python

1fold_number = 2 2seed =7 3np.random.seed(seed) 4kfold = StratifiedKFold(n_splits = fold_number, shuffle = True, random_state = seed) 5cvscores = [] 6 7start_time = time.time() 8 9for train, test in kfold.split(x_train, y_train): 10 model = Sequential() 11 model.add(Conv2D(16, (3, 3), padding='same', 12 input_shape=(100, 100, 1), activation='relu')) 13 model.add(MaxPooling2D(pool_size=(2, 2))) 14 model.add(Conv2D(128, (3, 3), padding='same', activation='relu')) #3*3*16のフィルタを128枚 15 model.add(Conv2D(256, (3, 3), padding='same', activation='relu')) #3*3*128のフィルタを256枚 16 model.add(MaxPooling2D(pool_size=(2, 2))) 17 model.add(Dropout(0.5)) 18 model.add(Flatten()) 19 model.add(Dense(128, activation='relu')) 20 model.add(Dropout(0.5)) 21 model.add(Dense(class_number, activation='softmax')) 22 23 model.summary() 24 25 model.compile(loss='categorical_crossentropy', 26 optimizer=Adam(amsgrad=True), 27 metrics=['accuracy']) 28 29 history = model.fit(x_train, keras.utils.to_categorical(y_train, class_number), 30 batch_size=128, epochs=50, verbose=1, 31 validation_data=(x_test, keras.utils.to_categorical(y_test, class_number))) 32 33 scores = model.evaluate(x_test, keras.utils.to_categorical(y_test, class_number), 34 verbose=0) 35 print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100)) 36 cvscores.append(scores[1] * 100)

試したこと

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html
公式サイトを見ましたがよく理解できませんでした。

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

これは何を層化k分割交差検証しているのでしょうか。

"y_trainのクラスラベル"で"x_trainを層化"です。

公式サイトを見ましたがよく理解できませんでした。

根気良くドキュメントを読むしかないと思います。
split
イメージ説明

次の①、②、③のうちどれが正しいのか、あるいはどれも正しくないのか教えてただきたいです。

どれも違います。まず 16,758 を 2 で割ると 8379 で 8329 ではありません。
今回で言えば分割した片方を訓練データ、もう片方を検証データとして使用します。(正確には関数の戻り値はindexです)
ですので

解決次第、trainデータ、validationデータ、testデータの3つに分けて学習・評価を行おうと思っています。

は不要で最も良い結果が出たモデルに対してテストデータを用いた評価を行い最終判断すれば良いかと思います。


【追記】
model.fitに渡す訓練データはx_train[train], 正解ラベルはy_train[train]としないとkfold.split(x_train, y_train)の意味なく全ての訓練データとラベルで学習してしまっていますね。model.fitのvalidation_dataの指定はしないで、model.evaluateでx_train[test], y_train[test]を使えば良いかと思います。

投稿2024/01/19 15:05

編集2024/01/19 15:29
meg_

総合スコア10582

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

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

tatata1111

2024/01/19 15:51

ご回答いただきありがとうございます!計算ミスお恥ずかしいです・・・。 前半をtrain、後半をvalidationに使い、入れ替えて2回目の学習に行うということですね!良く分かりました。 そうすると、31行目でvalidation dataとして(x_test,y_test)を指定しているのですが、こちらの扱いはどのようになるのでしょうか? 上書きされて(x_test,y_test)をvalidationに使うのか、それとも前半をtrain、後半をvalidationに使い・・・となるのかどちらかお教えいただきたいです。
tatata1111

2024/01/19 15:53

すみません、追記と入れ違いになってしまいました。
tatata1111

2024/01/19 16:14 編集

model.fitでvalidation dataの指定は必要無いということですね! x_train[train]やy_train[train]、x_train[test], y_train[test] というのはどのような意味なのでしょうか。 model.evaluateに使うのはx_test,y_testだと認識しているのですが、x_test,y_testとx_train[test], y_train[test]との違いが分かりません。 勉強不足で申し訳ありません。ご教授いただければ幸いです。
meg_

2024/01/19 16:50

> x_train[train]やy_train[train]、x_train[test], y_train[test] というのはどのような意味なのでしょうか。 ドキュメントにもあるようにsplit()の戻り値は訓練データ、テストデータそれぞれのインデックスです。ですのでsplit()に引数として渡したデータからそれらのインデックスでデータを抽出する必要があるのです。
meg_

2024/01/19 16:58

model.fit()のパラメータvalidation_dataにx_train[test], y_train[test]を使っても良いと思います。その場合はハイパーパラメーター調整後の最終モデルにたいして一度だけ「train_test_splitで分離したtestデータ」でmodel.evaluate()を実行すれば良いと思います。
tatata1111

2024/01/21 18:48

お返事が遅くなってしまい申し訳ありません。丁寧に説明いただきありがとうございました。よく理解できました!助かりました!
guest

0

https://qiita.com/chorome/items/54e99093050a9473a189
こちらのサイトも参考にすると理解が進みました。

投稿2024/01/21 19:19

tatata1111

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問