前提・実現したいこと
Pythonをベースに、Kerasを用いてロボットの7つの部品から得られた電圧データから、深層学習によって異常検知を行おうとしています。7つの部品それぞれについて30万個の観測データをwindowsizeを500にして、299502行 × 500列の学習データセットを作成し学習を行おうとしています。ニューラルネットワークは、一旦部品ごとに入力層でデータを入力し、その後結合して最後はまた部品ごとに出力をします。
発生している問題
学習データセットは299502行 × 500列にしたので、1Epoch当たりの学習回数は299502回になるはずなのですが、9360回と著しく少なくなってしまっています。なぜ学習データセットが減少しているのかがわからないので質問しました。
該当のソースコード
Python
1import numpy as np 2import pandas as pd 3import matplotlib.pyplot as plt 4from sklearn.preprocessing import MinMaxScaler 5from pandas import DataFrame 6import keras 7from keras.layers import Input, Dense, concatenate 8from keras.layers.core import Activation 9from keras.models import Model 10from keras import regularizers 11from keras.utils import plot_model 12 13A_V = pd.read_csv("motors3_normal.csv", usecols=[1]) 14B_V = pd.read_csv("motors3_normal.csv", usecols=[3]) 15E_V = pd.read_csv("motors3_normal.csv", usecols=[7]) 16N_V = pd.read_csv("motors3_normal.csv", usecols=[12]) 17C_V = pd.read_csv("motors3_normal.csv", usecols=[13]) 18D_V = pd.read_csv("motors3_normal.csv", usecols=[15]) 19F_V = pd.read_csv("motors3_normal.csv", usecols=[19]) 20 21A_V_train = A_V[:300001] 22A_V_test = A_V[300001:] 23B_V_train = A_V[:300001] 24(省略) 25 26def subseq(x, w): 27 seq = np.zeros((len(x) - w + 1, w)) 28 x_np = x.iloc[:, 0] 29 for i in range(len(x) - w + 1): 30 seq[i, :] = x_np[i:w+i] 31 return DataFrame(seq) 32 33w_size = 500 34 35train_AV = subseq(A_V_train, w_size) 36test_AV = subseq(A_V_test, w_size) 37train_BV = subseq(B_V_train, w_size) 38(他省略) 39 40sc = MinMaxScaler() 41 42train_AV = sc.fit_transform(train_AV) 43test_AV = sc.fit_transform(test_AV) 44train_BV = sc.fit_transform(train_BV) 45(他省略) 46 47#入力 48input_AV = Input(shape=(w_size,)) 49input_BV = Input(shape=(w_size,)) 50input_CV = Input(shape=(w_size,)) 51input_DV = Input(shape=(w_size,)) 52input_EV = Input(shape=(w_size,)) 53input_FV = Input(shape=(w_size,)) 54input_NV = Input(shape=(w_size,)) 55 56#モデル構築 57#結合前まで 58AV = Dense(w_size, activation="relu")(input_AV) 59AV = Model(inputs=input_AV, outputs=AV) 60BV = Dense(w_size, activation="relu")(input_BV) 61BV = Model(inputs=input_BV, outputs=BV) 62CV = Dense(w_size, activation="relu")(input_CV) 63CV = Model(inputs=input_CV, outputs=CV) 64DV = Dense(w_size, activation="relu")(input_DV) 65DV = Model(inputs=input_DV, outputs=DV) 66EV = Dense(w_size, activation="relu")(input_EV) 67EV = Model(inputs=input_EV, outputs=EV) 68FV = Dense(w_size, activation="relu")(input_FV) 69FV = Model(inputs=input_FV, outputs=FV) 70NV = Dense(w_size, activation="relu")(input_NV) 71NV = Model(inputs=input_NV, outputs=NV) 72 73#結合 74combined = concatenate([AV.output, BV.output, CV.output, DV.output, EV.output, FV.output, NV.output], axis=-1) 75encoded = Dense(1600, activation="relu")(combined) 76encoded = Dense(800, activation="relu")(encoded) 77encoded = Dense(400, activation="relu")(encoded) 78decoded = Dense(200, activation="relu")(encoded) 79decoded = Dense(400, activation="relu")(decoded) 80decoded = Dense(800, activation="relu")(decoded) 81decoded = Dense(1600, activation="relu")(decoded) 82decoded = Dense(3500, activation="relu")(decoded) 83 84#出力 85output_AV = Dense(w_size, activation="relu")(decoded) 86output_BV = Dense(w_size, activation="relu")(decoded) 87output_CV = Dense(w_size, activation="relu")(decoded) 88output_DV = Dense(w_size, activation="relu")(decoded) 89output_EV = Dense(w_size, activation="relu")(decoded) 90output_FV = Dense(w_size, activation="relu")(decoded) 91output_NV = Dense(w_size, activation="relu")(decoded) 92 93model = Model(inputs=[input_AV, input_BV, input_CV, input_DV, input_EV, input_FV, input_NV], 94 outputs=[output_AV, output_BV, output_CV, output_DV, output_EV, output_FV, output_NV]) 95 96model.compile(optimizer="adadelta", loss="binary_crossentropy") 97 98history = model.fit([train_AV, train_BV, train_CV, train_DV, train_EV, train_FV, train_NV], 99 [train_AV, train_BV, train_CV, train_DV, train_EV, train_FV, train_NV], 100 epochs=1000, 101 batch_size=None, 102 verbose=1)
試したこと
部品1つだけの学習データセットでやってみたところ、きちんと作成したデータセット数と1Epochの学習回数が一致していました。やはり7つの部品のデータをマルチインプットしているために、うまくいっていないのかなと思います。
補足情報(FW/ツールのバージョンなど)
pythonは3.8.5、kerasは2.4.3です。
Anaconda、jupyterLabを使っています。
自分は情報系ではなく、あまりプログラミングにも詳しくないのでコードも見ずらいかもしれもせんが、よろしくお願いします。
あなたの回答
tips
プレビュー