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

Chapter 1

ml_in_elixir/chapter_1.livemd

Chapter 1

Mix.install([
  {:axon, "~> 0.5"},
  {:nx, "~> 0.6"},
  {:explorer, "~> 0.7"},
  {:kino, "~> 0.12"},
  {:kino_explorer, "~> 0.1"}
])

Iris

require Explorer.DataFrame, as: DF
iris = Explorer.Datasets.iris()
cols = ~w(sepal_width sepal_length petal_length petal_width)

stardardized_iris =
  DF.mutate(
    iris,
    for col <- across(^cols) do
      {col.name, (col - mean(col)) / variance(col)}
    end
  )

stardardized_iris =
  DF.mutate(stardardized_iris, species: Explorer.Series.cast(species, :category))

shuffled_iris = DF.shuffle(stardardized_iris)
train_df = DF.slice(shuffled_iris, 0..119)
test_df = DF.slice(shuffled_iris, 120..149)

feature_columns = cols
x_train = Nx.stack(train_df[feature_columns], axis: -1)

y_train =
  train_df["species"]
  |> Nx.stack(axis: -1)
  |> Nx.equal(Nx.iota({1, 3}, axis: -1))

x_test = Nx.stack(test_df[feature_columns], axis: -1)

y_test =
  test_df["species"]
  |> Nx.stack(axis: -1)
  |> Nx.equal(Nx.iota({1, 3}, axis: -1))
x_test
model =
  Axon.input("iris_features", shape: {1, 4})
  |> Axon.dense(3, activation: :softmax)

Axon.Display.as_graph(model, Nx.template({1, 4}, :f32))
data_stream =
  Stream.repeatedly(fn ->
    {x_train, y_train}
  end)

trained_model =
  model
  |> Axon.Loop.trainer(:categorical_cross_entropy, :sgd)
  |> Axon.Loop.metric(:accuracy)
  |> Axon.Loop.run(data_stream, %{}, iterations: 500, epochs: 10)
data = [{x_test, y_test}]

model
|> Axon.Loop.evaluator()
|> Axon.Loop.metric(:accuracy)
|> Axon.Loop.run(data, trained_model)