📜  CNTK-神经网络(NN)概念(1)

📅  最后修改于: 2023-12-03 15:30:02.104000             🧑  作者: Mango

CNTK-神经网络(NN)概念

Microsoft Cognitive Toolkit(CNTK)是一个用于快速搭建深度学习模型的开源深度学习框架。CNTK 提供了一组用于构建神经网络并训练模型的强大工具。

神经网络(NN)是什么?

神经网络是由大量的人工神经元相互连接的网络,每个神经元都可以进行数学运算,一直到输出端。这些运算结合了输入数据,并为其提供了逐步的模式识别和学习。就像我们的大脑一样,神经网络通过精细的学习过程,通过反馈和调整预测来改进和优化对数据的表征。

CNTK如何构建NN?

CNTK提供了支持不同类型的神经网络的模块,包括卷积神经网络(CNN), 循环神经网络(RNN),递归神经网络(Recurrent NN)等,并提供了多种不同类型的层,使我们可以自定义我们的神经网络:

  • 全连接层(Dense layer)
  • 卷积层(Convolution layer)
  • 池化层(Pooling layer)
  • 循环层(RNN layer)
  • LSTM层(Long Short-Term Memory layer)
  • Dropout层(Dropout layer)

我们可以根据自己的需求和数据类型,来选择适合的层类型和组合,构建自己的神经网络。

CNTK如何训练NN?

构建好神经网络之后,就需要对其进行训练。CNTK提供了用于训练模型,调整超参数和优化模型的优化器,包括随机梯度下降(SGD),Nesterov 加速梯度(NAG),Adam,自适应梯度(AdaGrad)和自适应矩估计(Adamax)。

使用CNTK训练神经网络有两个步骤:

  1. 步骤一:定义一个损失函数。(这个通常称为目标函数)。
  2. 步骤二:利用优化器最小化损失函数。

这些步骤可以在一个单独的 Python 脚本中组成,逐步改进模型,并使用 CNTK 的工具检查模型的性能。以下是一个简单的MNIST图像分类样例:

#导入相应库
import cntk
from cntk.layers import Dense, Sequential
from cntk.logging import ProgressPrinter
from cntk.initializer import glorot_uniform

#构建全连接神经网络
def create_model(input, num_output_classes):
    with cntk.layers.default_options(init=glorot_uniform()):
        net = input
        net = Sequential([Dense(128, activation=cntk.relu),
                          Dense(64, activation=cntk.relu),
                          Dense(num_output_classes)])(net)
    return net

#创建损失函数和优化器
def create_criterion_and_optimizer(model, labels):
    loss = cntk.cross_entropy_with_softmax(model, labels)
    #设置超参数
    lr_schedule = cntk.learning_rate_schedule(0.2, cntk.UnitType.minibatch)
    m_schedule = cntk.momentum_schedule(0.92)
    #构建优化器
    learner = cntk.momentum_sgd(model.parameters, lr_schedule, m_schedule)
    trainer = cntk.Trainer(model, (loss, cntk.metric.accuracy(labels, model)), [learner])
    return loss, trainer

#定义输入和标签形状
input_shape=(28,28) #MNIST图片大小为28*28
num_output_classes=10  #MNIST数据集有10个类别
input = cntk.input_variable(input_shape)
labels = cntk.input_variable(num_output_classes)

#构建神经网络
nn = create_model(input, num_output_classes)

#定义损失函数和优化器
loss, trainer = create_criterion_and_optimizer(nn, labels)

#读入MNIST数据并训练神经网络
image_data = 'mnist/train-images-idx3-ubyte'
label_data = 'mnist/train-labels-idx1-ubyte'
reader_train = create_reader(image_data, label_data, True)
input_map = {input : reader_train.streams.features, labels : reader_train.streams.labels}
trainer.train_minibatch(input_map)

#测试神经网络
image_data = 'mnist/t10k-images-idx3-ubyte'
label_data = 'mnist/t10k-labels-idx1-ubyte'
reader_test = create_reader(image_data, label_data, False)
input_map = {input : reader_test.streams.features, labels : reader_test.streams.labels}
print(trainer.test_minibatch(input_map))

在这个样例中,我们使用CNTK提供的帮助函数,读取MNIST数据集并训练模型。我们首先定义了输入和标签的形状,然后构建了一个包含三个隐层(第一层128个节点,第二层64个节点,最后一层输出10个类别)的全连接神经网络。接下来,我们定义了损失函数和优化器,并使用MNIST数据集来对神经网络进行训练和测试。