ruby-dnn 0.4.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/API-Reference.ja.md +6 -1
- data/lib/dnn/core/activations.rb +4 -2
- data/lib/dnn/core/initializers.rb +3 -3
- data/lib/dnn/core/layers.rb +37 -51
- data/lib/dnn/core/model.rb +1 -0
- data/lib/dnn/core/optimizers.rb +18 -35
- data/lib/dnn/core/util.rb +5 -4
- data/lib/dnn/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c69ef32fd33f04c1452e3b16a6de42d69274fa717726b0306b30a530935d059
|
4
|
+
data.tar.gz: 3ef80bd96e8328c0bc06762de1440f05eab109fecd3519ff0460abdcbfc2194d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc501da4b2681cc1a3c65c8af2234685618872c466ca720e38692a7c2610d9b4520709babac1c20f91b675cfb74a4e317a71831aba04a71337148d1f4c8effda
|
7
|
+
data.tar.gz: 01cc6815889a578da2601c205b86277ad674531c4020ff624a2f15ea17ea4fe070a4b69228d6f53585f235d96d28d8d44132035d7adb2d963de94c9a3a785fbf
|
data/API-Reference.ja.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
ruby-dnnのAPIリファレンスです。このリファレンスでは、APIを利用するうえで必要となるクラスとメソッドしか記載していません。
|
3
3
|
そのため、プログラムの詳細が必要な場合は、ソースコードを参照してください。
|
4
4
|
|
5
|
-
最終更新バージョン:0.4.
|
5
|
+
最終更新バージョン:0.4.2
|
6
6
|
|
7
7
|
# module DNN
|
8
8
|
ruby-dnnの名前空間をなすモジュールです。
|
@@ -471,6 +471,11 @@ tanh関数のレイヤーです。
|
|
471
471
|
# class LeakyReLU < Layer
|
472
472
|
LeakyReLU関数のレイヤーです。
|
473
473
|
|
474
|
+
## 【Properties】
|
475
|
+
## attr_reader :alpha
|
476
|
+
Float alpha
|
477
|
+
出力値が負のときの傾き。
|
478
|
+
|
474
479
|
## 【Instance methods】
|
475
480
|
|
476
481
|
## def initialize(alpha)
|
data/lib/dnn/core/activations.rb
CHANGED
@@ -5,11 +5,11 @@ module DNN
|
|
5
5
|
|
6
6
|
class Sigmoid < Layer
|
7
7
|
def forward(x)
|
8
|
-
@out = 1
|
8
|
+
@out = 1 / (1 + NMath.exp(-x))
|
9
9
|
end
|
10
10
|
|
11
11
|
def backward(dout)
|
12
|
-
dout * (1
|
12
|
+
dout * (1 - @out) * @out
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
@@ -46,6 +46,8 @@ module DNN
|
|
46
46
|
class LeakyReLU < Layer
|
47
47
|
include Xumo
|
48
48
|
|
49
|
+
attr_reader :alpha
|
50
|
+
|
49
51
|
def initialize(alpha = 0.3)
|
50
52
|
@alpha = alpha
|
51
53
|
end
|
@@ -6,8 +6,8 @@ module DNN
|
|
6
6
|
layer.params[param_key] = param
|
7
7
|
end
|
8
8
|
|
9
|
-
def to_hash
|
10
|
-
{name: self.class.name}
|
9
|
+
def to_hash(hash)
|
10
|
+
{name: self.class.name}.merge(hash)
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
@@ -37,7 +37,7 @@ module DNN
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def to_hash
|
40
|
-
{
|
40
|
+
super({mean: @mean, std: @std})
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
data/lib/dnn/core/layers.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module DNN
|
2
2
|
module Layers
|
3
3
|
|
4
|
-
#Super class of all optimizer classes.
|
4
|
+
# Super class of all optimizer classes.
|
5
5
|
class Layer
|
6
6
|
include Xumo
|
7
7
|
|
@@ -9,43 +9,44 @@ module DNN
|
|
9
9
|
@built = false
|
10
10
|
end
|
11
11
|
|
12
|
-
#Build the layer.
|
12
|
+
# Build the layer.
|
13
13
|
def build(model)
|
14
14
|
@built = true
|
15
15
|
@model = model
|
16
16
|
end
|
17
17
|
|
18
|
-
#Does the layer have already been built?
|
18
|
+
# Does the layer have already been built?
|
19
19
|
def built?
|
20
20
|
@built
|
21
21
|
end
|
22
22
|
|
23
|
-
#Forward propagation.
|
23
|
+
# Forward propagation.
|
24
24
|
def forward() end
|
25
25
|
|
26
|
-
#Backward propagation.
|
26
|
+
# Backward propagation.
|
27
27
|
def backward() end
|
28
28
|
|
29
|
-
#Get the shape of the layer.
|
29
|
+
# Get the shape of the layer.
|
30
30
|
def shape
|
31
31
|
prev_layer.shape
|
32
32
|
end
|
33
33
|
|
34
|
-
#Layer to a hash.
|
35
|
-
def to_hash
|
36
|
-
{name: self.class.name}
|
34
|
+
# Layer to a hash.
|
35
|
+
def to_hash(hash)
|
36
|
+
{name: self.class.name}.merge(hash)
|
37
37
|
end
|
38
38
|
|
39
|
-
#Get the previous layer.
|
39
|
+
# Get the previous layer.
|
40
40
|
def prev_layer
|
41
41
|
@model.layers[@model.layers.index(self) - 1]
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
45
|
|
46
|
+
# This class is a superclass of all classes with learning parameters.
|
46
47
|
class HasParamLayer < Layer
|
47
|
-
attr_reader :params #The parameters of the layer.
|
48
|
-
attr_reader :grads #Differential value of parameter of layer.
|
48
|
+
attr_reader :params # The parameters of the layer.
|
49
|
+
attr_reader :grads # Differential value of parameter of layer.
|
49
50
|
|
50
51
|
def initialize
|
51
52
|
super
|
@@ -58,14 +59,14 @@ module DNN
|
|
58
59
|
init_params
|
59
60
|
end
|
60
61
|
|
61
|
-
#Update the parameters.
|
62
|
+
# Update the parameters.
|
62
63
|
def update
|
63
64
|
@model.optimizer.update(self)
|
64
65
|
end
|
65
66
|
|
66
67
|
private
|
67
68
|
|
68
|
-
#Initialize of the parameters.
|
69
|
+
# Initialize of the parameters.
|
69
70
|
def init_params() end
|
70
71
|
end
|
71
72
|
|
@@ -91,7 +92,7 @@ module DNN
|
|
91
92
|
end
|
92
93
|
|
93
94
|
def to_hash
|
94
|
-
{
|
95
|
+
super({shape: @shape})
|
95
96
|
end
|
96
97
|
end
|
97
98
|
|
@@ -140,13 +141,10 @@ module DNN
|
|
140
141
|
end
|
141
142
|
|
142
143
|
def to_hash
|
143
|
-
{
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
bias_initializer: @bias_initializer.to_hash,
|
148
|
-
weight_decay: @weight_decay,
|
149
|
-
}
|
144
|
+
super({num_nodes: @num_nodes,
|
145
|
+
weight_initializer: @weight_initializer.to_hash,
|
146
|
+
bias_initializer: @bias_initializer.to_hash,
|
147
|
+
weight_decay: @weight_decay})
|
150
148
|
end
|
151
149
|
|
152
150
|
private
|
@@ -292,16 +290,13 @@ module DNN
|
|
292
290
|
end
|
293
291
|
|
294
292
|
def to_hash
|
295
|
-
{
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
padding: @padding,
|
303
|
-
weight_decay: @weight_decay,
|
304
|
-
}
|
293
|
+
super({num_filters: @num_filters,
|
294
|
+
filter_size: @filter_size,
|
295
|
+
weight_initializer: @weight_initializer.to_hash,
|
296
|
+
bias_initializer: @bias_initializer.to_hash,
|
297
|
+
strides: @strides,
|
298
|
+
padding: @padding,
|
299
|
+
weight_decay: @weight_decay})
|
305
300
|
end
|
306
301
|
|
307
302
|
private
|
@@ -371,13 +366,10 @@ module DNN
|
|
371
366
|
end
|
372
367
|
|
373
368
|
def to_hash
|
374
|
-
{
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
strides: @strides,
|
379
|
-
padding: @padding,
|
380
|
-
}
|
369
|
+
super({pool_width: @pool_width,
|
370
|
+
pool_height: @pool_height,
|
371
|
+
strides: @strides,
|
372
|
+
padding: @padding})
|
381
373
|
end
|
382
374
|
end
|
383
375
|
|
@@ -423,10 +415,7 @@ module DNN
|
|
423
415
|
end
|
424
416
|
|
425
417
|
def to_hash
|
426
|
-
{
|
427
|
-
name: self.class.name,
|
428
|
-
unpool_size: @unpool_size,
|
429
|
-
}
|
418
|
+
super({unpool_size: @unpool_size})
|
430
419
|
end
|
431
420
|
end
|
432
421
|
|
@@ -470,7 +459,7 @@ module DNN
|
|
470
459
|
end
|
471
460
|
|
472
461
|
def to_hash
|
473
|
-
{
|
462
|
+
super({shape: @shape})
|
474
463
|
end
|
475
464
|
end
|
476
465
|
|
@@ -518,7 +507,7 @@ module DNN
|
|
518
507
|
end
|
519
508
|
|
520
509
|
def to_hash
|
521
|
-
{
|
510
|
+
super({dropout_ratio: @dropout_ratio})
|
522
511
|
end
|
523
512
|
end
|
524
513
|
|
@@ -576,12 +565,9 @@ module DNN
|
|
576
565
|
end
|
577
566
|
|
578
567
|
def to_hash
|
579
|
-
{
|
580
|
-
|
581
|
-
|
582
|
-
running_mean: @running_mean.to_a,
|
583
|
-
running_var: @running_var.to_a,
|
584
|
-
}
|
568
|
+
super({momentum: @momentum,
|
569
|
+
running_mean: @running_mean.to_a,
|
570
|
+
running_var: @running_var.to_a})
|
585
571
|
end
|
586
572
|
|
587
573
|
private
|
data/lib/dnn/core/model.rb
CHANGED
data/lib/dnn/core/optimizers.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module DNN
|
2
2
|
module Optimizers
|
3
3
|
|
4
|
-
#Super class of all optimizer classes.
|
4
|
+
# Super class of all optimizer classes.
|
5
5
|
class Optimizer
|
6
6
|
attr_accessor :learning_rate
|
7
7
|
|
@@ -9,11 +9,11 @@ module DNN
|
|
9
9
|
@learning_rate = learning_rate
|
10
10
|
end
|
11
11
|
|
12
|
-
#Update layer has params.
|
12
|
+
# Update layer has params.
|
13
13
|
def update(layer) end
|
14
14
|
|
15
|
-
def to_hash
|
16
|
-
{name: self.class.name, learning_rate: @learning_rate}
|
15
|
+
def to_hash(hash)
|
16
|
+
{name: self.class.name, learning_rate: @learning_rate}.merge(hash)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
@@ -21,39 +21,31 @@ module DNN
|
|
21
21
|
class SGD < Optimizer
|
22
22
|
attr_accessor :momentum
|
23
23
|
|
24
|
+
def self.load_hash(hash)
|
25
|
+
self.new(hash[:learning_rate], momentum: hash[:momentum])
|
26
|
+
end
|
27
|
+
|
24
28
|
def initialize(learning_rate = 0.01, momentum: 0)
|
25
29
|
super(learning_rate)
|
26
30
|
@momentum = momentum
|
27
|
-
@
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.load_hash(hash)
|
31
|
-
self.new(hash[:learning_rate], hash[:momentum])
|
31
|
+
@v = {}
|
32
32
|
end
|
33
33
|
|
34
34
|
def update(layer)
|
35
|
-
|
36
|
-
@amounts[layer]
|
37
|
-
else
|
38
|
-
@amounts[layer] = {}
|
39
|
-
end
|
35
|
+
@v[layer] ||= {}
|
40
36
|
layer.params.each_key do |key|
|
41
|
-
amount
|
37
|
+
amount = layer.grads[key] * @learning_rate
|
42
38
|
if @momentum > 0
|
43
|
-
@
|
44
|
-
amount
|
45
|
-
@
|
39
|
+
@v[layer][key] ||= 0
|
40
|
+
amount += @momentum * @v[layer][key]
|
41
|
+
@v[layer][key] = amount
|
46
42
|
end
|
47
|
-
layer.params[key] -= amount
|
43
|
+
layer.params[key] -= amount
|
48
44
|
end
|
49
45
|
end
|
50
46
|
|
51
47
|
def to_hash
|
52
|
-
{
|
53
|
-
name: self.class.name,
|
54
|
-
learning_rate: @learning_rate,
|
55
|
-
momentum: @momentum,
|
56
|
-
}
|
48
|
+
super({momentum: @momentum})
|
57
49
|
end
|
58
50
|
end
|
59
51
|
|
@@ -102,11 +94,7 @@ module DNN
|
|
102
94
|
end
|
103
95
|
|
104
96
|
def to_hash
|
105
|
-
{
|
106
|
-
name: self.class.name,
|
107
|
-
learning_rate: @learning_rate,
|
108
|
-
muse: @muse,
|
109
|
-
}
|
97
|
+
super({muse: @muse})
|
110
98
|
end
|
111
99
|
end
|
112
100
|
|
@@ -145,12 +133,7 @@ module DNN
|
|
145
133
|
end
|
146
134
|
|
147
135
|
def to_hash
|
148
|
-
{
|
149
|
-
name: self.class.name,
|
150
|
-
learning_rate: @learning_rate,
|
151
|
-
beta1: @beta1,
|
152
|
-
beta2: @beta2,
|
153
|
-
}
|
136
|
+
super({beta1: @beta1, beta2: @beta2})
|
154
137
|
end
|
155
138
|
end
|
156
139
|
|
data/lib/dnn/core/util.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
module DNN
|
2
|
+
# This module provides utility functions.
|
2
3
|
module Util
|
3
|
-
#Create a mini batch for
|
4
|
+
# Create a mini batch for "batch_size".
|
4
5
|
def self.get_minibatch(x, y, batch_size)
|
5
6
|
indexes = (0...x.shape[0]).to_a.sample(batch_size)
|
6
7
|
[x[indexes, false], y[indexes, false]]
|
7
8
|
end
|
8
9
|
|
9
|
-
#Categorize labels into "num_classes" classes.
|
10
|
+
# Categorize labels into "num_classes" classes.
|
10
11
|
def self.to_categorical(y, num_classes, narray_type = nil)
|
11
12
|
narray_type ||= y.class
|
12
13
|
y2 = narray_type.zeros(y.shape[0], num_classes)
|
@@ -16,12 +17,12 @@ module DNN
|
|
16
17
|
y2
|
17
18
|
end
|
18
19
|
|
19
|
-
#Perform numerical differentiation
|
20
|
+
# Perform numerical differentiation.
|
20
21
|
def self.numerical_grad(x, func)
|
21
22
|
(func.(x + 1e-7) - func.(x)) / 1e-7
|
22
23
|
end
|
23
24
|
|
24
|
-
#Convert hash to an object.
|
25
|
+
# Convert hash to an object.
|
25
26
|
def self.load_hash(hash)
|
26
27
|
dnn_class = DNN.const_get(hash[:name])
|
27
28
|
if dnn_class.respond_to?(:load_hash)
|
data/lib/dnn/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-dnn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- unagiootoro
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-07-
|
11
|
+
date: 2018-07-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: numo-narray
|