-module(gleam_synapses@model@net_elems@layer). -compile(no_auto_import). -export([init/4, output/2, back_propagated/4, serialized/1, deserialized/1, json_encoded/1, json_decoder/0, generator/2]). -spec init( integer(), integer(), gleam_synapses@model@net_elems@activation:activation(), fun(() -> fun(() -> float())) ) -> gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron:neuron()). init(Input_size, Output_size, Activation_f, Weight_init_f) -> gleam_zlists:map( gleam_zlists:take(gleam_zlists:indices(), Output_size), fun(_) -> gleam_synapses@model@net_elems@neuron:init( Input_size, Activation_f, Weight_init_f() ) end ). -spec output( gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron:neuron()), gleam_zlists@interop:z_list(float()) ) -> gleam_zlists@interop:z_list(float()). output(Layer, Input_val) -> gleam_zlists:map( Layer, fun(X) -> gleam_synapses@model@net_elems@neuron:output(X, Input_val) end ). -spec back_propagated( gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron:neuron()), float(), gleam_zlists@interop:z_list(float()), gleam_zlists@interop:z_list({float(), float()}) ) -> {gleam_zlists@interop:z_list(float()), gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron:neuron())}. back_propagated(Layer, Learning_rate, Input_val, Output_with_error) -> {Errors_multi, New_layer} = gleam_zlists:unzip( gleam_zlists:map( gleam_zlists:zip(Output_with_error, Layer), fun(T) -> {A, B} = T, gleam_synapses@model@net_elems@neuron:back_propagated( B, Learning_rate, Input_val, A ) end ) ), Errors = gleam_zlists:reduce( Errors_multi, gleam_zlists:map(gleam_zlists:indices(), fun(_) -> 0.0 end), fun(X, Acc) -> gleam_zlists:map( gleam_zlists:zip(Acc, X), fun(T@1) -> {A@1, B@1} = T@1, A@1 + B@1 end ) end ), {Errors, New_layer}. -spec serialized( gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron:neuron()) ) -> list(gleam_synapses@model@net_elems@neuron:neuron_serialized()). serialized(Layer) -> gleam_zlists:to_list( gleam_zlists:map( Layer, fun gleam_synapses@model@net_elems@neuron:serialized/1 ) ). -spec deserialized( list(gleam_synapses@model@net_elems@neuron:neuron_serialized()) ) -> gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron:neuron()). deserialized(Layer_serialized) -> gleam_zlists:map( gleam_zlists:of_list(Layer_serialized), fun gleam_synapses@model@net_elems@neuron:deserialized/1 ). -spec json_encoded( list(gleam_synapses@model@net_elems@neuron:neuron_serialized()) ) -> gleam@jsone:json_value(). json_encoded(Layer_serialized) -> gleam@jsone:array( Layer_serialized, fun gleam_synapses@model@net_elems@neuron:json_encoded/1 ). -spec json_decoder() -> decode:decoder(list(gleam_synapses@model@net_elems@neuron:neuron_serialized())). json_decoder() -> decode:list(gleam_synapses@model@net_elems@neuron:json_decoder()). -spec generator(integer(), integer()) -> minigen:generator(gleam_zlists@interop:z_list(gleam_synapses@model@net_elems@neuron:neuron())). generator(Input_size, Output_size) -> minigen:map( minigen:list( gleam_synapses@model@net_elems@neuron:generator(Input_size), Output_size ), fun gleam_zlists:of_list/1 ).