回答編集履歴

10

append LSTM

2023/02/10 17:20

投稿

ps_aux_grep
ps_aux_grep

スコア1579

test CHANGED
@@ -182,3 +182,39 @@
182
182
  49-51行目の操作が質問の14行目に相当します.モデルの改善による精度改善を期待して,特徴量をXYZ座標値でまとめつつ`X1`,`X2`,`X3`に分割してモデルに与えることを想定しています.モデル中で好きなように特徴抽出,結合などの演算を行なってください.精度さえ良ければ3つどころかもっと分割しても面白いですし,隣接する接点ごとに分割することもできると思います.また,CNNでなくLSTM等の時系列を扱うモデルを採用してみるのも良いでしょう.過学習を抑制するために,帰納的バイアスに基づいたモデル設計を推奨します.ここらからはTrial and Errorの段階です.
183
183
 
184
184
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-02-10/fd2e0f87-551d-4c3c-9b05-45896fad833e.png)
185
+
186
+ LSTMを使う例を示します.
187
+ ```python
188
+ from keras.layers import LSTM
189
+ def build_model1(time_stamp):
190
+ inputs1 = Input(shape = (time_stamp, 3))
191
+ inputs2 = Input(shape = (time_stamp, 3))
192
+ inputs3 = Input(shape = (time_stamp, 12))
193
+
194
+ x1 = LSTM(32, dropout = 0.2, return_sequences = True)(inputs1) # 3列を32列で表現させる
195
+ x2 = LSTM(32, dropout = 0.2, return_sequences = True)(inputs2) # 3列を32列で表現させる
196
+ x3 = LSTM(32, dropout = 0.2, return_sequences = True)(inputs3) # 12列を32列で表現させる
197
+
198
+ combined = Concatenate(axis = -1)([x1, x2, x3]) # 32+32+32=96列になる
199
+ x = LSTM(32, dropout = 0.2)(combined) # 32列に圧縮する
200
+ x = Dense(1, activation = "sigmoid")(x)
201
+ return Model(inputs = [inputs1, inputs2, inputs3], outputs = x)
202
+
203
+ def build_model2(time_stamp):
204
+ inputs1 = Input(shape = (time_stamp, 3))
205
+ inputs2 = Input(shape = (time_stamp, 3))
206
+ inputs3 = Input(shape = (time_stamp, 12))
207
+
208
+ x1 = Conv1D(32, 7, activation = "swish", kernel_initializer = "he_uniform")(inputs1) # 3列を32列で表現させる
209
+ x1 = AveragePooling1D()(x1) # 時間軸上で半分に圧縮する
210
+ x2 = Conv1D(32, 7, activation = "swish", kernel_initializer = "he_uniform")(inputs2) # 3列を32列で表現させる
211
+ x2 = AveragePooling1D()(x2) # 時間軸上で半分に圧縮する
212
+ x3 = Conv1D(32, 7, activation = "swish", kernel_initializer = "he_uniform")(inputs3) # 12列を32列で表現させる
213
+ x3 = AveragePooling1D()(x3) # 時間軸上で半分に圧縮する
214
+
215
+ combined = Concatenate(axis = -1)([x1, x2, x3]) # 32+32+32=96列になる
216
+ x = LSTM(32, dropout = 0.2)(combined) # 32列に圧縮する
217
+ x = Dense(1, activation = "sigmoid")(x)
218
+ return Model(inputs = [inputs1, inputs2, inputs3], outputs = x)
219
+ ```
220
+ Kerasの[LSTM](https://keras.io/api/layers/recurrent_layers/lstm/)について読んでからパラメータをいじった方が良さそうです.特にcuDNNに対応していないパラメータを利用するとGPUでも遅くなります.一般には,入力側の表現力を大きく,出力側の表現力を小さくするようにパラメータをいじります.ここでは列数が表現力に相当しますね.

9

fix answer

2023/02/09 19:12

投稿

ps_aux_grep
ps_aux_grep

スコア1579

test CHANGED
@@ -179,5 +179,6 @@
179
179
  * `EarlyStopping`によって10epoch間で`val_loss`の最低値更新がない場合は学習終了とする.
180
180
  * 各Foldでモデルを保存しないと消えることに注意
181
181
 
182
- 49-51行目の操作が質問の14行目に相当します.モデルの改善による精度改善を期待して,特徴量をXYZ座標値でまとめつつ`X1`,`X2`,`X3`に分割してモデルに与えることを想定しています.モデル中で好きなように特徴抽出,結合などの演算を行なってください.精度が上がるなら3つどころかもっと分割してもいですし,LSTM等の時系列を扱うモデルを採用してみるのも良いでしょう.ここらからはTrial and Errorの段階です.
182
+ 49-51行目の操作が質問の14行目に相当します.モデルの改善による精度改善を期待して,特徴量をXYZ座標値でまとめつつ`X1`,`X2`,`X3`に分割してモデルに与えることを想定しています.モデル中で好きなように特徴抽出,結合などの演算を行なってください.精度さえ良ければ3つどころかもっと分割しても面白いですし,隣接する接点ごとに分割することもできると思います.また,CNNでなくLSTM等の時系列を扱うモデルを採用してみるのも良いでしょう.過学習を抑制するために,帰納的バイアスに基づいたモデル設計を推奨します.ここらからはTrial and Errorの段階です.
183
+
183
184
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-02-10/fd2e0f87-551d-4c3c-9b05-45896fad833e.png)

8

fix answer

2023/02/09 18:02

投稿

ps_aux_grep
ps_aux_grep

スコア1579

test CHANGED
@@ -179,5 +179,5 @@
179
179
  * `EarlyStopping`によって10epoch間で`val_loss`の最低値更新がない場合は学習終了とする.
180
180
  * 各Foldでモデルを保存しないと消えることに注意
181
181
 
182
- 49-51行目の操作が質問の14行目に相当します.モデルの改善による精度改善を期待して,特徴量をXYZ座標値でまとめつつ`X1`,`X2`,`X3`に分割してモデルに与えることを想定しています.モデル中で好きなように特徴抽出,結合などの演算を行なってください.
182
+ 49-51行目の操作が質問の14行目に相当します.モデルの改善による精度改善を期待して,特徴量をXYZ座標値でまとめつつ`X1`,`X2`,`X3`に分割してモデルに与えることを想定しています.モデル中で好きなように特徴抽出,結合などの演算を行なってください.精度が上がるなら3つどころかもっと分割しても良いですし,LSTM等の時系列を扱うモデルを採用してみるのも良いでしょう.ここらからはTrial and Errorの段階です.
183
183
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-02-10/fd2e0f87-551d-4c3c-9b05-45896fad833e.png)

7

add model graph

2023/02/09 18:00

投稿

ps_aux_grep
ps_aux_grep

スコア1579

test CHANGED
@@ -180,3 +180,4 @@
180
180
  * 各Foldでモデルを保存しないと消えることに注意
181
181
 
182
182
  49-51行目の操作が質問の14行目に相当します.モデルの改善による精度改善を期待して,特徴量をXYZ座標値でまとめつつ`X1`,`X2`,`X3`に分割してモデルに与えることを想定しています.モデル中で好きなように特徴抽出,結合などの演算を行なってください.
183
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2023-02-10/fd2e0f87-551d-4c3c-9b05-45896fad833e.png)

6

fix dropout

2023/02/09 17:47

投稿

ps_aux_grep
ps_aux_grep

スコア1579

test CHANGED
@@ -105,8 +105,8 @@
105
105
  return x
106
106
 
107
107
  combined = Concatenate()([cnn(x1), cnn(x2), cnn(x3)])
108
- x = Dropout(0.5)(x)
108
+ x = Dropout(0.5)(combined)
109
- x = Dense(256, activation = "swish")(combined)
109
+ x = Dense(256, activation = "swish")(x)
110
110
  x = Dropout(0.5)(x)
111
111
  x = Dense(128, activation = "swish")(x)
112
112
  x = Dense(1, activation = "sigmoid")(x)

5

add dropout

2023/02/09 17:46

投稿

ps_aux_grep
ps_aux_grep

スコア1579

test CHANGED
@@ -76,7 +76,8 @@
76
76
  import tensorflow as tf
77
77
  from tensorflow.python import keras
78
78
  from keras.models import Sequential, Model
79
+ from keras.layers import Input, Dense, Concatenate, Flatten, Dropout
79
- from keras.layers import Conv1D, Input, Flatten, Dense, Concatenate, AveragePooling1D, GlobalAveragePooling1D
80
+ from keras.layers import Conv1D, AveragePooling1D, GlobalAveragePooling1D
80
81
  from keras.optimizers import Adam
81
82
  from keras.callbacks import EarlyStopping, ReduceLROnPlateau
82
83
 
@@ -104,7 +105,10 @@
104
105
  return x
105
106
 
106
107
  combined = Concatenate()([cnn(x1), cnn(x2), cnn(x3)])
108
+ x = Dropout(0.5)(x)
107
109
  x = Dense(256, activation = "swish")(combined)
110
+ x = Dropout(0.5)(x)
111
+ x = Dense(128, activation = "swish")(x)
108
112
  x = Dense(1, activation = "sigmoid")(x)
109
113
  return Model(inputs = [inputs1, inputs2, inputs3], outputs = x)
110
114
 

4

fix callbacks

2023/02/09 17:41

投稿

ps_aux_grep
ps_aux_grep

スコア1579

test CHANGED
@@ -138,7 +138,8 @@
138
138
  steps_per_epoch = steps_per_epoch,
139
139
  class_weight = {0: 4, 1: 1},
140
140
  validation_data = valid_gen,
141
- validation_steps = validation_steps
141
+ validation_steps = validation_steps,
142
+ callbacks = [es],
142
143
  )
143
144
 
144
145
  # テストデータを与えて各データの種類を推測

3

fix answer

2023/02/09 17:38

投稿

ps_aux_grep
ps_aux_grep

スコア1579

test CHANGED
@@ -174,4 +174,4 @@
174
174
  * `EarlyStopping`によって10epoch間で`val_loss`の最低値更新がない場合は学習終了とする.
175
175
  * 各Foldでモデルを保存しないと消えることに注意
176
176
 
177
- 49-51行目の操作が質問の14行目に相当します.
177
+ 49-51行目の操作が質問の14行目に相当します.モデルの改善による精度改善を期待して,特徴量をXYZ座標値でまとめつつ`X1`,`X2`,`X3`に分割してモデルに与えることを想定しています.モデル中で好きなように特徴抽出,結合などの演算を行なってください.

2

append context

2023/02/09 17:30

投稿

ps_aux_grep
ps_aux_grep

スコア1579

test CHANGED
@@ -173,3 +173,5 @@
173
173
  * CNNによるFeature Extractを特徴量ごとにまとめて実行,Classifierに渡す前に結合`Concatenation`して推論する.
174
174
  * `EarlyStopping`によって10epoch間で`val_loss`の最低値更新がない場合は学習終了とする.
175
175
  * 各Foldでモデルを保存しないと消えることに注意
176
+
177
+ 49-51行目の操作が質問の14行目に相当します.

1

change dir

2023/02/09 17:27

投稿

ps_aux_grep
ps_aux_grep

スコア1579

test CHANGED
@@ -24,7 +24,7 @@
24
24
  # for i in range(17):
25
25
  # ret = np.vstack([ret, ret[-1] * np.sin((i + 1) * t + np.pi * i)])
26
26
  # ret = ret.T
27
- # with open(f"/content/drive/MyDrive/Society/data/{name}/{s}.csv", "w") as f:
27
+ # with open(f"/content/drive/MyDrive/data/{name}/{s}.csv", "w") as f:
28
28
  # writer = csv.writer(f)
29
29
  # writer.writerow([str(i) for i in range(18)])
30
30
  # writer.writerows([[col for col in row] for row in ret])
@@ -38,7 +38,7 @@
38
38
  self.file, self.y, self.l = list(), list(), list()
39
39
  self.category = {"normal": 0, "abnormal": 1}
40
40
  for name in self.category.keys():
41
- for i, file in enumerate(glob(f"/content/drive/MyDrive/Society/data/{name}/*.csv")):
41
+ for i, file in enumerate(glob(f"/content/drive/MyDrive/data/{name}/*.csv")):
42
42
  self.file.append(file)
43
43
  self.y.append(self.category[name])
44
44
  self.l.append(len(open(file).readlines()) - 1) # subtract header row