Flux in Julia/Flux in Julia
Autoencoder (ver. Flux in Julia)
딥스탯
2018. 12. 5. 12:13
DATA SET 출처¶
http://archive.ics.uci.edu/ml/datasets/Iris (UCI, Iris Data Set)
https://gist.githubusercontent.com/netj/8836201/raw/6f9306ad21398ea43cba4f7d537619d0e07d5ae3/iris.csv (Github, Iris Data Set)
참고자료¶
https://deepstat.tistory.com/15 (Autoencoder ver.R)
https://deepstat.tistory.com/31 (Autoencoder ver.Python)
http://fluxml.ai/ (Flux in Julia)
Autoencoder (ver. Flux in Julia)¶
Iris¶
In [1]:
using RDatasets
iris = dataset("datasets", "iris")
first(iris, 6)
Out[1]:
In [2]:
describe(iris)
Out[2]:
Handling the data set¶
In [3]:
using DataFrames, Random, StatsBase
Random.seed!(1)
test_obs = sample(vcat(repeat([false],100), repeat([true],50)),150;replace = false)
training_set = iris[.!test_obs,:]
testing_set = iris[test_obs,:]
training_X = training_set[:,1:(end-1)]
testing_X = testing_set[:,1:(end-1)]
describe(training_X)
Out[3]:
In [4]:
describe(testing_X)
Out[4]:
In [5]:
t_train_X = transpose(Matrix(training_X))
t_test_X = transpose(Matrix(testing_X));
Autoencoder¶
In [6]:
using Flux
In [7]:
Encoder = Chain(
BatchNorm(4), Dense(4,8,relu),
BatchNorm(8), Dense(8,8,relu),
Dense(8,3),softmax);
In [8]:
Decoder = Chain(
BatchNorm(3), Dense(3,8,relu),
BatchNorm(8), Dense(8,8,relu),
Dense(8,4));
Loss function : cross-entropy¶
In [9]:
loss(x,y) = Flux.mse(Decoder(Encoder(x)),y)
Out[9]:
In [10]:
Decoder(Encoder(t_train_X))
Out[10]:
In [11]:
loss(t_train_X,t_train_X)
Out[11]:
Optimizer : ADAM¶
In [12]:
PARS = params(Encoder, Decoder)
function my_opt(n, lr)
train_mse_vec = repeat([Inf],3)
for i = 0:n
Flux.testmode!(Encoder, false)
Flux.testmode!(Decoder, false)
Flux.train!(loss, [(t_train_X,t_train_X)], ADAM(PARS, lr))
Flux.testmode!(Encoder)
Flux.testmode!(Decoder)
train_mse_vec = vcat(train_mse_vec[2:3],loss(t_train_X,t_train_X).data)
if minimum(train_mse_vec) == train_mse_vec[1]
lr = lr*7/8
end
if i % 100 == 0
train_mse = train_mse_vec[3]
test_mse = loss(t_test_X,t_test_X).data
println("step:",i," train_mse:" ,train_mse," test_mse:" ,test_mse)
end
end
end
Out[12]:
In [13]:
my_opt(0,0.1)
In [14]:
my_opt(2000,0.1)
comparing the values¶
In [15]:
t_train_X[:,1:5]
Out[15]:
In [16]:
Decoder(Encoder(t_train_X[:,1:5]))
Out[16]:
In [17]:
t_test_X[:,1:5]
Out[17]:
In [18]:
Decoder(Encoder(t_test_X[:,1:5]))
Out[18]:
About the encoder¶
In [19]:
Encoder(t_train_X)
Out[19]:
In [20]:
tmp = DataFrame(Enc = Flux.onecold(Encoder(t_train_X)), spe = training_set[:,5])
by(tmp, [:Enc, :spe], nrow)
Out[20]:
In [21]:
tmp2 = DataFrame(Enc = Flux.onecold(Encoder(t_test_X)), spe = testing_set[:,5])
by(tmp2, [:Enc, :spe], nrow)
Out[21]:
In [ ]: