在C#.NET中训练⾃⼰的⼿写数字识别器
卷积神经⽹络(CNN)是⽤于图像分类任务的当前最先进的模型架构。 CNN将⼀系列滤波器应⽤于图像的原始像素数据,以提取和学习更⾼级别的特征,然后该模型可⽤于分类。
这篇⽂章我们将采⽤⼀个⾮常常见的CNN例⼦来识别⼿写数字。 我们将在C#中训练深度学习模型,并使⽤该训练模型来预测⼿写数字。我们将使⽤Keras.NET编写我们⾃⼰的模型并使⽤标准的MNIST数据集进⾏训练,该数据集包含来⾃美国⼈⼝普查局员⼯和美国⾼中学⽣的60,000张训练图像和10,000张测试图像。
writeline使用方法python
⼀个MMIST中的数字如下,是28*28像素的灰度图像。
Keras.NET Setup
Keras.NET需要Python,我们将从⼀些先决条件开始:
下载python可执⾏⽂件并安装它。 链接在这⾥:
/ftp/python/3.6.8/python-3.
安装完成后,打开命令提⽰符并运⾏python,它将加载python
成功。 退出命令,然后开始安装keras包。
运⾏以下命令安装keras:pip install keras
Keras需要后端,可以是以下之⼀:
tensorflow/ cntk/ theano/ plaidml。 让我们通过运⾏来使⽤tensorflow
命令“pip install tensorflow”。 如果你有适当的GPU设置
安装CUDA后,可以使⽤tensorflow-gpu
⼀切顺利,你可以通过运⾏来检查设置:python -m“keras”
Implementation
让我们⾸先创建⼀个新的.NET核⼼控制台项⽬“Basic MNIST”。 从nuget包管理器添加Keras.NET的引⽤。 该库建⽴在Python之上,使.NET开发⼈员能够在C#中构建和执⾏更加结构化的Keras代码。这个库将与安装的keras库进⾏通信。
在Program.cs的main⽅法中,声明以下变量:
int batch_size = 128; //Training batch size
int num_classes = 10; //No. of classes
int epochs = 12; //No. of epoches we will train
// input image dimensions
int img_rows = 28, img_cols = 28;
// Declare the input shape for the network
Shape input_shape = null;
我们在Keras中有⼀个辅助⽅法,它将下载MNIST数据集并为您提供Numpy数组格式。 根据指定的数据格式,我们将声
明input_shape(N,H,W,C),这种情况下它将是(1,28,28,1)最后⼀个通道
// Load the MNIST dataset into Numpy array
var ((x_train, y_train), (x_test, y_test)) = MNIST.LoadData();
//Check if its channel fist or last and rearrange the dataset accordingly
if(K.ImageDataFormat() == "channels_first")
{
x_train = shape(x_train.shape[0], 1, img_rows, img_cols);
x_test = shape(x_test.shape[0], 1, img_rows, img_cols);
input_shape = (1, img_rows, img_cols);
}
else
{
x_train = shape(x_train.shape[0], img_rows, img_cols, 1);
x_test = shape(x_test.shape[0], img_rows, img_cols, 1);
input_shape = (img_rows, img_cols, 1);
}
标准化输⼊的图像数据
//Normalize the input data
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");
预期值是3,5,1等数字,需要转换为基数对10的⼆进制数。使⽤以下内容:
// Convert class vectors to binary class matrices
y_train = Util.ToCategorical(y_train, num_classes);
y_test = Util.ToCategorical(y_test, num_classes);
Build a CNN model, which is a combination of Convolution, Pooling and Dense layers
// 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"));
使⽤AdaDelta优化器和分类交叉熵损失( categorial cross-entropy loss,) 编译模型,我们将使⽤精度度量来衡量性能。
//Compile with loss, metrics and optimizer
model.Compile(loss: "categorical_crossentropy",
optimizer: new Adadelta(), metrics: new string[] { "accuracy" });
//Train the model
model.Fit(x_train, y_train,
batch_size: batch_size,
epochs: epochs,
verbose: 1,
validation_data: new NDarray[] { x_test, y_test });
⼀旦模型被训练,我们就可以对测试数据进⾏评估,最后将其保存为HDF5和Tensorflow JS格式。 我们稍后将使⽤Tensorflow JS格式在⽹页上运⾏模型。
//Score the model for performance
var score = model.Evaluate(x_test, y_test, verbose: 0);
Console.WriteLine("Test loss:" + score[0]);
Console.WriteLine("Test accuracy:" + score[1]);
// Save the model to HDF5 format which can be loaded later or ported to other application
model.Save("model.h5");
// Save it to Tensorflow JS format and we will test it in browser.
model.SaveTensorflowJSFormat("./");
以下是培训的进展情况,在2个epoch内实现了98%的准确率。
只要画出数字,点“”Recognize”按钮,模型将为你⾃动识别出数字。
请试试看Keras.NET,给我反馈它运⾏的怎么样。 我会告诉你更多的例⼦。 所以请继续关注?
项⽬URL:https://github/SciSharp/Keras.NET

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。