用遗传算法自动设计CNN结构实现图像分类

auto-cnn的Python项目详细描述


汽车

本项目是论文"Automatically Designing CNN Architectures Using Genetic Algorithm for Image Classification"的一个实现

工作原理

CNN是一种能自动找到最佳卷积结构的神经网络(CNN)。在

该算法有两个主要组成部分:

跳过层

Skip Layer Image

每个跳跃层包括:

输入首先通过:

  1. 卷积层
  2. 批量标准化
  3. ReLU激活层
  4. 另一个卷积层
  5. 另一个批次标准化

(所有卷积层的核大小为3x3,步长为1x1,滤波器大小随机选择为2的幂次)

输入还通过核和步长1x1的卷积,滤波器大小与上一个卷积相同。 这将“重塑”输入,以便进行元素级添加

这两个输出在add操作中组合,然后通过ReLU激活函数传递

池层

这是一个最大池或平均池层,内核和步幅大小为2x2

Layer TypeLayer Documentation
Convolutiontf.keras.layers.Conv2D
MaxPoolingtf.keras.layers.MaxPool2D
AveragePoolingtf.keras.layers.AveragePooling2D
Activationtf.keras.layers.Activation
Addtf.keras.layers.add
BatchNormalizationtf.keras.layers.BatchNormalization

步骤

为此,算法遵循以下步骤:

  1. 创建随机初始总体
  2. 利用CNN训练对人群进行适应性评价
  3. 产生后代
    • 使用Binary Tournament Selection方法在人群中选择2个不同的CNN
    • 在一定的概率下,父母之间可能会发生杂交
      • 两个CNN被分成两个,两个新的CNN是通过混合母体“基因”而产生的 -在所有新的后代被创造出来之后,每一个都要经过它们,并且在一定的概率下使后代发生突变
      • 突变是:
        • 添加跳过层:增加网络的复杂性和深度
        • 添加池层:增加深度,但由于池的性质,可能会降低复杂性
        • 移除层:减少复杂性和深度
        • 随机化一个层:改变一个层的参数(即过滤器大小、最大值或平均值池)
  4. 评估后代的适应度
  5. 从后代和亲本群体中产生一个新的群体
    • 在选择N CNN之前:
      • 随机选择2个CNN,将适合度最高的那一个添加到列表中
    • 看看来自后代和父母群体的CNN是否被放在新的群体中
      • 如果不把最差的CNN换成最好的
  6. 重复步骤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()

考虑到这些参数,选择的结构如下:

MNIST Result

有线电视新闻网:128-64

得分(测试准确度):0.979900024795532

贡献

如果您对提高性能、添加更多自定义项或更正错误有任何想法,请发出请求或创建问题。我很乐意接受任何捐款!在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java类。getResource和ClassLoader。getSystemResource:有没有理由选择其中一个而不是另一个?   在Java中以编程方式粘贴后恢复剪贴板   Java字符串到日期没有时间   JavaSpring注释:@Component起作用,@Repository不起作用   java“addScript”在HSQL中是否有最大记录计数?   java如何将值从JDialog框返回到父JFrame?   java我的模块库的用户有没有办法访问尚未导出的类?   java javac:未找到命令   java如何解决jsoup错误:无法找到请求目标的有效证书路径   类中的java作用域变量   Java中集合实现中的arraylist add()方法不起作用   java如何使用while循环和从用户接收输入来近似Pi?   java Spring安全CSRF培训模式   在安卓系统中,如何通过在警报框外单击来限制用户?