NASNet

 

论文:Learning Transferable Architectures for Scalable Image Recognition

github:https://github.com/tensorflow/models/tree/master/research/slim/nets/nasnet

 

cvpr2017 google brain作品,利用强化学习,使用500块p100训练4天多得到的网络结构NASNet,不管在精度还是在速度上都超越了人工设计的经典结构。

 

论文贡献:

(1)设计了新的搜索空间,即NASNet search space,并在实验中搜索得到最优的网络结构NASNet

(2)提出新的正则化技术,ScheduledDropPath,是DropPath方法的改进版,可以大大提高了模型的泛化能力。

DropPath方法在训练过程中以随机概率p进行drop,该概率训练中保持不变。而ScheduledDropPath方法在训练过程线性的提高随机概率p。

 

文章类似resnet和inception一样,进行基本block的堆叠生成最终网络。因此搜索最优网络的时候,只搜索最优block。这样的好处,

(1)可以极大的加快搜索速度

(2)基础block对其他分类,检测问题都具有很好的泛化能力

 

网络整体结构:

上图分别为cifar-10和ImageNet的网络结构,由于cifar-10的网络输入为32*32,而ImageNet的网络输入为299*299,因此,ImageNet网络具有更多的模块堆叠,更大的深度。

网络结构中主要包含2个模块,Normal cell和Reduction cell。然后进行这2个模块的堆叠形成最终的网络。

 

搜索过程:

如上图所示,控制器RNN从搜索空间中以概率p预测网络结构A。worker单元,学习该网络直到收敛,并得到准确性R。最终将梯度p*R传递给RNN控制器进行梯度更新。

控制器依次搜索隐藏状态,隐藏状态,何种操作,何种操作,何种组合方法,这5个方法和操作的组合。其中,每种方法,每种操作都对应于一个softmax损失。这样重复B次,得到一个最终block模块。最终的损失函数就有5B个。实验中最优的B=5。

图右为根据图左得到的一个示例组合,与图左根据颜色一一对应。

其中,黄色的可选的操作包括上图所示的13种操作。

 

最终论文得到了3个网络结构,分别为NASNet-A,NASNet-B, NASNet-C。

NASNet-A

NASNet-B

NASNet-C

搜索策略:

文章进行了布鲁斯-随机搜索(RS)和强化学习(RL)的对比,得出强化学习(红色)可以获得比随机搜索(蓝色)更好的结果。

 

实验结果:

从图中可以看出,不管是乘-加计算量,还是参数量,NASNet都优于目前人工设计的网络结构。

 

总结:

(1)延续NAS论文的核心机制使得能够自动产生网络结构,AutoML以后将会是一个非常具有潜力的研究方向,google,第四范式等都有着方面的研究。

(2)采用resnet和Inception重复使用block结构思想。

(3)利用迁移学习将生成的网络迁移到大数据集上提出新的搜索空间NASNet。

(4)提出新的正则化技术ScheduledDropPath

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是可以在Jupyter上运行的使用NASnet模型训练CIFAR10数据集的代码示例。注意,由于NASnet模型较大,需要较长的时间进行训练,建议在GPU环境下运行。 首先,我们需要导入所需的库和模块: ``` python import tensorflow as tf from tensorflow.keras.datasets import cifar10 from tensorflow.keras.preprocessing.image import ImageDataGenerator from tensorflow.keras.utils import to_categorical from tensorflow.keras.applications.nasnet import NASNetMobile from tensorflow.keras.layers import Dense, GlobalAveragePooling2D from tensorflow.keras.models import Model ``` 接下来,我们需要加载CIFAR10数据集: ``` python (x_train, y_train), (x_test, y_test) = cifar10.load_data() ``` 然后,我们需要对数据进行预处理: ``` python # 将像素值归一化到0-1之间 x_train = x_train.astype('float32') / 255 x_test = x_test.astype('float32') / 255 # 将标签进行one-hot编码 y_train = to_categorical(y_train, num_classes=10) y_test = to_categorical(y_test, num_classes=10) ``` 接下来,我们需要定义NASnet模型: ``` python # 加载NASnet模型 base_model = NASNetMobile(weights='imagenet', include_top=False, input_shape=(32, 32, 3)) # 添加全局平均池化层和全连接层 x = base_model.output x = GlobalAveragePooling2D()(x) x = Dense(1024, activation='relu')(x) predictions = Dense(10, activation='softmax')(x) # 构建完整模型 model = Model(inputs=base_model.input, outputs=predictions) ``` 接下来,我们需要编译模型并开始训练: ``` python # 编译模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 数据增强 datagen = ImageDataGenerator( rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, horizontal_flip=True) # 开始训练 model.fit_generator(datagen.flow(x_train, y_train, batch_size=32), steps_per_epoch=len(x_train) / 32, epochs=10, validation_data=(x_test, y_test)) ``` 最后,我们可以使用测试集对模型进行评估: ``` python # 对测试集进行评估 score = model.evaluate(x_test, y_test, verbose=0) print("Test Loss: {:.3f}, Test Accuracy: {:.3f}".format(score[0], score[1])) ``` 希望这份代码能够帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值