Current section
Files
Jump to
Current section
Files
lib/mnist.ex
defmodule MNIST do
@moduledoc """
test with MNIST dataset
"""
import Network
alias Deeppipe, as: DP
alias Cumatrix, as: CM
# for DNN test sgd
defnetwork init_network1(_x) do
_x
|> w(784, 300)
|> b(300)
|> tanh
|> w(300, 100)
|> b(100)
|> tanh
|> w(100, 10)
|> b(10)
|> softmax
end
# for momentum
defnetwork init_network2(_x) do
_x
|> w(784, 300)
|> b(300)
|> relu
|> w(300, 100)
|> b(100)
|> sigmoid
|> w(100, 10)
|> b(10)
|> softmax
end
# for adagrad/adam
defnetwork init_network3(_x) do
_x
|> w(784, 300, 0.1, 0.01)
|> b(300, 0.1, 0.1)
|> relu
|> w(300, 100, 0.1, 0.01)
|> b(100, 0.1, 0.1)
|> relu
|> w(100, 10, 0.1, 0.01, 0.25)
|> b(10, 0.1, 0.01)
|> softmax
end
# CNN test for MNIST
defnetwork init_network4(_x) do
_x
|> f(3, 3, 1, 6, {1, 1}, 0, {:he,728}, 0.001)
|> relu
|> f(3, 3, 6, 12, {1, 1}, 0, {:he,4056}, 0.001)
|> relu
|> pooling(2, 2)
|> relu
|> full
|> w(1728, 10, {:he,2028}, 0.001)
|> softmax
end
# convolution filter (2,2) 1ch, stride=2
defnetwork init_network5(_x) do
_x
|> f(2, 2, 1, 1, {2, 2})
|> f(2, 2, 1, 1, {2, 2})
|> full
|> w(49, 10)
|> softmax
end
# convolution filter (4,4) 1ch, stride=1, padding=1
defnetwork init_network6(_x) do
_x
|> f(4, 4, 1, 1, {1, 1})
|> full
|> w(625, 300)
|> b(300)
|> relu
|> w(300, 100)
|> b(100)
|> relu
|> w(100, 10)
|> b(10)
|> softmax
end
# dropout test
# dropout rate 25% initial-rate =0.1 learning-rate=0.1
defnetwork init_network7(_x) do
_x
|> w(784, 300, 0.1, 0.1, 0.25)
|> b(300)
|> relu
|> w(300, 100)
|> b(100)
|> relu
|> w(100, 10)
|> b(10)
|> softmax
end
# long network test
defnetwork init_network8(_x) do
_x
|> w(784, 600)
|> b(600)
|> relu
|> w(600, 500)
|> b(500)
|> relu
|> w(500, 400)
|> b(400)
|> relu
|> w(400, 300)
|> b(300)
|> relu
|> w(300, 100)
|> b(100)
|> relu
|> w(100, 10)
|> b(10)
|> softmax
end
@doc """
MNIST minibatch size , n epocs
SGD optimizer
"""
def sgd(m, n) do
image = train_image(60000, :flatten)
onehot = train_label_onehot(60000)
network = init_network1(0)
test_image = test_image(10000, :flatten)
test_label = test_label(10000)
DP.train(network, image, onehot, test_image, test_label, :cross, :sgd, m, n)
end
@doc """
MNIST minibatch size , n epocs
SGD optimizer
initialize network from file temp.ex
"""
def resgd(m, n) do
image = train_image(60000, :flatten)
onehot = train_label_onehot(60000)
test_image = test_image(10000, :flatten)
test_label = test_label(10000)
DP.retrain("temp.ex", image, onehot, test_image, test_label, :cross, :sgd, m, n)
end
@doc """
MNIST minibatch size , n epocs
momentum optimizer
"""
def momentum(m, n) do
image = train_image(60000, :flatten)
onehot = train_label_onehot(60000)
network = init_network2(0)
test_image = test_image(10000, :flatten)
test_label = test_label(10000)
DP.train(network, image, onehot, test_image, test_label, :cross, :momentum, m, n)
end
@doc """
MNIST minibatch size , n epocs
adagrad optimizer
"""
def adagrad(m, n) do
image = train_image(60000, :flatten)
onehot = train_label_onehot(60000)
network = init_network3(0)
test_image = test_image(10000, :flatten)
test_label = test_label(10000)
DP.train(network, image, onehot, test_image, test_label, :cross, :adagrad, m, n)
end
@doc """
MNIST minibatch size , n epocs
RMSprop optimizer
"""
def rms(m, n) do
image = train_image(60000, :flatten)
onehot = train_label_onehot(60000)
network = init_network3(0)
test_image = test_image(10000, :flatten)
test_label = test_label(10000)
DP.train(network, image, onehot, test_image, test_label, :cross, :rms, m, n)
end
@doc """
MNIST minibatch size , n epocs
adam optimizer
"""
def adam(m, n) do
image = train_image(60000, :flatten)
onehot = train_label_onehot(60000)
network = init_network3(0)
test_image = test_image(10000, :flatten)
test_label = test_label(10000)
DP.train(network, image, onehot, test_image, test_label, :cross, :adam, m, n)
end
@doc """
MNIST minibatch size , n epocs
adam optimizer
initialize network from file temp.ex
"""
def readam(m, n) do
image = train_image(60000, :flatten)
onehot = train_label_onehot(60000)
test_image = test_image(10000, :flatten)
test_label = test_label(10000)
DP.retrain("temp.ex", image, onehot, test_image, test_label, :cross, :adam, m, n)
end
@doc """
MNIST minibatch size , n epocs
Adam optimizer
CNN network
"""
def cnn(m, n) do
image = train_image(60000, :structure)
onehot = train_label_onehot(60000)
network = init_network4(0)
test_image = test_image(10000, :structure)
test_label = test_label(10000)
DP.train(network, image, onehot, test_image, test_label, :cross, :adam, m, n)
end
@doc """
MNIST minibatch size , n epocs
Adam optimizer
CNN network
initialize network from file temp.ex
"""
def recnn(m, n) do
image = train_image(60000, :structure)
onehot = train_label_onehot(60000)
test_image = test_image(10000, :structure)
test_label = test_label(10000)
DP.retrain("temp.ex", image, onehot, test_image, test_label, :cross, :adam, m, n)
end
@doc """
MNIST minibatch size , n epocs
SGD optimizer
CNN network stride-test
"""
def st(m, n) do
image = train_image(60000, :structure)
onehot = train_label_onehot(60000)
network = init_network5(0)
test_image = test_image(10000, :structure)
test_label = test_label(10000)
DP.train(network, image, onehot, test_image, test_label, :cross, :sgd, m, n)
end
@doc """
MNIST minibatch size , n epocs
SGD optimizer
CNN network padding-test
"""
def pad(m, n) do
image = train_image(60000, :structure)
onehot = train_label_onehot(60000)
network = init_network6(0)
test_image = test_image(10000, :structure)
test_label = test_label(10000)
DP.train(network, image, onehot, test_image, test_label, :cross, :sgd, m, n)
end
@doc """
MNIST minibatch size , n epocs
SGD optimizer
CNN network dropout-test
"""
def drop(m, n) do
image = train_image(60000, :flatten)
onehot = train_label_onehot(60000)
network = init_network7(0)
test_image = test_image(10000, :flatten)
test_label = test_label(10000)
DP.train(network, image, onehot, test_image, test_label, :cross, :sgd, m, n)
end
@doc """
MNIST minibatch size , n epocs
SGD optimizer
long DNN test
"""
def long(m, n) do
image = train_image(60000, :flatten)
onehot = train_label_onehot(60000)
network = init_network8(0)
test_image = test_image(10000, :flatten)
test_label = test_label(10000)
DP.train(network, image, onehot, test_image, test_label, :cross, :sgd, m, n)
end
@doc """
get n datas from train-label
"""
def train_label(n) do
Enum.take(train_label(), n)
end
@doc """
transfer from train-label to onehot list
"""
def train_label_onehot(n) do
Enum.take(train_label(), n) |> Enum.map(fn y -> DP.to_onehot(y, 9) end)
end
@doc """
get n datas from train-image with normalization
"""
def train_image(n, :structure) do
train_image()
|> Enum.take(n*28*28)
|> DP.normalize(0,255)
|> CM.reshape([n,1,28,28])
end
@doc """
get n datas from train-image as flatten list
"""
def train_image(n, :flatten) do
train_image()
|> Enum.take(n*784)
|> DP.normalize(0, 255)
|> CM.reshape([n,784])
end
@doc """
get n datas from test-label
"""
def test_label(n) do
Enum.take(test_label(), n)
end
@doc """
transfer from test-label to onehot list
"""
def test_label_onehot(n) do
test_label()
|> Enum.take(n)
|> Enum.map(fn y -> DP.to_onehot(y, 9) end)
end
@doc """
get n datas from test-image with normalization as structured list
"""
def test_image(n) do
test_image()
|> Enum.take(n*28*28)
|> DP.normalize(0, 255)
|> CM.reshape([n,1,28,28])
end
@doc """
get n datas from test-image with normalization as structured list or matrix
1st arg is size of data
2nd arg is :structure or :flatten
"""
def test_image(n, :structure) do
test_image()
|> Enum.take(n*28*28)
|> DP.normalize(0, 255)
|> CM.reshape([n,1,28,28])
end
# get n datas from train-image as flatten list
def test_image(n, :flatten) do
test_image()
|> Enum.take(n*784)
|> DP.normalize(0, 255)
|> CM.reshape([n,784])
end
@doc """
get train label data
"""
def train_label() do
{:ok, <<0, 0, 8, 1, 0, 0, 234, 96, label::binary>>} =
File.read("mnist/train-labels-idx1-ubyte")
label |> String.to_charlist()
end
@doc """
get train image data
"""
def train_image() do
{:ok, <<0, 0, 8, 3, 0, 0, 234, 96, 0, 0, 0, 28, 0, 0, 0, 28, image::binary>>} =
File.read("mnist/train-images-idx3-ubyte")
image |> :binary.bin_to_list()
end
@doc """
get test label data
"""
def test_label() do
{:ok, <<0, 0, 8, 1, 0, 0, 39, 16, label::binary>>} =
File.read("mnist/t10k-labels-idx1-ubyte")
label |> String.to_charlist()
end
@doc """
get test image data
"""
def test_image() do
{:ok, <<0, 0, 8, 3, 0, 0, 39, 16, 0, 0, 0, 28, 0, 0, 0, 28, image::binary>>} =
File.read("mnist/t10k-images-idx3-ubyte")
image |> :binary.bin_to_list()
end
end