Lenet神经网络实现

举报
小小谢先生 发表于 2022/04/15 23:23:32 2022/04/15
【摘要】 手写字体识别模型LeNet5诞生于1994年,是最早的卷积神经网络之一。LeNet5通过巧妙的设计,利用卷积、参数共享、池化等操作提取特征,避免了大量的计算成本,最后再使用全连接神经网络进行分类识别,这个网络也是最近大量神经网络架构的起点。虽然现在看来Lenet基本实际用处不大,而且架构现在基本也没人用了,但是可以作为神经网络架构的一个...

手写字体识别模型LeNet5诞生于1994年,是最早的卷积神经网络之一。LeNet5通过巧妙的设计,利用卷积、参数共享、池化等操作提取特征,避免了大量的计算成本,最后再使用全连接神经网络进行分类识别,这个网络也是最近大量神经网络架构的起点。虽然现在看来Lenet基本实际用处不大,而且架构现在基本也没人用了,但是可以作为神经网络架构的一个很好的入门基础。

Lenet神经网络架构图如下:

LeNet5由7层CNN(不包含输入层)组成,上图中输入的原始图像大小是32×32像素。下面分别介绍每一层的含义。

  • input: 在原始的架构中,神经网络的输入是一张 32*32的灰度图像,不过这里我们选用的dataset是cifar10,是RGB图像,也就是 (32*32*3),3表示通道是3通道,即RGB三颜色。
  • conv1: 第一层是一个卷积层啦,卷积核(kernel size)大小 5*5,步长(stride)为 1 ,不进行padding,所以刚才的输入图像,经过这层后会输出6张 28*28 的特征图(feature map)。
  • maxpooling2: 接下来是一个降采样层,用的是maxpooling哦,stride为 2 , kernel size为 2*2 ,恩,所以很明显subsampling之后,输出6张 14*14的feature map。
  • conv3: 第三层又是一个卷积层,kernel size和stride均与第一层相同,不过最后要输出16张feature map。
  • maxpooling4:第四层,恩,又是一个maxpooling。
  • fc5:对,第五层开始就是全连接(fully connected layer)层了,把第四层的feature map摊平,然后做最直白的举证运算,输入是120个结点。
  • fc6:输出是84个结点。
  • output:我们的dataset是cifar10,刚好也是10类哦,所以就是接一个softmax分成10类。

 

 下面是基于Keras的简单代码实现


  
  1. import keras
  2. import numpy as np
  3. from keras import optimizers
  4. from keras.datasets import cifar10
  5. from keras.models import Sequential
  6. from keras.layers import Conv2D, Dense, Flatten, MaxPooling2D
  7. from keras.callbacks import LearningRateScheduler, TensorBoard
  8. from keras.preprocessing.image import ImageDataGenerator
  9. from keras.regularizers import l2
  10. batch_size = 128
  11. epochs = 200
  12. iterations = 391
  13. num_classes = 10
  14. weight_decay = 0.0001
  15. mean = [125.307, 122.95, 113.865]
  16. std = [62.9932, 62.0887, 66.7048]
  17. def build_model():
  18. model = Sequential()
  19. model.add(Conv2D(6, (5, 5), padding='valid', activation = 'relu', kernel_initializer='he_normal', kernel_regularizer=l2(weight_decay), input_shape=(32,32,3)))
  20. model.add(MaxPooling2D((2, 2), strides=(2, 2)))
  21. model.add(Conv2D(16, (5, 5), padding='valid', activation = 'relu', kernel_initializer='he_normal', kernel_regularizer=l2(weight_decay)))
  22. model.add(MaxPooling2D((2, 2), strides=(2, 2)))
  23. model.add(Flatten())
  24. model.add(Dense(120, activation = 'relu', kernel_initializer='he_normal', kernel_regularizer=l2(weight_decay) ))
  25. model.add(Dense(84, activation = 'relu', kernel_initializer='he_normal', kernel_regularizer=l2(weight_decay) ))
  26. model.add(Dense(10, activation = 'softmax', kernel_initializer='he_normal', kernel_regularizer=l2(weight_decay) ))
  27. sgd = optimizers.SGD(lr=.1, momentum=0.9, nesterov=True)
  28. model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
  29. return model
  30. def scheduler(epoch):
  31. if epoch < 100:
  32. return 0.01
  33. if epoch < 150:
  34. return 0.005
  35. return 0.001
  36. if __name__ == '__main__':
  37. # load data
  38. (x_train, y_train), (x_test, y_test) = cifar10.load_data()
  39. y_train = keras.utils.to_categorical(y_train, num_classes)
  40. y_test = keras.utils.to_categorical(y_test, num_classes)
  41. x_train = x_train.astype('float32')
  42. x_test = x_test.astype('float32')
  43. # data preprocessing [raw - mean / std]
  44. for i in range(3):
  45. x_train[:,:,:,i] = (x_train[:,:,:,i] - mean[i]) / std[i]
  46. x_test[:,:,:,i] = (x_test[:,:,:,i] - mean[i]) / std[i]
  47. # build network
  48. model = build_model()
  49. print(model.summary())
  50. # set callback
  51. tb_cb = TensorBoard(log_dir='./lenet_dp_da_wd', histogram_freq=0)
  52. change_lr = LearningRateScheduler(scheduler)
  53. cbks = [change_lr,tb_cb]
  54. # using real-time data augmentation
  55. print('Using real-time data augmentation.')
  56. datagen = ImageDataGenerator(horizontal_flip=True,
  57. width_shift_range=0.125,height_shift_range=0.125,fill_mode='constant',cval=0.)
  58. datagen.fit(x_train)
  59. # start train
  60. model.fit_generator(datagen.flow(x_train, y_train,batch_size=batch_size),
  61. steps_per_epoch=iterations,
  62. epochs=epochs,
  63. callbacks=cbks,
  64. validation_data=(x_test, y_test))
  65. # save model
  66. model.save('lenet_dp_da_wd.h5')

 

文章来源: blog.csdn.net,作者:小小谢先生,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/xiewenrui1996/article/details/103016474

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。