Keras.NET
Keras.NET - это высокоуровневый API нейронных сетей, написанный на C # с привязкой к Python и способный работать поверх TensorFlow, CNTK или Theano. Он был разработан с упором на возможность быстрого экспериментирования. Умение переходить от идеи к результату с минимально возможной задержкой - ключ к хорошему исследованию.
Используйте Keras, если вам нужна библиотека глубокого обучения, которая:
Позволяет легко и быстро создавать прототипы (благодаря удобству для пользователя, модульности и расширяемости). Поддерживает как сверточные сети, так и рекуррентные сети, а также их комбинации. Без проблем работает на CPU и GPU.
Keras.NET использует:
Предпосылка
- Python 3.6, ссылка: https://www.python.org/downloads/
- Установите keras, numpy и один из бэкэндов (Tensorflow / CNTK / Theano). Пожалуйста, посмотрите, как настроить: https://keras.io/backend/
Nuget
Установить с nuget: https://www.nuget.org/packages/Keras.NET
Install-Package Keras.NET
dotnet add package Keras.NET
Пример с образцом XOR
//Load train data NDarray x = np.array(new float[,] { { 0, 0 }, { 0, 1 }, { 1, 0 }, { 1, 1 } }); NDarray y = np.array(new float[] { 0, 1, 1, 0 });
//Build sequential model var model = new Sequential(); model.Add(new Dense(32, activation: "relu", input_shape: new Shape(2))); model.Add(new Dense(64, activation: "relu")); model.Add(new Dense(1, activation: "sigmoid"));
//Compile and train model.Compile(optimizer:"sgd", loss:"binary_crossentropy", metrics: new string[] { "accuracy" }); model.Fit(x, y, batch_size: 2, epochs: 1000, verbose: 1);
//Save model and weights string json = model.ToJson(); File.WriteAllText("model.json", json); model.SaveWeight("model.h5");
//Load model and weight var loaded_model = Sequential.ModelFromJson(File.ReadAllText("model.json")); loaded_model.LoadWeight("model.h5");
Вывод:
Пример MNIST CNN
Пример Python взят из: https://keras.io/examples/mnist_cnn/
int batch_size = 128; int num_classes = 10; int epochs = 12;
// input image dimensions int img_rows = 28, img_cols = 28;
Shape input_shape = null;
// the data, split between train and test sets var ((x_train, y_train), (x_test, y_test)) = MNIST.LoadData();
if(K.ImageDataFormat() == "channels_first") { x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols); x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols); input_shape = (1, img_rows, img_cols); } else { x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1); x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1); input_shape = (img_rows, img_cols, 1); }
x_train = x_train.astype(np.float32); x_test = x_test.astype(np.float32); x_train /= 255; x_test /= 255; Console.WriteLine("x_train shape: " + x_train.shape); Console.WriteLine(x_train.shape[0] + " train samples"); Console.WriteLine(x_test.shape[0] + " test samples");
// convert class vectors to binary class matrices y_train = Utils.ToCategorical(y_train, num_classes); y_test = Utils.ToCategorical(y_test, num_classes);
// Build CNN model var model = new Sequential(); model.Add(new Conv2D(32, kernel_size: (3, 3).ToTuple(), activation: "relu", input_shape: input_shape)); model.Add(new Conv2D(64, (3, 3).ToTuple(), activation: "relu")); model.Add(new MaxPooling2D(pool_size: (2, 2).ToTuple())); model.Add(new Dropout(0.25)); model.Add(new Flatten()); model.Add(new Dense(128, activation: "relu")); model.Add(new Dropout(0.5)); model.Add(new Dense(num_classes, activation: "softmax"));
model.Compile(loss: "categorical_crossentropy", optimizer: new Adadelta(), metrics: new string[] { "accuracy" });
model.Fit(x_train, y_train, batch_size: batch_size, epochs: epochs, verbose: 1, validation_data: new NDarray[] { x_test, y_test }); var score = model.Evaluate(x_test, y_test, verbose: 0); Console.WriteLine("Test loss:", score[0]); Console.WriteLine("Test accuracy:", score[1]);
Вывод
Достигнута точность 98% за 3 периода.
Вот проект: https://github.com/SciSharp/Keras.NET/
Документация: https://scisharp.github.io/Keras.NET/
Теперь запустите свои модели keras в .NET. Добавлю больше блогов с большим количеством примеров. Быть в курсе :)