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

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

ただいまの
回答率

88.82%

[Python]Deeplearningでエラーが出て困ってます

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 395

Dpulex

score 9

前提・実現したいこと

Pythonを用いてDeeplearningを行いたいです。
ログを用いて異常検知を行うことを目的に行なっているのですが、エラーが出て前に進めない状況です。
dataには列数が1106,行数が151186ある行列が入っています。
それをX_train, X_test, Y_train, Y_testに分けていきます。
これを実装するとうまくいかずエラーが出てしまう現状です

### 発生している問題・エラーメッセージ
Traceback (most recent call last):
  File "lstm_tokutyou.py", line 73, in <module>
    callbacks=[early_stopping])
  File "//anaconda3/lib/python3.7/site-packages/keras/engine/training.py", line 952, in fit
    batch_size=batch_size)
  File "//anaconda3/lib/python3.7/site-packages/keras/engine/training.py", line 751, in _standardize_user_data
    exception_prefix='input')
  File "//anaconda3/lib/python3.7/site-packages/keras/engine/training_utils.py", line 128, in standardize_input_data
    'with shape ' + str(data_shape))
ValueError: Error when checking input: expected bidirectional_1_input to have 3 dimensions, but got array with shape (84664, 1105)V

該当のソースコード

ソースコード
import csv
import re
import datetime
import time
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers.core import Dense, Activation
from keras.layers.recurrent import LSTM
from keras.layers.wrappers import Bidirectional
from keras.optimizers import Adam
from keras.callbacks import EarlyStopping
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle

data = np.loadtxt("lstm_tokutyou1002.csv",delimiter=",")
X = data[:,:1105]
y = data[:,-1]
Y = np.eye(2)[y.astype(int)]
del y
X_train, X_test, Y_train, Y_test = \
    train_test_split(X, Y, test_size=0.3)

X_train, X_validation, Y_train, Y_validation = \
    train_test_split(X_train, Y_train, test_size=0.2)

'''
モデル設定
'''
n_in = 151186
n_long = 1105
n_hidden = 128
n_out = 10


def weight_variable(shape, name=None):
    return np.random.normal(scale=.01, size=shape)


early_stopping = EarlyStopping(monitor='val_loss', patience=10, verbose=1)

model = Sequential()
model.add(Bidirectional(LSTM(n_hidden),
                        input_shape=(n_long,n_in)))
model.add(Dense(n_out, kernel_initializer=initializers.RandomNormal()))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer=Adam(lr=0.001, beta_1=0.9, beta_2=0.999),
              metrics=['accuracy'])

'''
モデル学習
'''
epochs = 300
batch_size = 250

hist = model.fit(X_train, Y_train,
                 batch_size=batch_size,
                 epochs=epochs,
                 validation_data=(X_validation, Y_validation),
                 callbacks=[early_stopping])

'''
学習の進み具合
'''
acc = hist.history['val_acc']
loss = hist.history['val_loss']

plt.rc('font', family='serif')
fig = plt.figure()
plt.plot(range(len(loss)), loss,
         label='loss', color='black')
plt.xlabel('epochs')
plt.show()

'''
予測精度の評価
'''
loss_and_metrics = model.evaluate(X_test, Y_test)
print(loss_and_metrics)

試したこと

ネットで調べてもいい回答が見つかりませんでした。

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

機種名:    Mac mini
機種ID:    Macmini7,1
プロセッサ名:    Intel Core i7
プロセッサ速度:    3 GHz

absl-py              0.8.0  
astor                0.8.0  
chainer              5.1.0  
cycler               0.10.0 
filelock             3.0.10 
gast                 0.3.2  
google-pasta         0.1.7  
grpcio               1.23.0 
h5py                 2.10.0 
Keras                2.3.0  
Keras-Applications   1.0.8  
Keras-Preprocessing  1.1.0  
kiwisolver           1.1.0  
Markdown             3.1.1  
matplotlib           3.1.1  
numpy                1.15.4 
pandas               0.23.4 
pip                  19.1.1 
protobuf             3.6.1  
pyparsing            2.4.2  
python-dateutil      2.7.5  
pytz                 2018.7 
PyYAML               5.1.2  
scikit-learn         0.20.1 
scipy                1.1.0  
setuptools           41.0.1 
six                  1.12.0 
sklearn              0.0    
tensorboard          1.14.0 
tensorflow           1.14.0 
tensorflow-estimator 1.14.0 
termcolor            1.1.0  
Werkzeug             0.15.6 
wheel                0.33.4 
wrapt                1.11.2

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • magichan

    2019/09/19 10:55

    列数が1106,行数が151186のデータというのは、『特徴量が1次元の時系列データ(ステップ数 1105+1) が 151186個(行)ある』ということでしょうか?

    キャンセル

  • Dpulex

    2019/09/19 11:20

    はい、そうです。

    キャンセル

回答 1

checkベストアンサー

0

とりあえず、気がついた箇所を何点か。

1.
今回の入力データは『特徴量が1次元、ステップ数 1105の時系列データ』とのことなので、

n_in = 151186
n_long = 1105
# (略)
model = Sequential()
model.add(Bidirectional(LSTM(n_hidden),
                        input_shape=(n_long,n_in)))

での input_shape の値は (ステップ数, 特徴量の次元数)つまり (1105, 1)となる。
そのため n_in の値は

n_in = 1


にする必要がるのではないかと思います。

2.
現在、X のデータの形式は (151186, 1105) となっているが、上記で設定したinput_shape に合せて (151186, 1105, 1) とする必要があります。

X = data[:,:1105]


の箇所を

X = data[:,:1105].reshape(-1, 1105, 1)


に修正と良いかと思います。

3.
現在出力データは

Y = np.eye(2)[y.astype(int)]

となっており、2クラスとなっているが、モデルの出力は

n_out = 10
# (略)
model.add(Dense(n_out, kernel_initializer=initializers.RandomNormal()))
model.add(Activation('softmax'))

と 10クラスとなっているので、この2つを合わせる必要がります。

とりあえず以上の修正でエラーはなくなるのではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/19 13:05

    ありがとうございます
    参考にさせていただきました

    進めるとこのようなエラーが出ました。

    KeyError: 'val_acc'

    'val_acc'が存在しないのでしょうか

    キャンセル

  • 2019/09/19 13:58

    そのようなエラーが発生しているのであれば、'val_acc'が無いということなのでしょう。(理由はわかりませんが)
    とりあえず、
    print(hist.history)
    にて historyデータを確認してみてください。

    キャンセル

  • 2019/09/20 14:21

    確認したところ、accuracyで保存されていることがわかりました。
    何から何までありがとうございました。

    キャンセル

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

  • ただいまの回答率 88.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る