用遗传算法自动设计CNN结构实现图像分类
auto-cnn的Python项目详细描述
汽车
本项目是论文"Automatically Designing CNN Architectures Using Genetic Algorithm for Image Classification"的一个实现
工作原理
CNN是一种能自动找到最佳卷积结构的神经网络(CNN)。在
该算法有两个主要组成部分:
跳过层
每个跳跃层包括:
输入首先通过:
- 卷积层
- 批量标准化
- ReLU激活层
- 另一个卷积层
- 另一个批次标准化
(所有卷积层的核大小为3x3,步长为1x1,滤波器大小随机选择为2的幂次)
输入还通过核和步长1x1的卷积,滤波器大小与上一个卷积相同。 这将“重塑”输入,以便进行元素级添加
这两个输出在add操作中组合,然后通过ReLU激活函数传递
池层
这是一个最大池或平均池层,内核和步幅大小为2x2
层
Layer Type | Layer Documentation |
---|---|
Convolution | tf.keras.layers.Conv2D |
MaxPooling | tf.keras.layers.MaxPool2D |
AveragePooling | tf.keras.layers.AveragePooling2D |
Activation | tf.keras.layers.Activation |
Add | tf.keras.layers.add |
BatchNormalization | tf.keras.layers.BatchNormalization |
步骤
为此,算法遵循以下步骤:
- 创建随机初始总体
- 利用CNN训练对人群进行适应性评价
- 产生后代
- 使用Binary Tournament Selection方法在人群中选择2个不同的CNN
- 在一定的概率下,父母之间可能会发生杂交
- 两个CNN被分成两个,两个新的CNN是通过混合母体“基因”而产生的 -在所有新的后代被创造出来之后,每一个都要经过它们,并且在一定的概率下使后代发生突变
- 突变是:
- 添加跳过层:增加网络的复杂性和深度
- 添加池层:增加深度,但由于池的性质,可能会降低复杂性
- 移除层:减少复杂性和深度
- 随机化一个层:改变一个层的参数(即过滤器大小、最大值或平均值池)
- 评估后代的适应度
- 从后代和亲本群体中产生一个新的群体
- 在选择N CNN之前:
- 随机选择2个CNN,将适合度最高的那一个添加到列表中
- 看看来自后代和父母群体的CNN是否被放在新的群体中
- 如果不把最差的CNN换成最好的
- 在选择N CNN之前:
- 重复步骤2。在
示例
importosos.environ['TF_CPP_MIN_LOG_LEVEL']='3'# Removes Tensorflow debuggin ouputsimporttensorflowastftf.get_logger().setLevel('INFO')# Removes Tensorflow debugging ouputsfromauto_cnn.ganimportAutoCNNimportrandom# Sets the random seeds to make testing more consisentrandom.seed(42)tf.random.set_seed(42)defmnist_test():# Loads the data as test and train (x_train,y_train),(x_test,y_test)=tf.keras.datasets.mnist.load_data()# Puts the data in a dictionary for the algorithm to use data={'x_train':x_train,'y_train':y_train,'x_test':x_test,'y_test':y_test}# Sets the wanted parameters a=AutoCNN(population_size=5,maximal_generation_number=4,dataset=data,epoch_number=5)# Runs the algorithm until the maximal_generation_number has been reachedbest_cnn=a.run()print(best_cnn)if__name__=='__main__':mnist_test()
考虑到这些参数,选择的结构如下:
有线电视新闻网:128-64
得分(测试准确度):0.979900024795532
贡献
如果您对提高性能、添加更多自定义项或更正错误有任何想法,请发出请求或创建问题。我很乐意接受任何捐款!在
- 项目
标签: