O'Reilly Japan - ゼロから作るDeep Learning P.72〜を参考に。

RubyでMNISTのデータを読む - blog.tnantoka.com
で読んだデータをそのまま

PycallとNumPyで3層ニューラルネットワーク - blog.tnantoka.com
に突っ込んでみました。

重みやバイアスは完全に適当で何の意味もありません。

network.rb

class Network
  def initialize
    pyimport 'numpy', as: :np

    @weights = [
      np.array.((0...784).map { |i| [0.1, 0.3, 0.5] }),
      np.array.([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]]),
      np.array.([[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1], [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1]]),
    ]
    @biases = [
      np.array.([0.1, 0.2, 0.3]),
      np.array.([0.1, 0.2]),
      np.array.([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1]),
    ]
  end

  def predict(x)
    w1, w2, w3 = @weights
    b1, b2, b3 = @biases

    a1 = np.dot.(x, w1) + b1
    z1 = Util.sigmoid(a1)
    a2 = np.dot.(z1, w2) + b2
    z2 = Util.sigmoid(a2)
    a3 = np.dot.(z2, w3) + b3

    Util.softmax(a3)
  end
end

動かしてみる。

> y = network.predict(x_train[0]) 
=> array([ 0.03214207,  0.0413279 ,  0.05313893,  0.06832543,  0.08785205,  0.11295915,  0.14524157,  0.18674993,  0.24012091,  0.03214207])

> np.argmax.(y)
=> 8

> t_train[0]
=> 5

見事に外れ。