public void Connect(Layer layer) { _layer = layer; if (args.InputTensors != null) { KerasInputs.AddRange(args.InputTensors); } // Wire up Node to Layers. layer.InboundNodes.Add(this); foreach (var kt in KerasInputs) { if (kt.KerasHistory == null) { continue; } var(inbound_layer, _, _) = kt.KerasHistory; if (inbound_layer != null) { inbound_layer.OutboundNodes.Add(this); } } // Set metadata on outputs. var node_index = layer.InboundNodes.Count - 1; foreach (var(i, tensor) in enumerate(Outputs)) { tensor.KerasHistory = new KerasHistory(layer, node_index, i); } }
/// <summary> /// Serializes `Node` for Functional API's `get_config`. /// </summary> /// <returns></returns> public List <NodeConfig> serialize(Func <string, int, string> make_node_key, Dictionary <string, int> node_conversion_map) { return(KerasInputs.Select(x => { var kh = x.KerasHistory; var node_key = make_node_key(kh.Layer.Name, kh.NodeIndex); var new_node_index = node_conversion_map.Get(node_key, 0); return new NodeConfig { Name = kh.Layer.Name, NodeIndex = new_node_index, TensorIndex = kh.TensorIndex }; }).ToList()); }
/// <summary> /// Maps Keras Tensors to computed Tensors using `tensor_dict`. /// </summary> /// <param name="tensor_dict"></param> /// <returns></returns> public Tensors MapArguments(Dictionary <int, Queue <Tensor> > tensor_dict) { if (_single_positional_tensor_passed) { var kt_id = _keras_inputs_ids_and_indices[0]; return(tensor_dict[kt_id].Dequeue()); } else { var flat_arguments = KerasInputs.Select(x => x).ToArray(); foreach (var(kt_index, kt_id) in enumerate(_keras_inputs_ids_and_indices)) { flat_arguments[kt_index] = tensor_dict[kt_id].Dequeue(); } return(flat_arguments); } }
/// <summary> /// Maps Keras Tensors to computed Tensors using `tensor_dict`. /// </summary> /// <param name="tensor_dict"></param> /// <returns></returns> public Tensors MapArguments(Dictionary <long, Queue <Tensor> > tensor_dict) { if (KerasInputs.Count() == 1) { var kt_id = KerasInputs[0].Id; return(tensor_dict[kt_id].Dequeue()); } else { var flat_arguments = KerasInputs.Select(x => x).ToArray(); foreach (var(kt_index, kt) in enumerate(KerasInputs)) { flat_arguments[kt_index] = tensor_dict[kt.Id].Dequeue(); } return(flat_arguments); } }
public Node(Layer layer, NodeArgs args) { this.args = args; this.Layer = layer; if (args.InputTensors != null) { KerasInputs.AddRange(args.InputTensors); } foreach (var(i, ele) in enumerate(KerasInputs)) { _keras_inputs_ids_and_indices[i] = ele.GetHashCode(); } // Wire up Node to Layers. layer.InboundNodes.Add(this); foreach (var kt in KerasInputs) { if (kt.KerasHistory == null) { continue; } var(inbound_layer, _, _) = kt.KerasHistory; if (inbound_layer != null) { inbound_layer.OutboundNodes.Add(this); } } // Set metadata on outputs. var node_index = layer.InboundNodes.Count - 1; foreach (var(i, tensor) in enumerate(Outputs)) { tensor.KerasHistory = new KerasHistory(layer, node_index, i, tensor); } // Cached for performance. FlatInputIds = KerasInputs.Select(x => x.GetHashCode()).ToArray(); FlatOutputIds = Outputs.Select(x => x.GetHashCode()).ToArray(); }
public override string ToString() => $"{Layer.Name}, {KerasInputs.Count} inputs: {string.Join(",", KerasInputs.Select(x => x.name))}";