1. 定义网络的基本参数

定义输入网络的是什么:

input = Input(shape=(240, 640, 3))

反向传播时梯度下降算法

SGD一定会收敛,但是速度慢
Adam速度快但是可能不收敛
[link](https://blog.csdn.net/wydbyxr/article/details/84822806)
sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
adam = optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)

学习率

lrate = LearningRateScheduler(step_decay)

其中step_decay函数是自动学习率算法

def step_decay(epoch):init_lrate = 0.001drop = 0.5epochs_drop = 10lrate = init_lrate * pow(drop, np.floor(1 + epoch) / epochs_drop)print('learning rate: ', lrate)return lrate

设置batch size

batch_size = 32 //一次丢给网络的数目

读入训练集和验证集

train_lines = []
val_lines = []
with open('data.txt') as file:lines = file.readlines()for line in lines:line = line.strip()line = line.split(' ')train_lines.append([line[0], line[1]])with open('val.txt') as file:lines = file.readlines()for line in lines:line = line.strip()line = line.split(' ')val_lines.append([line[0], line[1]])/*txt中是这样的:数字是第几类
moredata/1/001.png 1
moredata/1/002.png 1
moredata/1/003.png 2
moredata/1/004.png 3
moredata/1/005.png 4
moredata/1/006.png 1
moredata/1/007.png 1
moredata/1/008.png 1
moredata/1/009.png 1
……
*/

2. 定义网络结构

CNN

def cnn(input):**三层卷积层**conv1 = Conv2D(16, kernel_size=(3, 3), padding='same', activation='relu')(input)# conv1a = BatchNormalization()(conv1a) // BN层,防止飘移,过拟合conv1 = Conv2D(16, kernel_size=(3, 3), padding='same', activation='relu')(conv1)pool1 = MaxPooling2D((2, 2))(conv1)conv2 = Conv2D(32, kernel_size=(3, 3), padding='same', activation='relu')(pool1)# conv1a = BatchNormalization()(conv1a)conv2 = Conv2D(32, kernel_size=(3, 3), padding='same', activation='relu')(conv2)pool2 = MaxPooling2D((2, 2))(conv2)conv3 = Conv2D(32, kernel_size=(3, 3), padding='same', activation='relu')(pool2)# conv1a = BatchNormalization()(conv1a)conv3 = Conv2D(32, kernel_size=(3, 3), padding='same', activation='relu')(conv3)pool3 = MaxPooling2D((2, 2))(conv3)flatten = Flatten()(pool3) //拉成一列dense1 = Dense(1024, activation='relu')(flatten) //全连接层dense2 = Dense(3, activation='softmax')(dense1)model = Model(inputs=input, outputs=dense2)return model

Densenet

def dense(input):conv1a = Conv2D(16, kernel_size=(3, 3), padding='same', activation='relu')(input)# conv1a = BatchNormalization()(conv1a)conv1b = Conv2D(16, kernel_size=(3, 3), padding='same', activation='relu')(conv1a)# conv1b = BatchNormalization()(conv1b)merge1 = concatenate([conv1a, conv1b], axis=-1)pool1 = MaxPooling2D(pool_size=(2, 2))(merge1)conv2a = Conv2D(32, kernel_size=(3, 3), padding='same', activation='relu')(pool1)# conv2a = BatchNormalization()(conv2a)conv2b = Conv2D(32, kernel_size=(3, 3), padding='same', activation='relu')(conv2a)# conv2b = BatchNormalization()(conv2b)merge2 = concatenate([conv2a, conv2b], axis=-1)pool2 = MaxPooling2D(pool_size=(2, 2))(merge2)conv3a = Conv2D(64, kernel_size=(3, 3), padding='same', activation='relu')(pool2)# conv3a = BatchNormalization()(conv3a)conv3b = Conv2D(64, kernel_size=(3, 3), padding='same', activation='relu')(conv3a)# conv3b = BatchNormalization()(conv3b)merge3 = concatenate([conv3a, conv3b], axis=-1)pool3 = MaxPooling2D(pool_size=(2, 2))(merge3)conv4a = Conv2D(64, kernel_size=(3, 3), padding='same', activation='relu')(pool3)# conv4a = BatchNormalization()(conv4a)conv4b = Conv2D(64, kernel_size=(3, 3), padding='same', activation='relu')(conv4a)# conv4b = BatchNormalization()(conv4b)merge4 = concatenate([conv4a, conv4b], axis=-1)pool4 = MaxPooling2D(pool_size=(2, 2))(merge4)flatten = Flatten()(pool4)dense1 = Dense(128, activation='sigmoid')(flatten)dense2 = Dropout(0.25)(dense1)output = Dense(3, activation='softmax')(dense2)model = Model(inputs=input, outputs=output)return model

3. 开始训练吧

输入的参数也定义好了,网络结构也搭建好了,就可以训练了

调用网络

model = cnn(input)

记录网络的参数信息,保留模型的最佳参数,保存到h5文件

ck_name = 'training/cnn' + '.h5'
checkpoint = ModelCheckpoint(ck_name,monitor='val_acc', //val_acc 或 val_loss 或 acc 或 lossverbose=1, //0或1。为1表示输出epoch模型保存信息,默认为0表示不输出该信息save_best_only=True,//是否保存最佳模型mode='auto') //min max auto
history = model.fit_generator(generator=data_generator(train_lines, batch_size),steps_per_epoch=len(train_lines) // batch_size,epochs=100,verbose=2, //日志显示https://blog.csdn.net/Hodors/article/details/97500808callbacks=[lrate, checkpoint],validation_data=data_generator(val_lines, batch_size),validation_steps=len(val_lines) // batch_size)

记录网络结构保存成json文件

model_json = model.to_json()
with open(os.path.join('training/cnn.json'), 'w') as json_file:json_file.write(model_json)

运行网络

model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])
// categorical_crossentropy 交叉熵损失函数
// 梯度优化器是SGD
history = model.fit_generator(generator=data_generator(train_lines, batch_size),steps_per_epoch=len(train_lines) // batch_size,epochs=100,verbose=2,callbacks=[lrate, checkpoint],validation_data=data_generator(val_lines, batch_size),validation_steps=len(val_lines) // batch_size)

fit_generator是Python 生成器(或 Sequence 实例)逐批生成的数据,按批次训练模型
其中data_generator是自写的,主要是对输入图像或数据的处理

将图像分为2类,txt中标的是1, 2,3,4, 5。我们想让前3个是一类,后两个是一类,用的独热编码。每张图转换为灰度图,然后三张图叠在一起作为一张图,这有点类似于LSTM的思想,使其有时间序列
def data_generator(data_list, batch_size=32):get_one_hot = {'1': [1, 0, 0], '2': [1, 0, 0], '3': [1, 0, 0],'4': [0, 1, 0], '5': [0, 0, 1]}while True:for i in range(0, len(data_list) - 3, batch_size):labels = []images = []data_list_batch = data_list[i:i + batch_size + 3]# print(data_list_batch)for j in range(len(data_list_batch) - 3):# print(data_list_batch[j][0])images_3 = []image1 = cv2.imread(data_list_batch[j][0])image1 = image1[110:590, :, :]image1 = cv2.resize(image1, (240, 640))image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)image1 = (image1 - image1.min()) / (image1.max() - image1.min())image2 = cv2.imread(data_list_batch[j + 1][0])image2 = image2[110:590, :, :]image2 = cv2.resize(image2, (240, 640))image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)image2 = (image2 - image2.min()) / (image2.max() - image2.min())image3 = cv2.imread(data_list_batch[j + 2][0])image3 = image3[110:590, :, :]image3 = cv2.resize(image3, (240, 640))image3 = cv2.cvtColor(image3, cv2.COLOR_BGR2GRAY)image3 = (image3 - image3.min()) / (image3.max() - image3.min())images_3.append(image1)images_3.append(image2)images_3.append(image3)images_3 = np.asarray(images_3).reshape((image1.shape[0], image1.shape[1], 3))images.append(images_3)label = get_one_hot[data_list_batch[j + 2][1]]labels.append(label)images = np.asarray(images).reshape([len(data_list_batch) - 3, 240, 640, 3])labels = np.asarray(labels).reshape([len(data_list_batch) - 3, 3])yield images, labels

结束训练

4. 训练结果可视化

acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(acc) + 1)//画图
plt.figure()
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'r', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.savefig('training/accuary_cnn' + '.png')plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'r', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.savefig('training/loss_cnn' + '.png')

Code

from keras import backend as K
from keras.models import Model, Sequential
from keras.layers import Activation
from keras.layers import AveragePooling2D
from keras.layers import BatchNormalization
from keras.layers import Concatenate
from keras.layers import Conv2D, Dense, Dropout
from keras.layers import Dense, Add
from keras.layers import concatenate, LSTM
from keras.layers import GlobalAveragePooling2D
from keras.layers import GlobalMaxPooling2D
from keras.layers import Input, Flatten
from keras.layers import MaxPooling2D
import os
import matplotlib.pyplot as plt
from keras import regularizers, optimizers
import numpy as np
from keras.callbacks import ModelCheckpoint, LearningRateScheduler
import cv2def cnn(input):conv1 = Conv2D(16, kernel_size=(3, 3), padding='same', activation='relu')(input)# conv1a = BatchNormalization()(conv1a)conv1 = Conv2D(16, kernel_size=(3, 3), padding='same', activation='relu')(conv1)pool1 = MaxPooling2D((2, 2))(conv1)conv2 = Conv2D(32, kernel_size=(3, 3), padding='same', activation='relu')(pool1)# conv1a = BatchNormalization()(conv1a)conv2 = Conv2D(32, kernel_size=(3, 3), padding='same', activation='relu')(conv2)pool2 = MaxPooling2D((2, 2))(conv2)conv3 = Conv2D(32, kernel_size=(3, 3), padding='same', activation='relu')(pool2)# conv1a = BatchNormalization()(conv1a)conv3 = Conv2D(32, kernel_size=(3, 3), padding='same', activation='relu')(conv3)pool3 = MaxPooling2D((2, 2))(conv3)flatten = Flatten()(pool3)dense1 = Dense(1024, activation='relu')(flatten)dense2 = Dense(3, activation='softmax')(dense1)model = Model(inputs=input, outputs=dense2)return modeldef dense(input):# input = Input(shape=(128, 128, 3))conv1a = Conv2D(16, kernel_size=(3, 3), padding='same', activation='relu')(input)# conv1a = BatchNormalization()(conv1a)conv1b = Conv2D(16, kernel_size=(3, 3), padding='same', activation='relu')(conv1a)# conv1b = BatchNormalization()(conv1b)merge1 = concatenate([conv1a, conv1b], axis=-1)pool1 = MaxPooling2D(pool_size=(2, 2))(merge1)conv2a = Conv2D(32, kernel_size=(3, 3), padding='same', activation='relu')(pool1)# conv2a = BatchNormalization()(conv2a)conv2b = Conv2D(32, kernel_size=(3, 3), padding='same', activation='relu')(conv2a)# conv2b = BatchNormalization()(conv2b)merge2 = concatenate([conv2a, conv2b], axis=-1)pool2 = MaxPooling2D(pool_size=(2, 2))(merge2)conv3a = Conv2D(64, kernel_size=(3, 3), padding='same', activation='relu')(pool2)# conv3a = BatchNormalization()(conv3a)conv3b = Conv2D(64, kernel_size=(3, 3), padding='same', activation='relu')(conv3a)# conv3b = BatchNormalization()(conv3b)merge3 = concatenate([conv3a, conv3b], axis=-1)pool3 = MaxPooling2D(pool_size=(2, 2))(merge3)conv4a = Conv2D(64, kernel_size=(3, 3), padding='same', activation='relu')(pool3)# conv4a = BatchNormalization()(conv4a)conv4b = Conv2D(64, kernel_size=(3, 3), padding='same', activation='relu')(conv4a)# conv4b = BatchNormalization()(conv4b)merge4 = concatenate([conv4a, conv4b], axis=-1)pool4 = MaxPooling2D(pool_size=(2, 2))(merge4)flatten = Flatten()(pool4)dense1 = Dense(128, activation='sigmoid')(flatten)dense2 = Dropout(0.25)(dense1)output = Dense(3, activation='softmax')(dense2)model = Model(inputs=input, outputs=output)return modeldef data_generator(data_list, batch_size=32):get_one_hot = {'1': [1, 0, 0], '2': [1, 0, 0], '3': [1, 0, 0],'4': [0, 1, 0], '5': [0, 0, 1]}mini_img = 3while True:for i in range(0, len(data_list) - mini_img, batch_size):labels = []images = []data_list_batch = data_list[i:i + batch_size + mini_img]for j in range(len(data_list_batch) - mini_img):# print(data_list_batch[j][0])images_3 = []image1 = cv2.imread(data_list_batch[j][0])image1 = image1[110:590, :, :]image1 = cv2.resize(image1, (240, 640))image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)image1 = (image1 - image1.min()) / (image1.max() - image1.min())image2 = cv2.imread(data_list_batch[j + 1][0])image2 = image2[110:590, :, :]image2 = cv2.resize(image2, (240, 640))image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)image2 = (image2 - image2.min()) / (image2.max() - image2.min())image3 = cv2.imread(data_list_batch[j + 2][0])image3 = image3[110:590, :, :]image3 = cv2.resize(image3, (240, 640))image3 = cv2.cvtColor(image3, cv2.COLOR_BGR2GRAY)image3 = (image3 - image3.min()) / (image3.max() - image3.min())images_3.append(image1)images_3.append(image2)images_3.append(image3)images_3 = np.asarray(images_3).reshape((image1.shape[0], image1.shape[1], 3))images.append(images_3)label = get_one_hot[data_list_batch[j + 2][1]]labels.append(label)images = np.asarray(images).reshape([len(data_list_batch) - mini_img, 240, 640, 3])labels = np.asarray(labels).reshape([len(data_list_batch) - mini_img, mini_img])yield images, labelsdef step_decay(epoch):init_lrate = 0.001drop = 0.5epochs_drop = 10lrate = init_lrate * pow(drop, np.floor(1 + epoch) / epochs_drop)print('learning rate: ', lrate)return lrateinput = Input(shape=(240, 640, 3))
ck_name = 'training/cnn' + '.h5'
checkpoint = ModelCheckpoint(ck_name,monitor='val_acc',verbose=1,save_best_only=True,mode='auto')sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
adam = optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
lrate = LearningRateScheduler(step_decay)
batch_size = 32
train_lines = []
val_lines = []
with open('data.txt') as file:lines = file.readlines()for line in lines:line = line.strip()line = line.split(' ')train_lines.append([line[0], line[1]])with open('val.txt') as file:lines = file.readlines()for line in lines:line = line.strip()line = line.split(' ')val_lines.append([line[0], line[1]])
# print(train_lines[0])
# # model = dense(input)
# model = resnet(input)
model = cnn(input)model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])history = model.fit_generator(generator=data_generator(train_lines, batch_size),steps_per_epoch=len(train_lines) // batch_size,epochs=100,verbose=2,callbacks=[lrate, checkpoint],validation_data=data_generator(val_lines, batch_size),validation_steps=len(val_lines) // batch_size)
# for layer in model.layers:
#     layer.trainable = Truemodel_json = model.to_json()
with open(os.path.join('training/cnn.json'), 'w') as json_file:json_file.write(model_json)acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(acc) + 1)plt.figure()
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'r', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.savefig('training/accuary_cnn' + '.png')plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'r', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.savefig('training/loss_cnn' + '.png')

基于Keras的CNN/Densenet实现分类相关推荐

  1. CV:基于Keras利用CNN主流架构之mini_XCEPTION训练性别分类模型hdf5并保存到指定文件夹下

    CV:基于Keras利用CNN主流架构之mini_XCEPTION训练性别分类模型hdf5并保存到指定文件夹下 目录 图示过程 核心代码 图示过程 核心代码 from keras.callbacks ...

  2. CV:基于Keras利用CNN主流架构之mini_XCEPTION训练情感分类模型hdf5并保存到指定文件夹下

    CV:基于Keras利用CNN主流架构之mini_XCEPTION训练情感分类模型hdf5并保存到指定文件夹下 目录 图示过程 核心代码 图示过程 核心代码 def mini_XCEPTION(inp ...

  3. 基于Keras搭建CNN、TextCNN文本分类模型

    基于Keras搭建CNN.TextCNN文本分类模型 一.CNN 1.1 数据读取分词 1.2.数据编码 1.3 数据序列标准化 1.4 构建模型 1.5 模型验证 二.TextCNN文本分类 2.1 ...

  4. 基于keras的CNN图片分类模型的搭建以及参数调试

    基于keras的CNN图片分类模型的搭建与调参 更新一下这篇博客,因为最近在CNN调参方面取得了一些进展,顺便做一下总结. 我的项目目标是搭建一个可以分五类的卷积神经网络,然后我找了一些资料看了一些博 ...

  5. 基于Keras Application和Densenet迁移学习(transfer learning)的乳腺癌图像分类模型(良性、恶性)

    基于Keras Application和Densenet迁移学习(transfer learning)的乳腺癌图像分类模型(良性.恶性) 概论: 美国癌症学会官方期刊发表<2018年全球癌症统计 ...

  6. 基于卷积神经网络CNN的水果分类预测,卷积神经网络水果等级识别

    目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 卷积神经网络CNN水果分类预测 基本结构 主要参 ...

  7. 利用keras搭建CNN完成图片分类

    文章目录 一.简介 二.流程 1.数据处理 2.神经网络搭建 3.训练 4.预测 三.参考 一.简介 本文旨在通过一些简单的案例,学习如何通过keras搭建CNN.从数据读取,数据处理,神经网络搭建, ...

  8. 基于keras中IMDB的文本分类 demo

    本次demo主题是使用keras对IMDB影评进行文本分类: importtensorflow as tffrom tensorflow importkerasimportnumpy as nppri ...

  9. 基于卷积神经网络CNN的图片分类实现——附代码

    目录 摘要: 1.卷积神经网络介绍: 2.卷积神经网络(CNN)构建与训练: 2.1 CNN的输入图像 2.2 构建CNN网络 2.3 训练CNN网络 3.卷积神经网络(CNN)的实际分类测试: 4. ...

最新文章

  1. 汇编语言(王爽 第三版) ret retf总结 以及检测点10.1
  2. python pillow 图片处理
  3. 如何检查电脑是否安装了python-python-如何检查安装了scikit的nltk版本?
  4. 超图三维数据处理学习摘要1
  5. DFT实训教程笔记2(bibili版本)- Scan synthesis practice
  6. python商品总价_【Python基础 | 列表】小实验:实现显示商品,选择商品,将商品加入购物车,得到总价格...
  7. Java 入门课程视频实战-0基础 上线了,猜拳游戏,ATM实战,欢迎围观
  8. 使用Node.js 搭建静态服务器
  9. 手机chrome扫描二维码_90%的用户都不知道这项Chrome隐藏功能如何开启,超级实用!...
  10. aes ccm模式 java_AES_GCM和AES_CCM的选择
  11. 【百度大脑新品体验】行驶证识别
  12. oracle包与实体包,实体oracle数据库学习
  13. learn git branching
  14. 面试那些事儿- UI设计面试常见问题
  15. 实践出真知-神经网路篇-多任务学习
  16. NIN:Network in Network
  17. 在线硬盘存储计算机,硬盘存储
  18. mysql 唯一序列号_利用mysql生成唯一序号
  19. 为什么你的下一餐要交给机器人?
  20. 服务器 word pdf文件,XDOC 服务器.PDF

热门文章

  1. 机器学习工程师 - Udacity 可视化 CNN
  2. Go 学习笔记(23)— 并发(02)[竞争,锁资源,原子函数sync/atomic、互斥锁sync.Mutex]
  3. 深入分析jquery解析json数据
  4. Mongodb地理空间索引
  5. GitHub上整理的一些工具【转载】
  6. ACM1881 01背包问题应用
  7. android,与PHP通信,返回JSON
  8. php点击复制按钮到我的粘贴板,JS 实现点击按钮复制内容到粘贴板 clipboard
  9. 基于深度学习的口罩识别与检测PyTorch实现
  10. python求平方根的代码_Python求平方根(附带源码)