回答編集履歴
10
append LSTM
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
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`に分割してモデルに与えることを想定しています.モデル中で好きなように特徴抽出,結合などの演算を行なってください.精度
|
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
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
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
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)(
|
108
|
+
x = Dropout(0.5)(combined)
|
109
|
-
x = Dense(256, activation = "swish")(
|
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
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,
|
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
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
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
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
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/
|
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/
|
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
|