用tensorflow一步步实现NAS
使用数据和前期准备
- 我们使用MNIST数据集,训练数据集有55000,测试集为10000.
模型
- 这个模型分为两个部分,一部分为控制器;一部分为我们要优化的网络。
- 控制器是带有NAS细胞和特殊的强化学习方法的的rnn tensorflow,用于训练和获得奖励。我们想用奖励最大化网络的精度以及训练控制器的提高精度。
- 训练器产生动作去修改CNN。包括修改每层的filters,kernel_size ,pool_size,dropout_rate per layer
实现
- 针对该控制器,建立了一种基于NASCell的策略网络方法。该网络将当前状态和最大搜索层数作为输入,并且输出新的操作更新网络。
- 为了使我们的参数可以微调,我们将代码放到强化类中。
- 要实例化这个类,我们需要传递以下参数
sess and optimizer----首先分别初始化这两个参数
policy_network----初始化方法
max_layers----最大层数
division_rate----每个神经元的正态分布值在-1.0到1.0之间
reg_param----归一化参数
exploration----随机产生动作的可能性 - 当然,我们还必须创建变量和placeholders,包括logits和gradient。为此,我们编写一个方法create_variables,在计算初始梯度后,我们启动梯度下降法。
- 强化学习的实现
首先梯度值乘以折扣奖励
定义了变量之后,我们应该在tensorflow图中初始化它,在__init__的末尾,每一个动作取决于之前的状态,但是有时候为了更有效地训练,我们可以生成随机动作来避免局部最小值。 - 在每个周期中,我们的网络能够产生一个动作,获得奖励然后采取一个训练步骤。训练步骤包括store_rollout以及train_step。
- 正如上述方法提及的,我们需要为每一个动作/状态定义一个奖励。这是通过生成一个新的CNN网络,每个动作都有新的架构,对其进行培训并评估其准确性来实现的。由于这个过程产生了很多CNN网络,让我们为它写一个管理器:
- 然后我们在“action”中为每一层创建了带有超参数的bathc,并为每一层创建了cnn_drop_rate - dropout rate列表。
- 这里我们用CNN类定义卷积神经模型。它可以是任何能够通过某种操作生成神经模型的类。
- 我们在TF图中创建一个分开的容器以防混乱。
- 在创建了一个新的CNN模型以后我们能够训练它并且得到一个奖励。
- 正如定义的,奖励提高了所有测试数据集的准确性。对于MNIST来说有10000个例子。
- 准备好所有东西以后我们开始训练MNIST。首先我们将优化层数的体系结构。设置层数的最大数为2。我们也可以将值设的更大,但是值越大将需要更多的计算力。
- 我们不确定应该向我们的策略网络提供什么。首先,我们总是尝试在每episode的RNN中输入1.0的数组,但是没有得到任何结果。然后,我们尝试在每episode中提供一个新状态,结果得到了一个很好的架构。我们得出结论,第一个状态可以是任何非零数组,为了加快找到合适的架构,我们设置了第一个状态:[[10.0,128.0,1.0,1.0]*args.max_layers]
- 每episode之后我们都会更新权重。否则,我们的计算就没有用了。这就是为什么我们的“批次大小”为加强= 1。经过100次循环,得到如下架构:
input layer : 784 nodes (MNIST images size)
first convolution layer : 61x24f
irst max-pooling layer: 60
second convolution layer : 57x55
second max-pooling layer: 59
output layer : 10 nodes (number of class for MNIST)
测试结果
- 我们用在MNIST数据及中表现还不错的手工设计网络来对比我们的NASNet
input layer : 784 nodes (MNIST images size)
first convolution layer : 5x32f
irst max-pooling layer: 2
second convolution layer : 5x64
second max-pooling layer: 2
output layer : 10 nodes (number of class for MNIST)
All weights were initialized by the Xavier algorithm. - 我们训练了10个epochs,得到NAS model的精确度是0.9987,手工的是0.963