この記事はKerasを使い始めて間も無い人のために役立つ記事です。
この記事の要約(忙しい人向け)
Kerasにpandas.DataFrameをつっこんではいけない。
numpy.ndarrayに変換する必要がある。
導入
まずKerasとは何なのか?
からちょこっと書きます。
Kerasは、Pythonで書かれた、TensorFlowまたはTheano上で実行可能な高水準のニューラルネットワークライブラリです。 Kerasは、迅速な実験を可能にすることに重点を置いて開発されました。 可能な限り遅れなくアイデアから結果に進められることは、良い研究をする上で重要です。 (引用元:https://keras.io/ja/)
また、このサイトではKerasの良い点として以下の4点を挙げています。
- 簡単で早くプロトタイプ作成が可能 (全体的なモジュール性、ミニマリズム、および拡張性による)
- CNNとRNNの両方、およびこれらの2つの組み合わせをサポート
- 任意の接続方式 (複数入力および複数出力の学習を含む) をサポート
- CPUとGPUでシームレスな実行
なんだかよく分からないけど、kerasはすごいらしい。
それに、日本ではChainner(スペル合ってる?)が流行っているらしいけど、
Kaggleのフォーラムを見ているかぎり、グローバルスタンダードなのはkerasなのかな
と思った。
それに実際ChainnerよりKerasの方が使いやすいって言っている人もいる。
ということで、僕はKerasを使い始めました。
本題
いざKerasで深層学習をしようと思い、csvファイルからデータをpandasで読み込みました。
下が一連のコード
from keras.models import Sequential from keras.layers.core import Dense, Dropout, Activation from keras.optimizers import RMSprop from keras.callbacks import EarlyStopping import pandas as pd from sklearn.model_selection import train_test_split batch_size = 39 nb_epoch = 100 if __name__ == '__main__': df = pd.read_csv('hoge.csv') df.columns = ['v1','v2','v3','t1','t2','t3','h1','h2','a1','a2','a3','loss'] X = df.loc[:,'v1':'a3'] y = df['loss'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # building the model print('building the model ...') model = Sequential() model.add(Dense(22, input_shape=(11,))) model.add(Activation('relu')) model.add(Dropout(0.2)) model.add(Dense(11)) model.add(Activation('relu')) model.add(Dropout(0.2)) model.add(Dense(1)) rms = RMSprop() model.compile(loss='mean_absolute_error', optimizer=rms, metrics=['accuracy']) # early stopping early_stopping = EarlyStopping(monitor='val_loss', patience=0) # training hist = model.fit(X_train, y_train, batch_size=batch_size, verbose=1, nb_epoch=nb_epoch, validation_split=0.1, callbacks=[early_stopping])
(人工知能に関する断創録 – 深層学習ライブラリ Keras様のソースコードを参考にさせていただきましたm(_ _)m)
しかし・・・
このコードではエラーが出てしまい、分析できません。
参考にしたコードでエラーは出なかったので、僕が独自で書き換えた部分が悪さをしているようです。
エラーの内容は以下のよう。
Traceback (most recent call last): File "/Users/Pikachu/Documents/workspace/Python/DeepLearning/DL.py", line 58, in <module> callbacks=[early_stopping]) File "/Users/Pikachu/.pyenv/versions/2.7.9/lib/python2.7/site-packages/keras/models.py", line 627, in fit sample_weight=sample_weight) File "/Users/Pikachu/.pyenv/versions/2.7.9/lib/python2.7/site-packages/keras/engine/training.py", line 1124, in fit callback_metrics=callback_metrics) File "/Users/Pikachu/.pyenv/versions/2.7.9/lib/python2.7/site-packages/keras/engine/training.py", line 831, in _fit_loop ins_batch = slice_X(ins[:-1], batch_ids) + [ins[-1]] File "/Users/Pikachu/.pyenv/versions/2.7.9/lib/python2.7/site-packages/keras/engine/training.py", line 313, in slice_X return [x[start] for x in X] File "/Users/Pikachu/.pyenv/versions/2.7.9/lib/python2.7/site-packages/pandas/core/frame.py", line 2053, in __getitem__ return self._getitem_array(key) File "/Users/Pikachu/.pyenv/versions/2.7.9/lib/python2.7/site-packages/pandas/core/frame.py", line 2098, in _getitem_array return self.take(indexer, axis=1, convert=True) File "/Users/Pikachu/.pyenv/versions/2.7.9/lib/python2.7/site-packages/pandas/core/generic.py", line 1669, in take convert=True, verify=True) File "/Users/Pikachu/.pyenv/versions/2.7.9/lib/python2.7/site-packages/pandas/core/internals.py", line 3953, in take indexer = maybe_convert_indices(indexer, n) File "/Users/Pikachu/.pyenv/versions/2.7.9/lib/python2.7/site-packages/pandas/core/indexing.py", line 1872, in maybe_convert_indices raise IndexError("indices are out-of-bounds") IndexError: indices are out-of-bounds
indices are out-of-boundsでぐぐってみると、同様なエラーで悩んでいる人が見つかりました。
→Keras IndexError: indices are out-of-bounds
つまり、上のコードではだめで、
どうすればいいのかというと
#悪い例 X = df.loc[:,'v1':'a3']
のようにDataFrameをそのまま入力データに使っていたところを、
#正しい例 X = df.loc[:,'v1':'a3'].values
のように、numpy.ndarrayに変換しなくてはならないのでした。※
最後に
Kerasの日本ユーザーは少ないんでしょうか・・?
Kerasについての日本語のブログが少ない気がしました。
もっとKerasユーザーが増えるといいですね。
お疲れ様した。
※ちなみにyについては、pandas.Seriesのままつっこんでも正常に動作しました。