ConvNetSharp
vNetSharp v0.4.14
Первоначально начался как C# Port of Conventjs. Вы можете использовать ConvnetSharp для обучения и оценки сверточных нейронных сетей (CNN).
Большое спасибо первоначальному автору Convnetjs (Andrej Karpathy) и всем участникам!
ConvnetSharp полагается на библиотеку ManagedCuda в Acces nvidia Cuda
Core.layers | Flow.layers | График вычисления |
---|---|---|
Нет графика вычислений | Слои, которые создают вычислительный график за сценой | 'Чистый поток' |
Сеть, организованная слоями с укладкой | Сеть, организованная слоями с укладкой | «Опс» связан друг с другом. Может реализовать более сложные сети |
![]() | ![]() | ![]() |
Например, Mnistdemo | Например, Mnistflowgpudemo или Flow Version of Classify2ddemo | Например, примеры |
Вот минимальный пример определения двухслойной нейронной сети и обучения ее по одной точке данных:
using System ;
using ConvNetSharp . Core ;
using ConvNetSharp . Core . Layers . Double ;
using ConvNetSharp . Core . Training . Double ;
using ConvNetSharp . Volume ;
using ConvNetSharp . Volume . Double ;
namespace MinimalExample
{
internal class Program
{
private static void Main ( )
{
// specifies a 2-layer neural network with one hidden layer of 20 neurons
var net = new Net < double > ( ) ;
// input layer declares size of input. here: 2-D data
// ConvNetJS works on 3-Dimensional volumes (width, height, depth), but if you're not dealing with images
// then the first two dimensions (width, height) will always be kept at size 1
net . AddLayer ( new InputLayer ( 1 , 1 , 2 ) ) ;
// declare 20 neurons
net . AddLayer ( new FullyConnLayer ( 20 ) ) ;
// declare a ReLU (rectified linear unit non-linearity)
net . AddLayer ( new ReluLayer ( ) ) ;
// declare a fully connected layer that will be used by the softmax layer
net . AddLayer ( new FullyConnLayer ( 10 ) ) ;
// declare the linear classifier on top of the previous hidden layer
net . AddLayer ( new SoftmaxLayer ( 10 ) ) ;
// forward a random data point through the network
var x = BuilderInstance . Volume . From ( new [ ] { 0.3 , - 0.5 } , new Shape ( 2 ) ) ;
var prob = net . Forward ( x ) ;
// prob is a Volume. Volumes have a property Weights that stores the raw data, and WeightGradients that stores gradients
Console . WriteLine ( " probability that x is class 0: " + prob . Get ( 0 ) ) ; // prints e.g. 0.50101
var trainer = new SgdTrainer ( net ) { LearningRate = 0.01 , L2Decay = 0.001 } ;
trainer . Train ( x , BuilderInstance . Volume . From ( new [ ] { 1.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 } , new Shape ( 1 , 1 , 10 , 1 ) ) ) ; // train the network, specifying that x is class zero
var prob2 = net . Forward ( x ) ;
Console . WriteLine ( " probability that x is class 0: " + prob2 . Get ( 0 ) ) ;
// now prints 0.50374, slightly higher than previous 0.50101: the networks
// weights have been adjusted by the Trainer to give a higher probability to
// the class we trained the network with (zero)
}
}
}
var net = FluentNet < double > . Create ( 24 , 24 , 1 )
. Conv ( 5 , 5 , 8 ) . Stride ( 1 ) . Pad ( 2 )
. Relu ( )
. Pool ( 2 , 2 ) . Stride ( 2 )
. Conv ( 5 , 5 , 16 ) . Stride ( 1 ) . Pad ( 2 )
. Relu ( )
. Pool ( 3 , 3 ) . Stride ( 3 )
. FullyConn ( 10 )
. Softmax ( 10 )
. Build ( ) ;
Чтобы переключиться на режим GPU:
GPU
» в пространство имен: using ConvNetSharp.Volume.
Графический процессор .Single;
или using ConvNetSharp.Volume.
Графический процессор .Double;
BuilderInstance<float>.Volume = new ConvNetSharp.Volume.GPU.Single.VolumeBuilder();
или BuilderInstance<double>.Volume = new ConvNetSharp.Volume.GPU.Double.VolumeBuilder();
На начале вашего кодаВы должны иметь CUDA версию 10.0 и Cudnn v7.6.4 (27 сентября 2019 г.) для установки CUDA 10.0. Путь cudnn bin следует упомянуть в переменной среды пути.
Демонстрация графического процессора Mnist
using ConvNetSharp . Core . Serialization ;
[ .. . ]
// Serialize to json
var json = net . ToJson ( ) ;
// Deserialize from json
Net deserialized = SerializationExtensions . FromJson < double > ( json ) ;
using ConvNetSharp . Flow . Serialization ;
[ .. . ]
// Serialize to two files: MyNetwork.graphml (graph structure) / MyNetwork.json (volume data)
net . Save ( " MyNetwork " ) ;
// Deserialize from files
var deserialized = SerializationExtensions . Load < double > ( " MyNetwork " , false ) [ 0 ] ; // first element is the network (second element is the cost if it was saved along)