Current section
Files
Jump to
Current section
Files
src/gleam_synapses@net.erl
-module(gleam_synapses@net).
-compile(no_auto_import).
-export([new/1, new_with_seed/2, new_custom/3, predict/2, par_predict/2, errors/4, fit/4, par_fit/4, to_json/1, from_json/1, to_svg/1]).
-spec seed_init(gleam@option:option(integer()), list(integer())) -> gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())).
seed_init(Maybe_seed, Layers) ->
Gen = begin
_pipe = Layers,
_pipe@1 = gleam_zlists:of_list(_pipe),
gleam_synapses@model@net_elems@network@network:generator(_pipe@1)
end,
case Maybe_seed of
{some, I} ->
minigen:run_with_seed(Gen, I);
none ->
minigen:run(Gen)
end.
-spec fail_if_input_not_match(
gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())),
list(float())
) -> nil.
fail_if_input_not_match(Net, Input_values) ->
Num_of_input_vals = gleam@list:length(Input_values),
{ok, First_neuron@1} = case begin
_pipe = Net,
_pipe@1 = gleam_zlists:head(_pipe),
gleam@result:then(_pipe@1, fun gleam_zlists:head/1)
end of
{ok, First_neuron} -> {ok, First_neuron};
_try ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try,
module => <<"gleam_synapses/net"/utf8>>,
function => <<"fail_if_input_not_match"/utf8>>,
line => 29})
end,
Input_layer_size = gleam_zlists:count(erlang:element(3, First_neuron@1)) - 1,
Is_equal = Num_of_input_vals =:= Input_layer_size,
true = case Is_equal of
true -> true;
_try@1 ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try@1,
module => <<"gleam_synapses/net"/utf8>>,
function => <<"fail_if_input_not_match"/utf8>>,
line => 36})
end,
nil.
-spec fail_if_expected_not_match(
gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())),
list(float())
) -> nil.
fail_if_expected_not_match(Net, Expected_output) ->
Num_of_expected_vals = gleam@list:length(Expected_output),
{ok, Output_layer_size@1} = case begin
_pipe = Net,
_pipe@1 = gleam_zlists:reverse(_pipe),
_pipe@2 = gleam_zlists:head(_pipe@1),
gleam@result:map(_pipe@2, fun gleam_zlists:count/1)
end of
{ok, Output_layer_size} -> {ok, Output_layer_size};
_try ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try,
module => <<"gleam_synapses/net"/utf8>>,
function => <<"fail_if_expected_not_match"/utf8>>,
line => 42})
end,
Is_equal = Num_of_expected_vals =:= Output_layer_size@1,
true = case Is_equal of
true -> true;
_try@1 ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try@1,
module => <<"gleam_synapses/net"/utf8>>,
function => <<"fail_if_expected_not_match"/utf8>>,
line => 49})
end,
nil.
-spec new(list(integer())) -> gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())).
new(Layers) ->
_pipe = seed_init(none, Layers),
gleam_synapses@model@net_elems@network@network_serialized:realized(_pipe).
-spec new_with_seed(list(integer()), integer()) -> gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())).
new_with_seed(Layers, Seed) ->
_pipe = seed_init({some, Seed}, Layers),
gleam_synapses@model@net_elems@network@network_serialized:realized(_pipe).
-spec new_custom(
list(integer()),
fun((integer()) -> gleam_synapses@model@net_elems@activation@activation:activation()),
fun((integer()) -> float())
) -> gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())).
new_custom(Layers, Activation_f, Weight_init_f) ->
_pipe = Layers,
_pipe@1 = gleam_zlists:of_list(_pipe),
_pipe@2 = gleam_synapses@model@net_elems@network@network:init(
_pipe@1,
Activation_f,
Weight_init_f
),
gleam_synapses@model@net_elems@network@network_serialized:realized(_pipe@2).
-spec predict(
gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())),
list(float())
) -> list(float()).
predict(Net, Input_values) ->
fail_if_input_not_match(Net, Input_values),
Input = gleam_zlists:of_list(Input_values),
_pipe = gleam_synapses@model@net_elems@network@network:output(
Net,
Input,
false
),
gleam_zlists:to_list(_pipe).
-spec par_predict(
gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())),
list(float())
) -> list(float()).
par_predict(Net, Input_values) ->
fail_if_input_not_match(Net, Input_values),
Input = gleam_zlists:of_list(Input_values),
_pipe = gleam_synapses@model@net_elems@network@network:output(
Net,
Input,
true
),
gleam_zlists:to_list(_pipe).
-spec errors(
gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())),
list(float()),
list(float()),
boolean()
) -> list(float()).
errors(Net, Input_values, Expected_output, In_parallel) ->
fail_if_input_not_match(Net, Input_values),
fail_if_expected_not_match(Net, Expected_output),
Input = gleam_zlists:of_list(Input_values),
Expected = gleam_zlists:of_list(Expected_output),
_pipe = gleam_synapses@model@net_elems@network@network:errors(
Net,
Input,
Expected,
In_parallel
),
gleam_zlists:to_list(_pipe).
-spec fit(
gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())),
float(),
list(float()),
list(float())
) -> gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())).
fit(Net, Learning_rate, Input_values, Expected_output) ->
fail_if_input_not_match(Net, Input_values),
fail_if_expected_not_match(Net, Expected_output),
Input = gleam_zlists:of_list(Input_values),
Expected = gleam_zlists:of_list(Expected_output),
_pipe = gleam_synapses@model@net_elems@network@network:fit(
Net,
Learning_rate,
Input,
Expected,
false
),
gleam_synapses@model@net_elems@network@network_serialized:realized(_pipe).
-spec par_fit(
gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())),
float(),
list(float()),
list(float())
) -> gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())).
par_fit(Net, Learning_rate, Input_values, Expected_output) ->
fail_if_input_not_match(Net, Input_values),
fail_if_expected_not_match(Net, Expected_output),
Input = gleam_zlists:of_list(Input_values),
Expected = gleam_zlists:of_list(Expected_output),
_pipe = gleam_synapses@model@net_elems@network@network:fit(
Net,
Learning_rate,
Input,
Expected,
true
),
gleam_synapses@model@net_elems@network@network_serialized:realized(_pipe).
-spec to_json(
gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron()))
) -> binary().
to_json(Net) ->
gleam_synapses@model@net_elems@network@network_serialized:to_json(Net).
-spec from_json(binary()) -> gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron())).
from_json(Json) ->
_pipe = Json,
_pipe@1 = gleam_synapses@model@net_elems@network@network_serialized:of_json(
_pipe
),
gleam_synapses@model@net_elems@network@network_serialized:realized(_pipe@1).
-spec to_svg(
gleam_zlists@interop:z_list(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron@neuron:neuron()))
) -> binary().
to_svg(Net) ->
gleam_synapses@model@draw:network_svg(Net).