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

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

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

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

Q&A

0回答

1254閲覧

機械学習において配列の長さを変える方法

babbleman

総合スコア107

scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

0グッド

1クリップ

投稿2021/04/06 00:55

一次元配列の長さが20万の配列について、長さを変えるやり方は御座いますでしょうか?
やりたいこととしては、ある入力の値に対して一つの値を得たいです。

この配列は実質的にはほとんどが0なので、当初はスクラッチで該当の場所のみ更新をするようにしていましたが、
データ数が1000とか10000になると段々学習がうまくいかなくなってきました。

そこでscikit-learnを使おうと思ったのですが、自分はこのscikit-learnを使うのが初めてでとりあえずモデルはニューラルネットワークを選択しました。
そしてこのニューラルネットワークに入れるためのデータを作ろうとしたのですが、なにぶん配列の長さが20万なので(ちなみにこれは20万次元というのでしょうか?)データ数が20000を超えたところでメモリエラーが起きてしまいました。

これの解決策として自分が今考えているのは
配列を10個くらいで区切ってそれぞれに対して4進数を入れてしまう。(入力の最大が4なので)

または段階的に学習することができるのであれば、そのようにすることも考えたいです。
機械学習初心者なので、お手柔らかに教えて頂きたいです。宜しくお願い致します。

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

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

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

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

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

meg_

2021/04/06 01:58

> データ数が20000を超えたところでメモリエラーが起きてしまいました。 一度に学習するデータ数を調整すれば良さそうですが、そちらは検討されましたか? ※問題はメモリエラーなのですよね?
toast-uz

2021/04/06 09:39

Sparseが答えのように思いますが、20万行の配列(×8バイトで2メガ未満)でメモリエラーというのは、使い方に課題があるように思います。もっと具体的にエラーとなるコードを提示ください。
babbleman

2021/04/06 10:51

回答していただきありがとうございます。 Sparse表現というものがあるのですね。初めて知りました。 段階的に学習させることも考えたのですが、自分がスクラッチで実装していたところ、学習させる数が外れ値の方に引っ張られてきてしまう現象が増えてきたように思えてたので、できる限り一度の学習で済ませたいという事がありました。 スパース表現についてですが、これは元の情報を保持してくれているのでしょうか? 質問で、4進数で区切って学習させると書いたのですが、こちらはよく考えたら、インデックスをつけているだけだなと気づきました。
jbpb0

2021/04/06 11:50

> 一次元配列の長さが20万の配列について > データ数が20000を超えたところでメモリエラーが起きて は、一桁の整数が20万個集まってるのが1セットで、それが20000セットある、という意味ですか?
babbleman

2021/04/06 14:56

はい。そのような形となっています。
toast-uz

2021/04/06 15:11

特徴量が20万個あるということでしょうか?うまく学習できるようには、ちょっと思えません。
jbpb0

2021/04/06 23:19 編集

512x512の画像の画素数が約26万個なので、それと同じくらい スパースにしなくても、そのまま全結合ニューラルネットに入れて、メモリーが足りるようにバッチサイズを調整したら、行けないかな??
babbleman

2021/04/07 22:03

>メモリーが足りるようにバッチサイズを調整したら、行けないかな?? こちらはつまり学習データを例えば100個ずつくらいに区切って学習させるような形になるでしょうか? 自分の中で心配なのが、例えば何回かエポックを回した時に、後から学習した方のバッチの方により適合してしまって、全体的な適合がしないのではないかという事を懸念しています。 でもこれはまとめて行っても同じ事なのでしょうか?
jbpb0

2021/04/08 05:03

> 学習データを例えば100個ずつくらいに区切って学習させるような形になるでしょうか? そうです ミニバッチ学習といって、ビッグデータでは常套手段です https://aizine.ai/glossary-mini-batch/ > 後から学習した方のバッチの方により適合してしまって、全体的な適合がしないのではないか バッチサイズが小さいと、バッチ毎に傾向に偏りが生じて、あるバッチで学習しても、別のバッチではそれが有効ではなくて、学習が行ったり来たりする、ということが起きることがあります https://www.st-hakky-blog.com/entry/2017/11/16/161805 の「バッチサイズを変えて学習させてみた」のグラフを見てください 上の青い方は、かなり縦軸が振動してますので、相当な行ったり来たりをしてます 下の赤い方は、バッチサイズを大きくしたので、縦軸の振動が減ってます 上記の青い方は、振動していても、平均的には改善してますが、振動したまま改善しない場合もありますので、学習を安定させるには、(メモリーエラーが発生しない範囲で)バッチサイズを大きくした方がいいようです バッチサイズともう一つ重要なのは、学習率です 下記には、バッチサイズと学習率の比が同じならば、十分に学習した後に最終的に得られる精度は同等になる、と説明されてます https://blog.seishin55.com/entry/2019/05/09/181419 https://ai-scholar.tech/articles/machine-learning/sgd つまり、バッチサイズを十分に大きくできない場合でも、それに合わせて学習率を調整すれば、うまく学習できる可能性がある、ということです メモリーエラーが発生しない範囲でバッチサイズを大きくして、学習が安定しなければ学習率を小さくしてみる、のはいかがでしょうか??
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問