在本文中,我们将学习如何在C#中构建神经网络模型图。与线性分类器相比,神经网络的关键优势在于它可以分类非不可线性分布的数据。我们将实现此模型来对来自于MNIST的手写数字图像数据集的进行分类。
我们要构建的神经网络的结构如下。 MNIST数据的手写数字图像有10个类(从0到9)。该网络具有2个隐藏层:第一层具有200个隐藏单元(神经元),第二层具有10个神经元(称为分类器层)。
让我们一步一步地开始实施:
1.准备数据
MNIST是手写数字的数据集,包含55,000个用于训练的示例,5,000个用于验证的示例和10,000个用于测试的示例。这些数字已经过标准化,并且以固定尺寸的图像(28 x 28像素)为中心,其值为0和1.每个图像已被展平并转换为784个特征的1-D阵列。它也是深度学习数据集的基准。
我们定义一些变量使以后更容易修改它们。值得注意的是,在线性模型中,我们必须将输入图像展平为矢量。
using System;
using NumSharp;
using Tensorflow;
using TensorFlowNET.Examples.Utility;
using static Tensorflow.Python;
const int img_h = 28;
const int img_w = 28;
int img_size_flat = img_h * img_w; // 784, the total number of pixels
int n_classes = 10; // Number of classes, one class per digit
我们将编写自动加载MNIST数据的函数,并以我们想要的形状和格式返回它。有一个MNIST数据助手可以让操作更轻松。
数据集mnist;
public void PrepareData()
{
mnist = MnistDataSet.read_data_sets(“mnist”,one_hot:true);
}
除了加载图像和相应标签的功能外,我们还需要两个功能:
randomize:随机化图像及其标签的顺序。在每个epoch的开始,我们将重新随机化数据样本的顺序,以确保训练的模型对数据的顺序不敏感。
private(NDArray,NDArray)随机化(NDArray x,NDArray y)
{
var perm = np.random.permutation(y.shape [0]);
np.random.shuffle(烫发);
return(mnist.train.images [perm],mnist.train.labels [perm]);
}
get_next_batch:仅选择由batch_size变量确定的少量图像(根据Stochastic Gradient Descent方法)。
private(NDArray,NDArray)get_next_batch(NDArray x,NDArray y,int start,int end)
{
var x_batch = x [ “ s t