MyCaffe  1.12.2.41
Deep learning software for Windows C# programmers.
DataSchema.cs
1using MyCaffe.basecode;
4using System;
5using System.Collections;
6using System.Collections.Generic;
7using System.Linq;
8using System.Text;
9using System.Threading.Tasks;
10using System.Xml;
11
12namespace MyCaffe.layers.tft
13{
17 public class DataSchema
18 {
19 Data m_data = new Data();
20 LookupCollection m_lookups = new LookupCollection();
21
25 public DataSchema()
26 {
27 }
28
36 {
37 DataSchema schema = new DataSchema();
38
39 if (desc.TestingSource == null && desc.TrainingSource == null)
40 {
41 if (desc.ID == 0)
42 throw new Exception("The dataset '" + desc.Name + "' has not been saved to the database and cannot be loaded. The data layer should be configured to use a database dataset, but may be configured to use an .NPY file as a source.");
43
44 DatabaseLoader loader = new DatabaseLoader();
45 int nDsID = desc.ID;
46 desc = loader.LoadDatasetFromDb(nDsID);
47 }
48
50
51 if (tsd == null)
52 return null;
53
54 schema.Data.Columns = tsd.ValueStreamDescriptors[0].Steps;
55
56 foreach (ValueStreamDescriptor vsd in tsd.ValueStreamDescriptors)
57 {
58 switch (vsd.ClassType)
59 {
62 schema.Data.StaticNum.Add(new Field(vsd));
63 else
64 schema.Data.StaticCat.Add(new Field(vsd));
65 break;
66
69 schema.Data.ObservedNum.Add(new Field(vsd));
70 else
71 schema.Data.ObservedCat.Add(new Field(vsd));
72 break;
73
76 schema.Data.KnownNum.Add(new Field(vsd));
77 else
78 schema.Data.KnownCat.Add(new Field(vsd));
79 break;
80 }
81 }
82
83 return schema;
84 }
85
92 public static DataSchema LoadFromProject(ProjectEx prj, Phase phase = Phase.TRAIN)
93 {
94 return LoadFromDatasetDescriptor(prj.Dataset, phase);
95 }
96
102 public static DataSchema Load(string strFile)
103 {
104 DataSchema schema = new DataSchema();
105
106 XmlDocument xmlDoc = new XmlDocument();
107 xmlDoc.Load(strFile);
108
109 XmlNode node = xmlDoc.SelectSingleNode("Schema");
110 if (node == null)
111 return null;
112
113 XmlNode dataNode = node.SelectSingleNode("Data");
114 XmlAttribute colAtt = dataNode.Attributes["Columns"];
115 schema.Data.Columns = int.Parse(colAtt.Value);
116
117 XmlNode syncNode = dataNode.SelectSingleNode("Sync");
118 schema.m_data.LoadSync(syncNode);
119
120 XmlNode observedNode = dataNode.SelectSingleNode("Observed");
121 XmlNode observedNumNode = observedNode.SelectSingleNode("Numeric");
122 schema.m_data.LoadObservedNum(observedNumNode);
123 XmlNode observedCatNode = observedNode.SelectSingleNode("Categorical");
124 schema.m_data.LoadObservedCat(observedCatNode);
125
126 XmlNode knownNode = dataNode.SelectSingleNode("//Known");
127 XmlNode knownNumNode = knownNode.SelectSingleNode("Numeric");
128 schema.m_data.LoadKnownNum(knownNumNode);
129 XmlNode knownCatNode = knownNode.SelectSingleNode("Categorical");
130 schema.m_data.LoadKnownCat(knownCatNode);
131
132 XmlNode staticNode = dataNode.SelectSingleNode("Static");
133 XmlNode staticNumNode = staticNode.SelectSingleNode("Numeric");
134 schema.m_data.LoadStaticNum(staticNumNode);
135 XmlNode staticCatNode = staticNode.SelectSingleNode("Categorical");
136 schema.m_data.LoadStaticCat(staticCatNode);
137
138 XmlNode lookupsNode = node.SelectSingleNode("Lookups");
139 schema.m_lookups = LookupCollection.Load(lookupsNode);
140
141 return schema;
142 }
143
147 public Data Data
148 {
149 get { return m_data; }
150 }
151
156 {
157 get { return m_lookups; }
158 }
159 }
160
164 public class Data
165 {
166 int m_nColumns = 0;
167 FieldCollection m_sync = new FieldCollection();
168 FieldCollection m_numKnown = new FieldCollection();
169 FieldCollection m_catKnown = new FieldCollection();
170 FieldCollection m_numObserved = new FieldCollection();
171 FieldCollection m_catObserved = new FieldCollection();
172 FieldCollection m_numStatic = new FieldCollection();
173 FieldCollection m_catStatic = new FieldCollection();
174
178 public Data()
179 {
180 }
181
186 public void LoadSync(XmlNode node)
187 {
188 m_sync = FieldCollection.Load(node);
189 }
190
195 public void LoadKnownNum(XmlNode node)
196 {
197 m_numKnown = FieldCollection.Load(node);
198 }
199
204 public void LoadKnownCat(XmlNode node)
205 {
206 m_catKnown = FieldCollection.Load(node);
207 }
208
213 public void LoadObservedNum(XmlNode node)
214 {
215 m_numObserved = FieldCollection.Load(node);
216 }
217
222 public void LoadObservedCat(XmlNode node)
223 {
224 m_catObserved = FieldCollection.Load(node);
225 }
226
231 public void LoadStaticNum(XmlNode node)
232 {
233 m_numStatic = FieldCollection.Load(node);
234 }
235
240 public void LoadStaticCat(XmlNode node)
241 {
242 m_catStatic = FieldCollection.Load(node);
243 }
244
248 public int TargetIndex
249 {
250 get { return m_numObserved.FindFieldIndex(Field.INPUT_TYPE.TARGET); }
251 }
252
256 public int Columns
257 {
258 get { return m_nColumns; }
259 set { m_nColumns = value; }
260 }
261
265 public FieldCollection Sync
266 {
267 get { return m_sync; }
268 }
269
273 public FieldCollection KnownNum
274 {
275 get { return m_numKnown; }
276 }
277
281 public FieldCollection KnownCat
282 {
283 get { return m_catKnown; }
284 }
285
289 public FieldCollection ObservedNum
290 {
291 get { return m_numObserved; }
292 }
293
297 public int ObservedNumExplicitCount
298 {
299 get
300 {
301 int nCount = 0;
302 foreach (Field field in m_numObserved)
303 {
304 if ((field.InputType & Field.INPUT_TYPE.OBSERVED) == Field.INPUT_TYPE.OBSERVED)
305 nCount++;
306 }
307
308 return nCount;
309 }
310 }
311
317 public bool IsObservedNum(int nIdx)
318 {
319 if (nIdx < 0 || nIdx >= m_numObserved.Count)
320 return false;
321
322 return ((m_numObserved[nIdx].InputType & Field.INPUT_TYPE.OBSERVED) == Field.INPUT_TYPE.OBSERVED);
323 }
324
328 public FieldCollection ObservedCat
329 {
330 get { return m_catObserved; }
331 }
332
336 public FieldCollection StaticNum
337 {
338 get { return m_numStatic; }
339 }
340
344 public FieldCollection StaticCat
345 {
346 get { return m_catStatic; }
347 }
348 }
349
353 public class LookupCollection
354 {
355 Dictionary<string, Lookup> m_rgLookups = new Dictionary<string, Lookup>();
356
361 {
362 }
363
369 public static LookupCollection Load(XmlNode node)
370 {
371 LookupCollection lookups = new LookupCollection();
372
373 XmlNodeList lookupNodes = node.SelectNodes("Lookup");
374 foreach (XmlNode lookupNode in lookupNodes)
375 {
376 Lookup lookup = Lookup.Load(lookupNode);
377 lookups.Add(lookup);
378 }
379
380 return lookups;
381 }
382
387 public void Add(Lookup lookup)
388 {
389 m_rgLookups.Add(lookup.Name, lookup);
390 }
391
397 public Lookup Find(string strName)
398 {
399 if (!m_rgLookups.ContainsKey(strName))
400 return null;
401
402 return m_rgLookups[strName];
403 }
404
410 public Lookup this[int nIdx]
411 {
412 get { return m_rgLookups.ElementAt(nIdx).Value; }
413 }
414
418 public int Count
419 {
420 get { return m_rgLookups.Count; }
421 }
422 }
423
427 public class Lookup
428 {
429 string m_strName;
430 Dictionary<string, LookupItem> m_rgLookupNameToId = new Dictionary<string, LookupItem>();
431 Dictionary<int, LookupItem> m_rgLookupIdToName = new Dictionary<int, LookupItem>();
432
436 public Lookup()
437 {
438 }
439
445 public static Lookup Load(XmlNode node)
446 {
447 Lookup lookup = new Lookup();
448
449 lookup.m_strName = node.Attributes["Name"].Value;
450
451 XmlNodeList itemNodes = node.SelectNodes("Item");
452 foreach (XmlNode itemNode in itemNodes)
453 {
454 lookup.Add(LookupItem.Load(itemNode));
455 }
456
457 return lookup;
458 }
459
463 public int Count
464 {
465 get { return m_rgLookupIdToName.Count; }
466 }
467
471 public void Clear()
472 {
473 m_rgLookupIdToName.Clear();
474 m_rgLookupNameToId.Clear();
475 }
476
481 public void Add(Lookup l)
482 {
483 foreach (KeyValuePair<int, LookupItem> kv in l.m_rgLookupIdToName)
484 {
485 bool bAdd = true;
486
487 if (m_rgLookupIdToName.ContainsKey(kv.Key))
488 {
489 if (!m_rgLookupIdToName[kv.Key].Compare(kv.Value))
490 {
491 m_rgLookupIdToName.Remove(kv.Key);
492 m_rgLookupNameToId.Remove(kv.Value.Name);
493 }
494 else
495 {
496 bAdd = false;
497 }
498 }
499
500 if (bAdd)
501 {
502 m_rgLookupIdToName.Add(kv.Key, kv.Value);
503 m_rgLookupNameToId.Add(kv.Value.Name, kv.Value);
504 }
505 }
506 }
507
512 public void Add(LookupItem item)
513 {
514 m_rgLookupIdToName.Add(item.ID, item);
515 m_rgLookupNameToId.Add(item.Name, item);
516 }
517
521 public string Name
522 {
523 get { return m_strName; }
524 }
525
531 public int FindID(string strName)
532 {
533 if (!m_rgLookupNameToId.ContainsKey(strName))
534 return -1;
535
536 return m_rgLookupNameToId[strName].ID;
537 }
538
544 public string FindName(int nID)
545 {
546 if (!m_rgLookupIdToName.ContainsKey(nID))
547 return null;
548
549 return m_rgLookupIdToName[nID].Name;
550 }
551
557 public LookupItem this[int nIdx]
558 {
559 get { return m_rgLookupIdToName.ElementAt(nIdx).Value; }
560 }
561 }
562
566 public class LookupItem
567 {
568 string m_strName;
569 int m_nIndex;
570 int m_nValidRangeStartIndex = -1;
571 int m_nValidRangeEndIndex = -1;
572
578 public LookupItem(string strName, int nIndex)
579 {
580 m_strName = strName;
581 m_nIndex = nIndex;
582 }
583
591 public LookupItem(string strName, int nIndex, int nValidRangeStart, int nValidRangeEnd)
592 {
593 m_strName = strName;
594 m_nIndex = nIndex;
595 m_nValidRangeStartIndex = nValidRangeStart;
596 m_nValidRangeEndIndex = nValidRangeEnd;
597 }
598
604 public static LookupItem Load(XmlNode node)
605 {
606 string strName = node.FirstChild.Value;
607 int nIndex = int.Parse(node.Attributes["Index"].Value);
608 int nValidRangeStart = -1;
609 int nValidRangeEnd = -1;
610
611 if (node.Attributes["ValidRangeStartIdx"] != null)
612 nValidRangeStart = int.Parse(node.Attributes["ValidRangeStartIdx"].Value);
613
614 if (node.Attributes["ValidRangeEndIdx"] != null)
615 nValidRangeEnd = int.Parse(node.Attributes["ValidRangeEndIdx"].Value);
616
617 return new LookupItem(strName, nIndex, nValidRangeStart, nValidRangeEnd);
618 }
619
625 public bool Compare(LookupItem item)
626 {
627 if (item.Name != Name)
628 return false;
629
631 return false;
632
634 return false;
635
636 return true;
637 }
638
642 public string Name
643 {
644 get { return m_strName; }
645 }
646
650 public int ID
651 {
652 get { return m_nIndex; }
653 }
654
659 {
660 get { return m_nValidRangeStartIndex; }
661 }
662
667 {
668 get { return m_nValidRangeEndIndex; }
669 }
670
675 {
676 get { return (m_nValidRangeStartIndex == -1) ? -1 : (m_nValidRangeEndIndex - m_nValidRangeStartIndex) + 1; }
677 }
678
683 public override string ToString()
684 {
685 return m_strName + " @" + m_nIndex.ToString() + " (" + m_nValidRangeStartIndex.ToString() + "," + m_nValidRangeEndIndex.ToString() + ")";
686 }
687 }
688
692 public class FieldCollection : IEnumerable<Field>
693 {
694 string m_strFile;
695 List<Field> m_rgFields = new List<Field>();
696
701 {
702 }
703
709 public static FieldCollection Load(XmlNode node)
710 {
712
713 XmlNode nodeFile = node.SelectSingleNode("File");
714 if (nodeFile != null)
715 col.m_strFile = nodeFile.FirstChild.Value;
716
717 XmlNodeList nodes = node.SelectNodes("Field");
718 foreach (XmlNode node1 in nodes)
719 {
720 Field field = Field.Load(node1);
721 col.Add(field);
722 }
723
724 return col;
725 }
726
733 {
734 for (int i = 0; i < m_rgFields.Count; i++)
735 {
736 if ((m_rgFields[i].InputType & type) == type)
737 return i;
738 }
739
740 return -1;
741 }
742
747 public void Add(Field field)
748 {
749 m_rgFields.Add(field);
750 }
751
756 public IEnumerator<Field> GetEnumerator()
757 {
758 return m_rgFields.GetEnumerator();
759 }
760
765 IEnumerator IEnumerable.GetEnumerator()
766 {
767 return m_rgFields.GetEnumerator();
768 }
769
775 public Field this[int nIdx]
776 {
777 get { return m_rgFields[nIdx]; }
778 }
779
785 public Field this[string strName]
786 {
787 get
788 {
789 foreach (Field field in m_rgFields)
790 {
791 if (field.Name == strName)
792 return field;
793 }
794
795 return null;
796 }
797 }
798
802 public int Count
803 {
804 get { return m_rgFields.Count; }
805 }
806
810 public string File
811 {
812 get { return m_strFile; }
813 }
814 }
815
819 public class Field
820 {
821 string m_strName;
822 int m_nIdx = 0;
823 DATA_TYPE m_dataType = DATA_TYPE.REAL;
824 INPUT_TYPE m_inputType = INPUT_TYPE.TIME;
825
829 public enum DATA_TYPE
830 {
834 REAL,
838 CATEGORICAL
839 }
840
844 public enum INPUT_TYPE
845 {
849 NONE = 0x0000,
853 TIME = 0x0001,
857 ID = 0x0002,
861 KNOWN = 0x0004,
865 OBSERVED = 0x0008,
869 STATIC = 0x0010,
873 TARGET = 0x1000,
874 }
875
883 public Field(string strName, int nIdx, DATA_TYPE dataType, INPUT_TYPE inputType)
884 {
885 m_strName = strName;
886 m_nIdx = nIdx;
887 m_dataType = dataType;
888 m_inputType = inputType;
889 }
890
896 {
897 m_strName = vsd.Name;
898 m_nIdx = vsd.Ordering;
899 m_dataType = (vsd.ValueType == ValueStreamDescriptor.STREAM_VALUE_TYPE.NUMERIC) ? DATA_TYPE.REAL : DATA_TYPE.CATEGORICAL;
900
901 switch (vsd.ClassType)
902 {
904 m_inputType = INPUT_TYPE.STATIC;
905 break;
906
908 m_inputType = INPUT_TYPE.OBSERVED;
909 break;
910
912 m_inputType = INPUT_TYPE.KNOWN;
913 break;
914 }
915 }
916
922 public static Field Load(XmlNode node)
923 {
924 string strName = node.FirstChild.Value;
925 int nIdx = int.Parse(node.Attributes["Index"].Value);
926 string strDataType = node.Attributes["DataType"].Value;
927 string strInputType = node.Attributes["InputType"].Value;
928
929 DATA_TYPE dataType = DATA_TYPE.REAL;
930 INPUT_TYPE inputType = INPUT_TYPE.NONE;
931
932 if (strDataType == "REAL")
933 dataType = DATA_TYPE.REAL;
934 else if (strDataType == "CATEGORICAL")
935 dataType = DATA_TYPE.CATEGORICAL;
936
937 if (strInputType == "TIME")
938 inputType = INPUT_TYPE.TIME;
939 else if (strInputType == "ID")
940 inputType = INPUT_TYPE.ID;
941 else if (strInputType == "KNOWN")
942 inputType = INPUT_TYPE.KNOWN;
943 else if (strInputType == "STATIC")
944 inputType = INPUT_TYPE.STATIC;
945 else
946 {
947 if (strInputType.Contains("OBSERVED"))
948 inputType |= INPUT_TYPE.OBSERVED;
949 if (strInputType.Contains("TARGET"))
950 inputType |= INPUT_TYPE.TARGET;
951 }
952
953 return new Field(strName, nIdx, dataType, inputType);
954 }
955
959 public string Name
960 {
961 get { return m_strName; }
962 }
963
967 public int Index
968 {
969 get { return m_nIdx; }
970 }
971
976 {
977 get { return m_dataType; }
978 }
979
984 {
985 get { return m_inputType; }
986 }
987
992 override public string ToString()
993 {
994 return m_strName + " @" + m_nIdx.ToString() + " (" + m_dataType.ToString() + "," + m_inputType.ToString() + ")";
995 }
996 }
997}
The ProjectEx class manages a project containing the solver description, model description,...
Definition: ProjectEx.cs:15
DatasetDescriptor Dataset
Return the descriptor of the dataset used.
Definition: ProjectEx.cs:896
int ID
Get/set the database ID of the item.
string Name
Get/set the name of the item.
The DatasetDescriptor class describes a dataset which contains both a training data source and testin...
SourceDescriptor TrainingSource
Get/set the training data source.
SourceDescriptor TestingSource
Get/set the testing data source.
TemporalDescriptor TemporalDescriptor
Get/set the temporal descriptor (if any).
The TemporalDescriptor is used to describe a temporal aspects of the data source.
List< ValueStreamDescriptor > ValueStreamDescriptors
Returns the value stream descriptor.
The value stream descriptor describes a single value stream within a value item.
STREAM_CLASS_TYPE ClassType
Returns the value stream class type.
int Ordering
Returns the value stream ordering.
STREAM_VALUE_TYPE ValueType
Returns the value stream value type.
The DatasetLoader is used to load descriptors from the database.
DatasetDescriptor LoadDatasetFromDb(string strDs)
Load a dataset with the specified name from the database.
The DataSchema class is used by the DataTemporalLayer to load the data schema describing the NPY file...
Definition: DataSchema.cs:18
Data Data
Returns the data portion of the schema.
Definition: DataSchema.cs:148
static DataSchema Load(string strFile)
Loads the data schema from the XML schema file produced by the AiDesigner.TFT data creator.
Definition: DataSchema.cs:102
DataSchema()
The constructor.
Definition: DataSchema.cs:25
static DataSchema LoadFromDatasetDescriptor(DatasetDescriptor desc, Phase phase)
Loads the data schema from a dataset descriptor.
Definition: DataSchema.cs:35
static DataSchema LoadFromProject(ProjectEx prj, Phase phase=Phase.TRAIN)
Loads the data schema from a project.
Definition: DataSchema.cs:92
LookupCollection Lookups
Returns the lookups portion of the schema.
Definition: DataSchema.cs:156
The FieldCollection manages a collection of fields.
Definition: DataSchema.cs:693
int FindFieldIndex(Field.INPUT_TYPE type)
Locates the index of the field by its type.
Definition: DataSchema.cs:732
int Count
Returns the number of fields in the collection.
Definition: DataSchema.cs:803
FieldCollection()
The constructor.
Definition: DataSchema.cs:700
void Add(Field field)
Add a new field to the collection.
Definition: DataSchema.cs:747
static FieldCollection Load(XmlNode node)
Loads a collection of fields from an XML node.
Definition: DataSchema.cs:709
IEnumerator< Field > GetEnumerator()
Return the enumeration of the fields.
Definition: DataSchema.cs:756
string File
Returns the NPY file for which the fields are associated with.
Definition: DataSchema.cs:811
The Field class manages a single field.
Definition: DataSchema.cs:820
static Field Load(XmlNode node)
Loads a new field from an XML node.
Definition: DataSchema.cs:922
int Index
Returns the Index of the field within the numpy file.
Definition: DataSchema.cs:968
DATA_TYPE DataType
Returns the data type of the field.
Definition: DataSchema.cs:976
INPUT_TYPE InputType
Returns the input type of the field.
Definition: DataSchema.cs:984
override string ToString()
Returns a string representation of the field.
Definition: DataSchema.cs:992
INPUT_TYPE
Defines the input type of the field.
Definition: DataSchema.cs:845
Field(ValueStreamDescriptor vsd)
Create a new field from the ValueStreamDescriptor specified.
Definition: DataSchema.cs:895
DATA_TYPE
Defines the Data Type of the field.
Definition: DataSchema.cs:830
Field(string strName, int nIdx, DATA_TYPE dataType, INPUT_TYPE inputType)
The constructor.
Definition: DataSchema.cs:883
string Name
Returns the name of the field.
Definition: DataSchema.cs:960
The LookupCollection class contains a collection of Lookup objects.
Definition: DataSchema.cs:354
static LookupCollection Load(XmlNode node)
Loads the LookupCollection from a node.
Definition: DataSchema.cs:369
int Count
Specifies the number of lookups in the collection.
Definition: DataSchema.cs:419
Lookup Find(string strName)
Locates a lookup by name.
Definition: DataSchema.cs:397
LookupCollection()
The constructor.
Definition: DataSchema.cs:360
void Add(Lookup lookup)
Adds a new lookup to the collection.
Definition: DataSchema.cs:387
The Lookup class is used to manage a single lookup table.
Definition: DataSchema.cs:428
Lookup()
The constructor.
Definition: DataSchema.cs:436
void Add(LookupItem item)
Add a new item to the lookup table.
Definition: DataSchema.cs:512
void Clear()
Clear the entries from the lookup table.
Definition: DataSchema.cs:471
int FindID(string strName)
Find a given lookup ID by name.
Definition: DataSchema.cs:531
string Name
Specifies the lookup item name.
Definition: DataSchema.cs:522
int Count
Returns the the number of lookup items.
Definition: DataSchema.cs:464
static Lookup Load(XmlNode node)
Load a lookup table from an XML node.
Definition: DataSchema.cs:445
void Add(Lookup l)
Add a lookup table to this lookup table.
Definition: DataSchema.cs:481
string FindName(int nID)
Find a given lookup name by ID.
Definition: DataSchema.cs:544
The lookup item manages a single lookup item used to map a name to an ID.
Definition: DataSchema.cs:567
LookupItem(string strName, int nIndex, int nValidRangeStart, int nValidRangeEnd)
The constructor.
Definition: DataSchema.cs:591
int ValidRangeEndIndex
Returns the valid data range end index or -1 to ignore.
Definition: DataSchema.cs:667
static LookupItem Load(XmlNode node)
Load a LookupItem from an XML node.
Definition: DataSchema.cs:604
int? ValidRangeCount
Returns the number of valid data items in the range or -1 if the range is not set.
Definition: DataSchema.cs:675
LookupItem(string strName, int nIndex)
The constructor.
Definition: DataSchema.cs:578
int ID
Specifies the lookup ID.
Definition: DataSchema.cs:651
bool Compare(LookupItem item)
Compare two LookupItems and return whether or not they are the same.
Definition: DataSchema.cs:625
override string ToString()
Returns a string representation of the lookup item.
Definition: DataSchema.cs:683
int ValidRangeStartIndex
Returns the valid data range start index or -1 to ignore.
Definition: DataSchema.cs:659
string Name
Specifies the lookup name.
Definition: DataSchema.cs:643
The descriptors namespace contains all descriptor used to describe various items stored within the da...
The MyCaffe.basecode contains all generic types used throughout MyCaffe.
Definition: Annotation.cs:12
Phase
Defines the Phase under which to run a Net.
Definition: Interfaces.cs:61
@ NONE
No training category specified.
The MyCaffe.db.temporal namespace contains all classes used to create the MyCaffeTemporalDatabase in-...
The MyCaffe.layers.tft namespace contains all TFT related layers.
Definition: LayerFactory.cs:15
The MyCaffe namespace contains the main body of MyCaffe code that closesly tracks the C++ Caffe open-...
Definition: Annotation.cs:12