ruby-dnn 0.8.6 → 0.8.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 63b7cd17090ec6fd4e1f23e6b40f3c41e8a31ad0fa887945bda962a6df305c1b
4
- data.tar.gz: b7e173f392c73e8151bde633d61913e8ce1645aaf9acc3a48788a950890d6ca4
3
+ metadata.gz: '081852bef9d80484e000f4c67e2be9d7b7b5e4c4c72500800ab80ba6a56322e7'
4
+ data.tar.gz: 8365b770fabd3a021ea7472058569be62fa9ef7d4f459a2220a614b2e213c8ed
5
5
  SHA512:
6
- metadata.gz: c35a8a90216f42fcd8f88b4d4ee6f98fa517c5c2c8aaa6e61eeb8c260b176966c979e0e25311c6c4d0237e89f5e9c0f39eb056f1fad37f5fbaeeff7d0a4e1739
7
- data.tar.gz: d2905e0b21c2dd2911cd985e490425be1909fed26e66e63b357aff7d657c2c86099653b1cdff8910171a7f1302029b2aa1f5f63f850b2a3f3d398e2325982475
6
+ metadata.gz: c3ee7b5203c8cb70e4cbd375d6c53f4a61e54d73aafc77582acc61fd2dd11b8a54642264ef70eaf4f02385b53d62303c0c0ca56de68ddfc2f80a39ca343953d8
7
+ data.tar.gz: d26ef9bf7040e200fd9ed3673fab1538432f1174669cbbe944a8c6566736a5ea7f8a355d0a0672e3b1f51a6e0e1cdf94f8df5b836a2b2b2ce7370160c7a6066d
data/API-Reference.ja.md CHANGED
@@ -2,7 +2,7 @@
2
2
  ruby-dnnのAPIリファレンスです。このリファレンスでは、APIを利用するうえで必要となるクラスとメソッドしか記載していません。
3
3
  そのため、プログラムの詳細が必要な場合は、ソースコードを参照してください。
4
4
 
5
- 最終更新バージョン:0.8.6
5
+ 最終更新バージョン:0.8.7
6
6
 
7
7
  # module DNN
8
8
  ruby-dnnの名前空間をなすモジュールです。
@@ -698,7 +698,7 @@ Float alpha
698
698
  ### arguments
699
699
  * HasParamLayer layer
700
700
  更新対象のパラメータを持つレイヤーを指定します。
701
- * LearningParam param
701
+ * Param param
702
702
  更新するパラメータです。
703
703
 
704
704
 
@@ -17,8 +17,8 @@ x_test = Numo::SFloat.cast(x_test)
17
17
  x_train /= 255
18
18
  x_test /= 255
19
19
 
20
- y_train = DNN::Util.to_categorical(y_train, 10)
21
- y_test = DNN::Util.to_categorical(y_test, 10)
20
+ y_train = DNN::Util.to_categorical(y_train, 10, Numo::SFloat)
21
+ y_test = DNN::Util.to_categorical(y_test, 10, Numo::SFloat)
22
22
 
23
23
  model = Model.new
24
24
 
@@ -17,8 +17,8 @@ x_test = Numo::SFloat.cast(x_test).reshape(x_test.shape[0], 28, 28, 1)
17
17
  x_train /= 255
18
18
  x_test /= 255
19
19
 
20
- y_train = DNN::Util.to_categorical(y_train, 10)
21
- y_test = DNN::Util.to_categorical(y_test, 10)
20
+ y_train = DNN::Util.to_categorical(y_train, 10, Numo::SFloat)
21
+ y_test = DNN::Util.to_categorical(y_test, 10, Numo::SFloat)
22
22
 
23
23
  model = Model.new
24
24
 
@@ -17,8 +17,8 @@ x_test = Numo::SFloat.cast(x_test).reshape(x_test.shape[0], 784)
17
17
  x_train /= 255
18
18
  x_test /= 255
19
19
 
20
- y_train = DNN::Util.to_categorical(y_train, 10)
21
- y_test = DNN::Util.to_categorical(y_test, 10)
20
+ y_train = DNN::Util.to_categorical(y_train, 10, Numo::SFloat)
21
+ y_test = DNN::Util.to_categorical(y_test, 10, Numo::SFloat)
22
22
 
23
23
  model = Model.new
24
24
 
@@ -17,8 +17,8 @@ x_test = Numo::SFloat.cast(x_test).reshape(x_test.shape[0], 28, 28)
17
17
  x_train /= 255
18
18
  x_test /= 255
19
19
 
20
- y_train = DNN::Util.to_categorical(y_train, 10)
21
- y_test = DNN::Util.to_categorical(y_test, 10)
20
+ y_train = DNN::Util.to_categorical(y_train, 10, Numo::SFloat)
21
+ y_test = DNN::Util.to_categorical(y_test, 10, Numo::SFloat)
22
22
 
23
23
  model = Model.new
24
24
 
data/lib/dnn.rb CHANGED
@@ -12,7 +12,7 @@ module DNN; end
12
12
  require_relative "dnn/version"
13
13
  require_relative "dnn/core/error"
14
14
  require_relative "dnn/core/model"
15
- require_relative "dnn/core/learning_param"
15
+ require_relative "dnn/core/param"
16
16
  require_relative "dnn/core/initializers"
17
17
  require_relative "dnn/core/layers"
18
18
  require_relative "dnn/core/activations"
@@ -123,8 +123,8 @@ module DNN
123
123
  @bias_initializer = bias_initializer
124
124
  @l1_lambda = l1_lambda
125
125
  @l2_lambda = l2_lambda
126
- @params[:weight] = @weight = LearningParam.new
127
- @params[:bias] = @bias = LearningParam.new
126
+ @params[:weight] = @weight = Param.new
127
+ @params[:bias] = @bias = Param.new
128
128
  end
129
129
 
130
130
  def lasso
@@ -349,11 +349,11 @@ module DNN
349
349
  @std = Xumo::NMath.sqrt(var + 1e-7)
350
350
  xn = @xc / @std
351
351
  @xn = xn
352
- @params[:running_mean] = @momentum * @params[:running_mean] + (1 - @momentum) * mean
353
- @params[:running_var] = @momentum * @params[:running_var] + (1 - @momentum) * var
352
+ @running_mean.data = @momentum * @running_mean.data + (1 - @momentum) * mean
353
+ @running_var.data = @momentum * @running_var.data + (1 - @momentum) * var
354
354
  else
355
- xc = x - @params[:running_mean]
356
- xn = xc / Xumo::NMath.sqrt(@params[:running_var] + 1e-7)
355
+ xc = x - @running_mean.data
356
+ xn = xc / Xumo::NMath.sqrt(@running_var.data + 1e-7)
357
357
  end
358
358
  @gamma.data * xn + @beta.data
359
359
  end
@@ -378,12 +378,10 @@ module DNN
378
378
  private
379
379
 
380
380
  def init_params
381
- @params[:gamma] = @gamma = LearningParam.new
382
- @params[:beta] = @beta = LearningParam.new
383
- @gamma.data = Xumo::SFloat.ones(*shape)
384
- @beta.data = Xumo::SFloat.zeros(*shape)
385
- @params[:running_mean] = Xumo::SFloat.zeros(*shape)
386
- @params[:running_var] = Xumo::SFloat.zeros(*shape)
381
+ @params[:gamma] = @gamma = Param.new(Xumo::SFloat.ones(*shape))
382
+ @params[:beta] = @beta = Param.new(Xumo::SFloat.zeros(*shape))
383
+ @params[:running_mean] = @running_mean = Param.new(Xumo::SFloat.zeros(*shape))
384
+ @params[:running_var] = @running_var = Param.new(Xumo::SFloat.zeros(*shape))
387
385
  end
388
386
  end
389
387
  end
@@ -37,7 +37,7 @@ module DNN
37
37
  hash_params.each do |key, (shape, base64_param)|
38
38
  bin = Base64.decode64(base64_param)
39
39
  data = Xumo::SFloat.from_binary(bin).reshape(*shape)
40
- if layer.params[key].is_a?(LearningParam)
40
+ if layer.params[key].is_a?(Param)
41
41
  layer.params[key].data = data
42
42
  else
43
43
  layer.params[key] = data
@@ -68,9 +68,8 @@ module DNN
68
68
  has_param_layers = @layers.select { |layer| layer.is_a?(Layers::HasParamLayer) }
69
69
  has_param_layers_params = has_param_layers.map do |layer|
70
70
  layer.params.map { |key, param|
71
- param = param.data if param.is_a?(LearningParam)
72
- base64_param = Base64.encode64(param.to_binary)
73
- [key, [param.shape, base64_param]]
71
+ base64_data = Base64.encode64(param.data.to_binary)
72
+ [key, [param.data.shape, base64_data]]
74
73
  }.to_h
75
74
  end
76
75
  JSON.dump(has_param_layers_params)
@@ -37,7 +37,7 @@ module DNN
37
37
  end
38
38
 
39
39
  def update(params)
40
- params.select { |key, param| param.is_a?(LearningParam) }.each_value do |param|
40
+ params.select { |key, param| param.grad }.each_value do |param|
41
41
  amount = param.grad * @learning_rate
42
42
  if @momentum > 0
43
43
  @v[param] ||= 0
@@ -64,7 +64,7 @@ module DNN
64
64
  end
65
65
 
66
66
  def update(params)
67
- params.select { |key, param| param.is_a?(LearningParam) }.each_value do |param|
67
+ params.select { |key, param| param.grad }.each_value do |param|
68
68
  @v[param] ||= 0
69
69
  amount = param.grad * @learning_rate
70
70
  @v[param] = @v[param] * @momentum - amount
@@ -85,7 +85,7 @@ module DNN
85
85
  end
86
86
 
87
87
  def update(params)
88
- params.select { |key, param| param.is_a?(LearningParam) }.each_value do |param|
88
+ params.select { |key, param| param.grad }.each_value do |param|
89
89
  @g[param] ||= 0
90
90
  @g[param] += param.grad**2
91
91
  param.data -= (@learning_rate / Xumo::NMath.sqrt(@g[param] + 1e-7)) * param.grad
@@ -108,7 +108,7 @@ module DNN
108
108
  end
109
109
 
110
110
  def update(params)
111
- params.select { |key, param| param.is_a?(LearningParam) }.each_value do |param|
111
+ params.select { |key, param| param.grad }.each_value do |param|
112
112
  @g[param] ||= 0
113
113
  @g[param] = @alpha * @g[param] + (1 - @alpha) * param.grad**2
114
114
  param.data -= (@learning_rate / Xumo::NMath.sqrt(@g[param] + 1e-7)) * param.grad
@@ -136,7 +136,7 @@ module DNN
136
136
  end
137
137
 
138
138
  def update(params)
139
- params.select { |key, param| param.is_a?(LearningParam) }.each_value do |param|
139
+ params.select { |key, param| param.grad }.each_value do |param|
140
140
  @h[param] ||= Xumo::SFloat.zeros(*param.data.shape)
141
141
  @s[param] ||= Xumo::SFloat.zeros(*param.data.shape)
142
142
  @h[param] = @rho * @h[param] + (1 - @rho) * param.grad**2
@@ -172,7 +172,7 @@ module DNN
172
172
  def update(params)
173
173
  @iter += 1
174
174
  lr = @learning_rate * Math.sqrt(1 - @beta2**@iter) / (1 - @beta1**@iter)
175
- params.select { |key, param| param.is_a?(LearningParam) }.each_value do |param|
175
+ params.select { |key, param| param.grad }.each_value do |param|
176
176
  @m[param] ||= 0
177
177
  @v[param] ||= 0
178
178
  @m[param] += (1 - @beta1) * (param.grad - @m[param])
@@ -0,0 +1,9 @@
1
+ class DNN::Param
2
+ attr_accessor :data
3
+ attr_accessor :grad
4
+
5
+ def initialize(data = nil, grad = nil)
6
+ @data = data
7
+ @grad = grad
8
+ end
9
+ end
@@ -25,7 +25,7 @@ module DNN
25
25
  @return_sequences = return_sequences
26
26
  @layers = []
27
27
  @params[:h] = nil
28
- @params[:weight2] = @weight2 = LearningParam.new
28
+ @params[:weight2] = @weight2 = Param.new
29
29
  end
30
30
 
31
31
  def forward(xs)
@@ -1,7 +1,7 @@
1
- require "open-uri"
2
1
  require "zlib"
3
2
  require "archive/tar/minitar"
4
3
  require_relative "../ext/cifar10_loader/cifar10_loader"
4
+ require_relative "downloader"
5
5
 
6
6
  URL_CIFAR10 = "https://www.cs.toronto.edu/~kriz/cifar-10-binary.tar.gz"
7
7
  CIFAR10_DIR = "cifar-10-batches-bin"
@@ -10,27 +10,19 @@ module DNN
10
10
  module CIFAR10
11
11
  class DNN_CIFAR10_LoadError < DNN_Error; end
12
12
 
13
- class DNN_CIFAR10_DownloadError < DNN_Error; end
14
-
15
13
  private_class_method :load_binary
16
14
 
17
15
  def self.downloads
18
16
  return if Dir.exist?(__dir__ + "/" + CIFAR10_DIR)
17
+ Downloader.download(URL_CIFAR10)
19
18
  cifar10_binary_file_name = __dir__ + "/" + URL_CIFAR10.match(%r`.+/(.+)`)[1]
20
- puts "Now downloading..."
21
- open(URL_CIFAR10, "rb") do |f|
22
- File.binwrite(cifar10_binary_file_name, f.read)
23
- begin
24
- Zlib::GzipReader.open(cifar10_binary_file_name) do |gz|
25
- Archive::Tar::Minitar::unpack(gz, __dir__)
26
- end
27
- ensure
28
- File.unlink(cifar10_binary_file_name)
19
+ begin
20
+ Zlib::GzipReader.open(cifar10_binary_file_name) do |gz|
21
+ Archive::Tar::Minitar::unpack(gz, __dir__)
29
22
  end
23
+ ensure
24
+ File.unlink(cifar10_binary_file_name)
30
25
  end
31
- puts "The download has ended."
32
- rescue => ex
33
- raise DNN_CIFAR10_DownloadError.new(ex.message)
34
26
  end
35
27
 
36
28
  def self.load_train
@@ -0,0 +1,46 @@
1
+ require "net/http"
2
+
3
+ module DNN
4
+
5
+ class DNN_DownloadError < DNN_Error; end
6
+
7
+ class Downloader
8
+ def self.download(url, dir_path = __dir__)
9
+ Downloader.new(url).download(dir_path)
10
+ rescue => ex
11
+ raise DNN_DownloadError.new(ex.message)
12
+ end
13
+
14
+ def initialize(url)
15
+ @url = url
16
+ *, @fqdn, @path = *url.match(%r`https?://(.+?)(/.+)`)
17
+ end
18
+
19
+ def download(dir_path)
20
+ puts %`download "#{@url}"`
21
+ buf = ""
22
+ Net::HTTP.start(@fqdn) do |http|
23
+ content_length = http.head(@path).content_length
24
+ http.get(@path) do |body_segment|
25
+ buf << body_segment
26
+ log = "\r"
27
+ 40.times do |i|
28
+ if i < buf.size * 40 / content_length
29
+ log << "="
30
+ elsif i == buf.size * 40 / content_length
31
+ log << ">"
32
+ else
33
+ log << "_"
34
+ end
35
+ end
36
+ log << " #{buf.size}/#{content_length}"
37
+ print log
38
+ end
39
+ puts ""
40
+ end
41
+ file_name = @path.match(%r`.+/(.+)`)[1]
42
+ File.binwrite("#{dir_path}/#{file_name}", buf)
43
+ end
44
+ end
45
+
46
+ end
data/lib/dnn/lib/mnist.rb CHANGED
@@ -1,13 +1,11 @@
1
- require "open-uri"
2
1
  require "zlib"
3
2
  require_relative "../core/error"
3
+ require_relative "downloader"
4
4
 
5
5
  module DNN
6
6
  module MNIST
7
7
  class DNN_MNIST_LoadError < DNN_Error; end
8
8
 
9
- class DNN_MNIST_DownloadError < DNN_Error; end
10
-
11
9
  URL_TRAIN_IMAGES = "http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz"
12
10
  URL_TRAIN_LABELS = "http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz"
13
11
  URL_TEST_IMAGES = "http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz"
@@ -16,12 +14,10 @@ module DNN
16
14
  def self.downloads
17
15
  return if Dir.exist?(mnist_dir)
18
16
  Dir.mkdir(mnist_dir)
19
- puts "Now downloading..."
20
- download(URL_TRAIN_IMAGES)
21
- download(URL_TRAIN_LABELS)
22
- download(URL_TEST_IMAGES)
23
- download(URL_TEST_LABELS)
24
- puts "The download has ended."
17
+ Downloader.download(URL_TRAIN_IMAGES, mnist_dir)
18
+ Downloader.download(URL_TRAIN_LABELS, mnist_dir)
19
+ Downloader.download(URL_TEST_IMAGES, mnist_dir)
20
+ Downloader.download(URL_TEST_LABELS, mnist_dir)
25
21
  end
26
22
 
27
23
  def self.load_train
@@ -56,14 +52,6 @@ module DNN
56
52
 
57
53
  private_class_method
58
54
 
59
- def self.download(url)
60
- open(url, "rb") do |f|
61
- File.binwrite(url_to_file_name(url), f.read)
62
- end
63
- rescue => ex
64
- raise DNN_MNIST_DownloadError.new(ex.message)
65
- end
66
-
67
55
  def self.load_images(file_name)
68
56
  images = nil
69
57
  Zlib::GzipReader.open(file_name) do |f|
data/lib/dnn/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module DNN
2
- VERSION = "0.8.6"
2
+ VERSION = "0.8.7"
3
3
  end
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.8.6
4
+ version: 0.8.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - unagiootoro
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-02-27 00:00:00.000000000 Z
11
+ date: 2019-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: numo-narray
@@ -111,9 +111,9 @@ files:
111
111
  - lib/dnn/core/error.rb
112
112
  - lib/dnn/core/initializers.rb
113
113
  - lib/dnn/core/layers.rb
114
- - lib/dnn/core/learning_param.rb
115
114
  - lib/dnn/core/model.rb
116
115
  - lib/dnn/core/optimizers.rb
116
+ - lib/dnn/core/param.rb
117
117
  - lib/dnn/core/rnn_layers.rb
118
118
  - lib/dnn/core/util.rb
119
119
  - lib/dnn/ext/cifar10_loader/cifar10_loader.c
@@ -123,6 +123,7 @@ files:
123
123
  - lib/dnn/ext/rb_stb_image/stb_image.h
124
124
  - lib/dnn/ext/rb_stb_image/stb_image_write.h
125
125
  - lib/dnn/lib/cifar10.rb
126
+ - lib/dnn/lib/downloader.rb
126
127
  - lib/dnn/lib/image.rb
127
128
  - lib/dnn/lib/mnist.rb
128
129
  - lib/dnn/version.rb
@@ -1,4 +0,0 @@
1
- class DNN::LearningParam
2
- attr_accessor :data
3
- attr_accessor :grad
4
- end