Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Testing

langs/elixir/axon/tutorial0.livemd

Testing

Mix.install([
  {:nx, "~> 0.2.0"},
  {:exla, "~> 0.2.0"},
  {:axon, "~> 0.1.0-dev", github: "elixir-nx/axon", branch: "main"}
])

Example

require Axon

model =
  Axon.input({nil, 8})
  |> Axon.dense(20, activation: :relu)
  |> Axon.dense(20, activation: :relu)
  # |> Axon.dropout(rate: 0.5)
  |> Axon.dense(2, activation: :softmax)

# |> Axon.dense(2, activation: :sigmoid)

# state_init = model |> Axon.init(compiler: EXLA)

train_data = [
  {Nx.tensor([[0.0, 0, 0, 0, 0, 0, 0, 1.0]]), Nx.tensor([0.0, 1.0])},
  {Nx.tensor([[0.0, 0, 0, 0, 0, 0, 0.0, 0.0]]), Nx.tensor([1.0, 0.0])}
]

trained =
  model
  |> Axon.Loop.trainer(:categorical_cross_entropy, Axon.Optimizers.adamw(0.005))
  |> Axon.Loop.run(train_data, epochs: 100, compiler: EXLA)

Axon.predict(model, trained, %{
  "input_0" => Nx.tensor([[0.0, 0.0, 0, 0, 0, 0, 0.0, 1.0]])
})

Testing

require Axon

model =
  Axon.input({nil, 8})
  |> Axon.dense(128)
  |> Axon.dense(2, activation: :softmax)
state_init = model |> Axon.init(compiler: EXLA)
train_data = [
  {Nx.tensor([[0.0, 0, 0, 0, 0, 0, 0, 1.0]]), Nx.tensor([0.0, 1.0])},
  {Nx.tensor([[0.0, 0, 0, 0, 0, 0, 1.0, 0.0]]), Nx.tensor([1.0, 0.0])}
]

model_state =
  model
  |> Axon.Loop.trainer(:categorical_cross_entropy, Axon.Optimizers.adamw(0.005))
  |> Axon.Loop.run(train_data, epochs: 10, compiler: EXLA)
Axon.predict(model, model_state, %{
  "input_0" => Nx.tensor([[0.0, 0.0, 0, 0, 0, 0, 1.0, 0.0]])
})
:io_lib.format("~8.2.0B", [1])
|> Enum.map(fn d -> if d == ?0, do: 0.0, else: 1.0 end)
|> Nx.tensor()
random_num_oddity = fn ->
  random = Enum.random(0..255)
  odd = if rem(random, 2) == 0, do: true, else: false

  bin_tensor =
    :io_lib.format("~8.2.0B", [random])
    |> Enum.map(fn d -> if d == ?0, do: 0.0, else: 1.0 end)
    |> Nx.tensor()
    |> Nx.reshape({1, 8})

  {bin_tensor, odd}
end

{test_1, test_2} = random_num_oddity.()
random_num_oddity_list = fn ->
  Stream.unfold(0, fn _ ->
    {random_num_oddity.(), 0}
  end)
end

random_num_oddity_list.() |> Enum.take(10)
data_trainning =
  Stream.unfold(0, fn _ ->
    {random_num_oddity.(), 0}
  end)
  |> Stream.map(fn {tn, oddity} ->
    {tn, if(oddity, do: Nx.tensor([0.0, 1.0]), else: Nx.tensor([1.0, 0.0]))}
  end)

# |> Enum.take(10)
require Axon

model =
  Axon.input({nil, 8})
  |> Axon.dense(20, activation: :relu)
  |> Axon.dense(20, activation: :relu)
  # |> Axon.dropout(rate: 0.5)
  |> Axon.dense(2, activation: :softmax)

# |> Axon.dense(2, activation: :sigmoid)

trained =
  model
  |> Axon.Loop.trainer(:categorical_cross_entropy, Axon.Optimizers.adamw(0.005))
  |> Axon.Loop.run(data_trainning |> Enum.take(1_000), epochs: 1, compiler: EXLA)

Axon.predict(
  model,
  trained,
  %{
    "input_0" => Nx.tensor([[0.0, 0.0, 0, 0, 0, 0, 0.0, 1.0]])
  },
  compiler: EXLA
)
Nx.tensor([[0.0, 0, 0, 0, 0, 0, 0, 1.0]])