void InitConnections() { float weight_init_range = 0.00001f; foreach (KeyValuePair <string, Dictionary <string, string> > structureInfo in networkConnectionInfoDict) { Dictionary <string, Connection> thisLayerConnectionDict = new Dictionary <string, Connection>(); // create the layer's empty connection dictionary if (structureInfo.Value.Count > 0) { // create a connection object // add an entry to the layer's connection dictionary, with the sender name as the key, and the connection object as its value foreach (KeyValuePair <string, string> connectionInfo in structureInfo.Value) { if (connectionInfo.Value == "dense") { Connection dense = new Dense { ConnectionType = connectionInfo.Value, Sender = connectionInfo.Key, Recipient = structureInfo.Key }; // this should be in the dense constructor dense.ConnectionWeight = Matrix <float> .Build.Random(networkLayerDict[dense.Recipient].NumUnits, networkLayerDict[dense.Sender].NumUnits, new Normal (0, weight_init_range)); networkLayerDict[structureInfo.Key].InputConnectionDict.Add(connectionInfo.Key, dense); } else if (connectionInfo.Value == "tanh") { Connection tanh = new TanhActivation { ConnectionType = connectionInfo.Value, Sender = connectionInfo.Key, Recipient = structureInfo.Key }; networkLayerDict[structureInfo.Key].InputConnectionDict.Add(connectionInfo.Key, tanh); } } } } }
public static void Run() { Stopwatch sw = new Stopwatch(); NdArray inputArrayCpu = new NdArray(Initializer.GetRealArray(INPUT_SIZE)); NdArray inputArrayGpu = new NdArray(Initializer.GetRealArray(INPUT_SIZE)); //Linear Linear linear = new Linear(INPUT_SIZE, OUTPUT_SIZE); Console.WriteLine("◆" + linear.Name); sw.Restart(); NdArray[] gradArrayCpu = linear.Forward(inputArrayCpu); sw.Stop(); Console.WriteLine("Forward [Cpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); gradArrayCpu[0].Grad = gradArrayCpu[0].Data; //DataをGradとして使用 sw.Restart(); linear.Backward(gradArrayCpu); sw.Stop(); Console.WriteLine("Backward[Cpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); if (linear.SetGpuEnable(true)) { sw.Restart(); NdArray[] gradArrayGpu = linear.Forward(inputArrayGpu); sw.Stop(); Console.WriteLine("Forward [Gpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); gradArrayGpu[0].Grad = gradArrayGpu[0].Data; sw.Restart(); linear.Backward(gradArrayGpu); sw.Stop(); Console.WriteLine("Backward[Gpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); } //Tanh TanhActivation tanh = new TanhActivation(); Console.WriteLine("\n◆" + tanh.Name); sw.Restart(); gradArrayCpu = tanh.Forward(inputArrayCpu); sw.Stop(); Console.WriteLine("Forward [Cpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); gradArrayCpu[0].Grad = gradArrayCpu[0].Data; sw.Restart(); tanh.Backward(gradArrayCpu); sw.Stop(); Console.WriteLine("Backward[Cpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); if (tanh.SetGpuEnable(true)) { sw.Restart(); NdArray[] gradArrayGpu = tanh.Forward(inputArrayGpu); sw.Stop(); Console.WriteLine("Forward [Gpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); gradArrayGpu[0].Grad = gradArrayGpu[0].Data; sw.Restart(); tanh.Backward(gradArrayGpu); sw.Stop(); Console.WriteLine("Backward[Gpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); } //Sigmoid Sigmoid sigmoid = new Sigmoid(); Console.WriteLine("\n◆" + sigmoid.Name); sw.Restart(); gradArrayCpu = sigmoid.Forward(inputArrayCpu); sw.Stop(); Console.WriteLine("Forward [Cpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); gradArrayCpu[0].Grad = gradArrayCpu[0].Data; sw.Restart(); sigmoid.Backward(gradArrayCpu); sw.Stop(); Console.WriteLine("Backward[Cpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); if (sigmoid.SetGpuEnable(true)) { sw.Restart(); NdArray[] gradArrayGpu = sigmoid.Forward(inputArrayGpu); sw.Stop(); Console.WriteLine("Forward [Gpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); gradArrayGpu[0].Grad = gradArrayGpu[0].Data; sw.Restart(); sigmoid.Backward(gradArrayGpu); sw.Stop(); Console.WriteLine("Backward[Gpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); } //ReLU ReLU relu = new ReLU(); Console.WriteLine("\n◆" + relu.Name); sw.Restart(); gradArrayCpu = relu.Forward(inputArrayCpu); sw.Stop(); Console.WriteLine("Forward [Cpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); gradArrayCpu[0].Grad = gradArrayCpu[0].Data; sw.Restart(); relu.Backward(gradArrayCpu); sw.Stop(); Console.WriteLine("Backward[Cpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); if (relu.SetGpuEnable(true)) { sw.Restart(); NdArray[] gradArrayGpu = relu.Forward(inputArrayGpu); sw.Stop(); Console.WriteLine("Forward [Gpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); gradArrayGpu[0].Grad = gradArrayGpu[0].Data; sw.Restart(); relu.Backward(gradArrayGpu); sw.Stop(); Console.WriteLine("Backward[Gpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); } //LeakyReLU LeakyReLU leakyRelu = new LeakyReLU(); Console.WriteLine("\n◆" + leakyRelu.Name); sw.Restart(); gradArrayCpu = leakyRelu.Forward(inputArrayCpu); sw.Stop(); Console.WriteLine("Forward [Cpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); gradArrayCpu[0].Grad = gradArrayCpu[0].Data; sw.Restart(); leakyRelu.Backward(gradArrayCpu); sw.Stop(); Console.WriteLine("Backward[Cpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); if (leakyRelu.SetGpuEnable(true)) { sw.Restart(); NdArray[] gradArrayGpu = leakyRelu.Forward(inputArrayGpu); sw.Stop(); Console.WriteLine("Forward [Gpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); gradArrayGpu[0].Grad = gradArrayGpu[0].Data; sw.Restart(); leakyRelu.Backward(gradArrayGpu); sw.Stop(); Console.WriteLine("Backward[Gpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); } NdArray inputImageArrayGpu = new NdArray(Initializer.GetRealArray(3 * 256 * 256 * 5), new[] { 3, 256, 256 }, 5); NdArray inputImageArrayCpu = new NdArray(Initializer.GetRealArray(3 * 256 * 256 * 5), new[] { 3, 256, 256 }, 5); //MaxPooling MaxPooling2D maxPooling2D = new MaxPooling2D(3); Console.WriteLine("\n◆" + maxPooling2D.Name); sw.Restart(); NdArray[] gradImageArrayCpu = maxPooling2D.Forward(inputImageArrayCpu); sw.Stop(); Console.WriteLine("Forward [Cpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); gradImageArrayCpu[0].Grad = gradImageArrayCpu[0].Data; sw.Restart(); maxPooling2D.Backward(gradImageArrayCpu); sw.Stop(); Console.WriteLine("Backward[Cpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); if (maxPooling2D.SetGpuEnable(true)) { sw.Restart(); maxPooling2D.Forward(inputImageArrayGpu); sw.Stop(); Console.WriteLine("Forward [Gpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); //メモリ転送のみのため実装がない Console.WriteLine("Backward[Gpu] : None"); } //Conv2D Convolution2D conv2d = new Convolution2D(3, 3, 3); Console.WriteLine("\n◆" + conv2d.Name); sw.Restart(); gradImageArrayCpu = conv2d.Forward(inputImageArrayCpu); sw.Stop(); Console.WriteLine("Forward [Cpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); gradImageArrayCpu[0].Grad = gradImageArrayCpu[0].Data; sw.Restart(); conv2d.Backward(gradImageArrayCpu); sw.Stop(); Console.WriteLine("Backward[Cpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); if (conv2d.SetGpuEnable(true)) { sw.Restart(); NdArray[] gradImageArrayGpu = conv2d.Forward(inputImageArrayGpu); sw.Stop(); Console.WriteLine("Forward [Gpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); gradImageArrayGpu[0].Grad = gradImageArrayGpu[0].Data; sw.Restart(); conv2d.Backward(gradImageArrayGpu); sw.Stop(); Console.WriteLine("Backward[Gpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); } //Deconv2D Deconvolution2D deconv2d = new Deconvolution2D(3, 3, 3); Console.WriteLine("\n◆" + deconv2d.Name); sw.Restart(); gradImageArrayCpu = deconv2d.Forward(inputImageArrayCpu); sw.Stop(); Console.WriteLine("Forward [Cpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); gradImageArrayCpu[0].Grad = gradImageArrayCpu[0].Data; sw.Restart(); deconv2d.Backward(gradImageArrayCpu); sw.Stop(); Console.WriteLine("Backward[Cpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); if (deconv2d.SetGpuEnable(true)) { sw.Restart(); NdArray[] gradImageArrayGpu = deconv2d.Forward(inputImageArrayGpu); sw.Stop(); Console.WriteLine("Forward [Gpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); gradImageArrayGpu[0].Grad = gradImageArrayGpu[0].Data; sw.Restart(); deconv2d.Backward(gradImageArrayGpu); sw.Stop(); Console.WriteLine("Backward[Gpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); } //Dropout Dropout dropout = new Dropout(); Console.WriteLine("\n◆" + dropout.Name); sw.Restart(); gradArrayCpu = dropout.Forward(inputArrayCpu); sw.Stop(); Console.WriteLine("Forward [Cpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); gradArrayCpu[0].Grad = gradArrayCpu[0].Data; sw.Restart(); dropout.Backward(gradArrayCpu); sw.Stop(); Console.WriteLine("Backward[Cpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); if (dropout.SetGpuEnable(true)) { sw.Restart(); NdArray[] gradArrayGpu = dropout.Forward(inputArrayGpu); sw.Stop(); Console.WriteLine("Forward [Gpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); gradArrayGpu[0].Grad = gradArrayGpu[0].Data; sw.Restart(); dropout.Backward(gradArrayGpu); sw.Stop(); Console.WriteLine("Backward[Gpu] : " + (sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L))).ToString("n0") + "μs"); } }