网络思想:


1、一张原始图片被resize到(224,224,3);
2、使用步长为4x4,大小为11的卷积核对图像进行卷积,输出的特征层为96层, 输出的shape为(55,55,96);
3、使用步长为2的最大池化层进行池化,此时输出的shape为(27,27,96)
4、使用步长为1x1,大小为5的卷积核对图像进行卷积,输出的特征层为256层, 输出的shape为(27,27,256);
5、使用步长为2的最大池化层进行池化,此时输出的shape为(13,13,256);
6、使用步长为1x1,大小为3的卷积核对图像进行卷积,输出的特征层为384层, 输出的shape为(13,13,384);
7、使用步长为1x1,大小为3的卷积核对图像进行卷积,输出的特征层为384层, 输出的shape为(13,13,384);
8、使用步长为1x1,大小为3的卷积核对图像进行卷积,输出的特征层为256层, 输出的shape为(13,13,256);
9、使用步长为2的最大池化层进行池化,此时输出的shape为(6,6,256);
10、两个全连接层,最后输出为1000类

细节部分举例:

第一层
第一层输入数据为原始图像的2242243的图像,这个图像被11113(3代表 深度,例如RGB的3通道)的卷积核进行卷积运算,卷积核对原始图像的每次 卷积都会生成一个新的像素。 卷积核的步长为4个像素,朝着横向和纵向这两个方向进行卷积。 由此,会生成新的像素; 第一层有96个卷积核,所以就会形成555596个像素层。 pool池化层:这些像素层还需要经过pool运算(池化运算)的处理,池化运 算的尺度由预先设定为33,运算的步长为2,则池化后的图像的尺寸为: (55-3)/2+1=27。即经过池化处理过的规模为2727*96.

代码实现:

网络主体部分:(AlexNet.py)

from keras.models import Sequential
from keras.layers import Dense,Activation,Conv2D,MaxPooling2D,Flatten,Dropout,BatchNormalization
from keras.datasets import mnist
from keras.utils import np_utils
from keras.optimizers import Adam# 注意,为了加快收敛,我将每个卷积层的filter减半,全连接层减为1024
def AlexNet(input_shape=(224,224,3),output_shape=2):# AlexNetmodel = Sequential()# 使用步长为4x4,大小为11的卷积核对图像进行卷积,输出的特征层为96层,输出的shape为(55,55,96);# 所建模型后输出为48特征层model.add(Conv2D(filters=48, kernel_size=(11,11),strides=(4,4),padding='valid',input_shape=input_shape,activation='relu'))model.add(BatchNormalization())# 使用步长为2的最大池化层进行池化,此时输出的shape为(27,27,96)# 所建模型后输出为48特征层model.add(MaxPooling2D(pool_size=(3,3), strides=(2,2), padding='valid'))# 使用步长为1x1,大小为5的卷积核对图像进行卷积,输出的特征层为256层,输出的shape为(27,27,256);# 所建模型后输出为128特征层model.add(Conv2D(filters=128, kernel_size=(5,5), strides=(1,1), padding='same',activation='relu'))model.add(BatchNormalization())# 使用步长为2的最大池化层进行池化,此时输出的shape为(13,13,256);# 所建模型后输出为128特征层model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2),padding='valid'))# 使用步长为1x1,大小为3的卷积核对图像进行卷积,输出的特征层为384层,输出的shape为(13,13,384);# 所建模型后输出为192特征层model.add(Conv2D(filters=192, kernel_size=(3,3),strides=(1,1), padding='same', activation='relu')) # 使用步长为1x1,大小为3的卷积核对图像进行卷积,输出的特征层为384层,输出的shape为(13,13,384);# 所建模型后输出为192特征层model.add(Conv2D(filters=192, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu'))# 使用步长为1x1,大小为3的卷积核对图像进行卷积,输出的特征层为256层,输出的shape为(13,13,256);# 所建模型后输出为128特征层model.add(Conv2D(filters=128, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu'))# 使用步长为2的最大池化层进行池化,此时输出的shape为(6,6,256);# 所建模型后输出为128特征层model.add(MaxPooling2D(pool_size=(3,3), strides=(2,2), padding='valid'))# 两个全连接层,最后输出为1000类,这里改为2类(猫和狗)# 缩减为1024model.add(Flatten())model.add(Dense(1024, activation='relu'))model.add(Dropout(0.25))model.add(Dense(1024, activation='relu'))model.add(Dropout(0.25))model.add(Dense(output_shape, activation='softmax'))return model

图像预处理部分:(utils.py)

import matplotlib.image as mpimg
import numpy as np
import cv2
import tensorflow as tf
from tensorflow.python.ops import array_opsdef load_image(path):# 读取图片,rgbimg = mpimg.imread(path)# 将图片修剪成中心的正方形short_edge = min(img.shape[:2])yy = int((img.shape[0] - short_edge) / 2)xx = int((img.shape[1] - short_edge) / 2)crop_img = img[yy: yy + short_edge, xx: xx + short_edge]return crop_imgdef resize_image(image, size):with tf.name_scope('resize_image'):images = []for i in image:i = cv2.resize(i, size)images.append(i)images = np.array(images)return imagesdef print_answer(argmax):with open("./data/model/index_word.txt","r",encoding='utf-8') as f:synset = [l.split(";")[1][:-1] for l in f.readlines()]# print(synset[argmax])return synset[argmax]

训练部分:(train.py)

from keras.callbacks import TensorBoard, ModelCheckpoint, ReduceLROnPlateau, EarlyStopping
from keras.utils import np_utils
from keras.optimizers import Adam
from model.AlexNet import AlexNet
import numpy as np
import utils
import cv2
from keras import backend as K
#K.set_image_dim_ordering('tf')
K.image_data_format() == 'channels_first'def generate_arrays_from_file(lines,batch_size):# 获取总长度n = len(lines)i = 0while 1:X_train = []Y_train = []# 获取一个batch_size大小的数据for b in range(batch_size):if i==0:np.random.shuffle(lines)name = lines[i].split(';')[0]# 从文件中读取图像img = cv2.imread(r".\data\image\train" + '/' + name)img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)img = img/255X_train.append(img)Y_train.append(lines[i].split(';')[1])# 读完一个周期后重新开始i = (i+1) % n# 处理图像X_train = utils.resize_image(X_train,(224,224))X_train = X_train.reshape(-1,224,224,3)Y_train = np_utils.to_categorical(np.array(Y_train),num_classes= 2)   yield (X_train, Y_train)if __name__ == "__main__":# 模型保存的位置log_dir = "./logs/"# 打开数据集的txtwith open(r".\data\dataset.txt","r") as f:lines = f.readlines()# 打乱行,这个txt主要用于帮助读取数据来训练# 打乱的数据更有利于训练np.random.seed(10101)np.random.shuffle(lines)np.random.seed(None)# 90%用于训练,10%用于估计。num_val = int(len(lines)*0.1)num_train = len(lines) - num_val# 建立AlexNet模型model = AlexNet()# 保存的方式,3代保存一次checkpoint_period1 = ModelCheckpoint(log_dir + 'ep{epoch:03d}-loss{loss:.3f}-val_loss{val_loss:.3f}.h5',monitor='acc', save_weights_only=False, save_best_only=True, period=3)# 学习率下降的方式,acc三次不下降就下降学习率继续训练reduce_lr = ReduceLROnPlateau(monitor='acc', factor=0.5, patience=3, verbose=1)# 是否需要早停,当val_loss一直不下降的时候意味着模型基本训练完毕,可以停止early_stopping = EarlyStopping(monitor='val_loss', min_delta=0, patience=10, verbose=1)# 交叉熵model.compile(loss = 'categorical_crossentropy',optimizer = Adam(lr=1e-3),metrics = ['accuracy'])# 一次的训练集大小batch_size = 128print('Train on {} samples, val on {} samples, with batch size {}.'.format(num_train, num_val, batch_size))# 开始训练model.fit_generator(generate_arrays_from_file(lines[:num_train], batch_size),steps_per_epoch=max(1, num_train//batch_size),validation_data=generate_arrays_from_file(lines[num_train:], batch_size),validation_steps=max(1, num_val//batch_size),epochs=50,initial_epoch=0,callbacks=[checkpoint_period1, reduce_lr])model.save_weights(log_dir+'last1.h5')#保存模型

预测部分:(predict.py)

import numpy as np
import utils
import cv2
from keras import backend as K
from model.AlexNet import AlexNet# K.set_image_dim_ordering('tf')
K.image_data_format() == 'channels_first'if __name__ == "__main__":model = AlexNet()model.load_weights("./logs/last1.h5")img = cv2.imread("./test2.jpg")img_RGB = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)img_nor = img_RGB/255img_nor = np.expand_dims(img_nor,axis = 0)img_resize = utils.resize_image(img_nor,(224,224))#utils.print_answer(np.argmax(model.predict(img)))print('the answer is: ',utils.print_answer(np.argmax(model.predict(img_resize))))cv2.imshow("ooo",img)cv2.waitKey(0)

Keras框架:Alexnet网络代码实现相关推荐

  1. Keras框架:resent50代码实现

    Residual net概念 概念: Residual net(残差网络):将靠前若干层的某一层数据输出直接跳过多层引入到后面数据层的输入 部分. 残差神经单元:假定某段神经网络的输入是x,期望输出是 ...

  2. AlexNet网络的结构详解与实现

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一:AlexNet网络结构 在2012年ImageNet图像分类任 ...

  3. Keras框架:Mobilenet网络代码实现

    Mobilenet概念: MobileNet模型是Google针对手机等嵌入式设备提出的一种轻量级的深层神经网络,其使用的核心思想便是depthwise separable convolution. ...

  4. kaggle猫狗分类的总结(AlexNet模型, keras框架),完整实验流程,源代码和详细解析

    现在将已掌握的知识进行总结,方便以后自己写网络增加思路. 首先数据集下载:链接:https://pan.baidu.com/s/1U4N0PCNfyIP9iHLidVb9xA 提取码:vcvl ker ...

  5. 2_初学者快速掌握主流深度学习框架Tensorflow、Keras、Pytorch学习代码(20181211)

    初学者快速掌握主流深度学习框架Tensorflow.Keras.Pytorch学习代码 一.TensorFlow 1.资源地址: 2.资源介绍: 3.配置环境: 4.资源目录: 二.Keras 1.资 ...

  6. DL之DCGAN:基于keras框架利用深度卷积对抗网络DCGAN算法对MNIST数据集实现图像生成

    DL之DCGAN:基于keras框架利用深度卷积对抗网络DCGAN算法对MNIST数据集实现图像生成 目录 基于keras框架利用深度卷积对抗网络DCGAN算法对MNIST数据集实现图像生成 设计思路 ...

  7. Keras之TCN:基于keras框架利用时间卷积网络TCN算法对上海最高气温实现回归预测(把时间序列数据集转化为有监督学习数据集)案例

    Keras之TCN:基于keras框架利用时间卷积网络TCN算法对上海最高气温实现回归预测(把时间序列数据集转化为有监督学习数据集)案例 目录 利用时间卷积网络TCN算法对上海最高气温实现回归预测(把 ...

  8. 基于GNet网络和Keras框架实战眼底图像视杯视盘分割

    个人简介:李响Superb,CSDN百万访问量博主,普普通通男大学生,目前在读软件工程,计算机视觉.深度学习和医学图像处理专攻,偶尔也搞迁移学习和全栈开发. 博客地址:lixiang.blog.csd ...

  9. DL之Keras:基于Keras框架建立模型实现【预测】功能的简介、设计思路、案例分析、代码实现之详细攻略(经典,建议收藏)

    DL之Keras:基于Keras框架建立模型实现[预测]功能的简介.设计思路.案例分析.代码实现之详细攻略(经典,建议收藏) 目录 Keras框架使用分析 Keras框架设计思路 案例分析 代码实现 ...

最新文章

  1. 别动不动就画折线图了,教你4种酷炫可视化方法
  2. 10.LeetCode第九题--有效的数独--哈希表的经典应用
  3. 【错误记录】反射时调用方法及成员报错 ( 执行反射方法 | 设置反射的成员变量 | 设置方法/成员可见性 )
  4. boost::log::filter用法的测试程序
  5. kaggle使用笔记
  6. sql中的并、交、差
  7. vue lang_推荐一个基于Vue 的 H5 快速开发模板
  8. STM32----摸石头过河系列(五)
  9. java中equals和 == 的区别
  10. PHP 对象 多态性
  11. AD+邮件服务器搭建方案
  12. ROS2 Galactic Depth to World coordinate RGBD相机的深度数据转换到世界坐标系
  13. 内存管理机制和垃圾回收机制
  14. caxa图文档管理软件服务器,CAXA协同管理2018
  15. 摸索Detours 1:使用Vs2019 编译Detours
  16. coco2d-x 或者 creator 实现物体点击后的果冻效果
  17. Rap2接口管理工具搭建及版本升级
  18. Kaggle-泰坦尼克号-机器学习/数据挖掘学习笔记
  19. 服务器win10系统开机慢,win10专业版系统开机启动慢 三种方法帮你敲定
  20. 红外补光 vs白光补光

热门文章

  1. UVALive - 8512——线段树维护线性基
  2. 【Linux系统编程学习】 GDB调试器的简单使用
  3. 【汇编语言】数据类型的匹配问题:自动匹配与手动匹配
  4. 【Leetcode | 1】93. 复原IP地址
  5. css知识笔记(二)——盒子模型
  6. CRM、用户管理权限
  7. 解决新浪微博API调用限制 突破rate_limit_status瓶颈
  8. 使用labview读取一副位图,并进行BCG校准(或修改其BCG)程序解析
  9. 一个经典实例理解继承与多态原理与优点(附源码)---面向对象继承和多态性理解得不够深刻的同学请进...
  10. C# 调用python