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
見事に外れ。