質問編集履歴

5

修正

2019/12/10 07:28

投稿

fukmats
fukmats

スコア6

test CHANGED
File without changes
test CHANGED
@@ -56,25 +56,9 @@
56
56
 
57
57
 
58
58
 
59
- ```python3
59
+ => thresholdedReLu関数を使用することにしました。
60
60
 
61
61
 
62
-
63
- def myactivation(x):
64
-
65
- x = K.softmax(x) - 0.6
66
-
67
- if
68
-
69
- return K.softmax(x)
70
-
71
-
72
-
73
- model.add(Activation(myactivation))
74
-
75
-
76
-
77
- ```
78
62
 
79
63
  ただ後者では出力が0の際に損失関数が必要以上に大きくなってしまうような気がするので、softmaxの出力に閾値を設定して無視するより、出力に重み付けをするほうがよいのではないかという気がし始めています。
80
64
 

4

追記

2019/12/10 07:28

投稿

fukmats
fukmats

スコア6

test CHANGED
File without changes
test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
 
17
- ### 追記(tkymtmt さんの回答を参考にしたもの)
17
+ ### 追記 12/9(tkymtmt さんの回答を参考にしたもの)
18
18
 
19
19
 
20
20
 
@@ -77,3 +77,9 @@
77
77
  ```
78
78
 
79
79
  ただ後者では出力が0の際に損失関数が必要以上に大きくなってしまうような気がするので、softmaxの出力に閾値を設定して無視するより、出力に重み付けをするほうがよいのではないかという気がし始めています。
80
+
81
+
82
+
83
+ ### 追記 12/10
84
+
85
+ 損失関数に交差エントロピーを用いている時に出力にしきい値を設定してしまうと、損失関数が計算できず(log(0)になるため)学習が進まなくなる可能性が高まる。

3

タイトルの変更

2019/12/10 07:23

投稿

fukmats
fukmats

スコア6

test CHANGED
@@ -1 +1 @@
1
- kerasによる分類におけるsigmoid出力の学習の際の重み付けについて
1
+ 情報を含まないデータを含むデータセットの二値分類
test CHANGED
File without changes

2

修正

2019/12/10 06:12

投稿

fukmats
fukmats

スコア6

test CHANGED
@@ -1 +1 @@
1
- kerasによる二クラス分類sigmoid出力の閾値について
1
+ kerasによる分類におけるsigmoid出力の学習の際の重み付けについて
test CHANGED
@@ -52,7 +52,7 @@
52
52
 
53
53
  (relu関数の出力をモデルの出力とすると最大が0.4となり、必要以上に誤差が大きくなってしまうと考えました。)
54
54
 
55
- ただ最後のsoftmaxを通すことで必要以上に出力が増幅されてしまうと考えられるので、y = 0 (x < 0.6), y = x (0.6 <= x)となるようにいかの活性化関数も作成しました。
55
+ ただ最後のsoftmaxを通すことで必要以上に出力が増幅されてしまうと考えられるので、y = 0 (x < 0.6), y = x (0.6 <= x)となるように以下の活性化関数も作成しました。
56
56
 
57
57
 
58
58
 
@@ -75,3 +75,5 @@
75
75
 
76
76
 
77
77
  ```
78
+
79
+ ただ後者では出力が0の際に損失関数が必要以上に大きくなってしまうような気がするので、softmaxの出力に閾値を設定して無視するより、出力に重み付けをするほうがよいのではないかという気がし始めています。

1

回答に対する追記

2019/12/09 16:23

投稿

fukmats
fukmats

スコア6

test CHANGED
File without changes
test CHANGED
@@ -11,3 +11,67 @@
11
11
  一通りgoogle検索をかけたりkerasのドキュメントをよんだりしたのですが実現する方法が見当たりませんでした。損失関数を自作する必要などがあるのでしょうか。
12
12
 
13
13
  よろしくお願いいたします。
14
+
15
+
16
+
17
+ ### 追記(tkymtmt さんの回答を参考にしたもの)
18
+
19
+
20
+
21
+ 出力層のソフトマックス層
22
+
23
+ ```python3
24
+
25
+ model.add(Activation('softmax'))
26
+
27
+ ```
28
+
29
+ の活性化関数を変更するため以下のようにしました。
30
+
31
+ ```python3
32
+
33
+
34
+
35
+ def myactivation(x):
36
+
37
+ x = K.softmax(x) - 0.6
38
+
39
+ x = K.relu(x)
40
+
41
+ return K.softmax(x)
42
+
43
+
44
+
45
+ model.add(Activation(myactivation))
46
+
47
+
48
+
49
+ ```
50
+
51
+ softmaxの出力から0.6を引き、reluを通すことで0.6以下の出力を0にした後、0.6以上の出力の最大値を1にするためにsoftmaxに入力した結果を出力としました。
52
+
53
+ (relu関数の出力をモデルの出力とすると最大が0.4となり、必要以上に誤差が大きくなってしまうと考えました。)
54
+
55
+ ただ最後のsoftmaxを通すことで必要以上に出力が増幅されてしまうと考えられるので、y = 0 (x < 0.6), y = x (0.6 <= x)となるようにいかの活性化関数も作成しました。
56
+
57
+
58
+
59
+ ```python3
60
+
61
+
62
+
63
+ def myactivation(x):
64
+
65
+ x = K.softmax(x) - 0.6
66
+
67
+ if
68
+
69
+ return K.softmax(x)
70
+
71
+
72
+
73
+ model.add(Activation(myactivation))
74
+
75
+
76
+
77
+ ```