keras-01 安装和小试牛刀

由于tensorflow2.0即将发布在即,tensorflow2.0的核心机制为动态图和以tf.keras的模型级搭建方式,所以准备提前入门keras的学习和使用。

1.keras安装

1.安装anaconda:在anaconda源网站下载适合系统的安装文件,并进行安装。安装完成后新建虚拟环境conda create -name keras python=3.6
2.安装 tensorflow:由于实验室用的是p100服务器,因此我选用安装gpu版tensorflow conda install tensorflow-gpu
3.安装keras:keras安装比较方便,可以直接使用pip install安装,也可以下载源码进行编译。

2.keras小试牛刀

我们将从以下几个方面开始一个小的神经网络的搭建和训练,数据集用的是自定义的数据,本文从数据集制作,数据增广,模型搭建,模型训练,模型评估,模型可视化,模型保存展示用Keras如何入门深度学习。

2.1数据集制作

keras的模型输入为numpy数组,同时keras本身提供了两种数据加载的方式,一种是直接从文件夹中进行数据的读取,这需要对文件夹进行分类,同一文件夹下的图片属于同一个类。第二种是使用h5py文件进行数据制作和读取。这里我们分别展示如何制作数据集。我们使用的数据集是自己拍摄的台球图片,利用keras搭建神经网络进行分类。数据部分图片展示如下:
在这里插入图片描述

2.1.1 直接从文件夹中读取图片进行数据制作和获取

1.首先需要制作如下文件目录:

  • datasets
    • 1
      -picture_1.jpg
      -…
    • 2
    • 3
      在这里插入图片描述
      2.使用keras进行数据读取
      keras封装的组件非常丰富和便捷。我们在获取数据时,先构造一个ImageDataGenerator,用于数据的获取和增广。
keras.preprocessing.image.ImageDataGenerator(featurewise_center=False, 
                                             samplewise_center=False, 
                                             featurewise_std_normalization=False,
                                             samplewise_std_normalization=False, 
                                             zca_whitening=False,
                                             zca_epsilon=1e-06,
                                             rotation_range=0,
                                             width_shift_range=0.0,
                                             height_shift_range=0.0,
                                             brightness_range=None, 
                                             shear_range=0.0,
                                             zoom_range=0.0, 
                                             channel_shift_range=0.0,
                                             fill_mode='nearest', 
                                             cval=0.0, 
                                             horizontal_flip=False,
                                             vertical_flip=False, 
                                             rescale=None,
                                             preprocessing_function=None,
                                             data_format=None,
                                             validation_split=0.0,
                                             dtype=None)

这个类主要用于图像的预处理,参数非常多。官方文档说明如下:
在这里插入图片描述

ImageDataGenerator下面有三种函数可以用于数据读入,flow(),flow_from_dataframe,flow_from_directory,这里我们使用keras.preprocessing.image.ImageDataGenerator.flow_from_directory()这个函数。
这个函数的参数如下:

flow_from_directory(self, directory,
                            target_size=(256, 256), color_mode='rgb',
                            classes=None, class_mode='categorical',
                            batch_size=32, shuffle=True, seed=None,
                            save_to_dir=None,
                            save_prefix='',
                            save_format='jpeg',
                            follow_links=False)

官方文档中的函数描述如下:
在这里插入图片描述

from keras.preprocessing.image import ImageDataGenerator
#数据集路径
datasetdir = '/home/swx/balldetection/dataset'
#构建图像生成器
train_datagen = ImageDataGenerator(featurewise_center=True,
    featurewise_std_normalization=True,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True,
    rescale=1/255.0)
#从文件夹中获取数据
train_generator = train_datagen.flow_from_directory(
        datasetdir,
        target_size=(300, 300),
        batch_size=32,
        class_mode='categorical')

这样,我们就拿到了文件夹中的数据,这个数据会在训练的时候分批次加载经来。

2.1.2 从h5文件中读取数据
2.1.3 从csv文件中读取数据

2.2 模型搭建

keras搭建模型有两种方式,一种是Sequential模型,这种模型是一种单输入单输出的模型,适合用于做分类等简单的模型搭建,另一种是复杂的函数式模型,该类模型适合搭建复杂的网络模型。这里我们采用简单的序贯模型作为我们的整个模型搭建。keras模型相关的函数都在keras.model下面,这里我们先导入sequential

from keras.models import Sequential

然后我们开始搭建模型,最基本的网络模型是三层卷积神经网络,由三个卷积层加一个全连接层组成,我们先尝试三层网络的结果,然后再后期优化改进我们的模型。
keras是一个模型级别的封装,所以不同的网络层直接被封装成了类,可以直接再keras.layer中调用。在我们的这个网络模型中我们需要使用CONV2D,Dense,Pool,BatchNorm,Activation五种不同的网络层。

from keras.layers import Dense, Activation,Conv2D,BatchNormalization,MaxPool2D

我们构造的三层网络结构如下:

model = Sequential()
model.add(Conv2D(filters=64,kernel_size=(3,3),strides=(1,1),padding='SAME',input_shape=(300, 300, 3)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPool2D((2,2),strides=(2,2),padding='SAME'))
model.add(Conv2D(filters=128,kernel_size=(3,3),strides=(1,1),padding='SAME'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPool2D((2,2),strides=(2,2),padding='SAME'))
model.add(Conv2D(filters=256,kernel_size=(3,3),strides=(1,1),padding='SAME'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPool2D((2,2),strides=(2,2),padding='SAME'))
model.add(Flatten())
model.add(Dense(15,activation='softmax'))

keras实现了模型的打印和图片保存两种形式的可视化模型结构,我们这里使用模型图片保存。

plot_model(model,'model.png')

在这里插入图片描述

2.2 模型训练

keras的简便性在训练方面体现的非常的到位,我们可以直接使用fit(),train_on_batch()等方法进行训练。我们这里使用的是图片生成器,因此我们选用该函数:

fit_generator(generator,
 steps_per_epoch=None,
 epochs=1, verbose=1,
 callbacks=None, 
 validation_data=None,
 validation_steps=None,
 class_weight=None, 
 max_queue_size=10,
 workers=1,
 use_multiprocessing=False,
 shuffle=True,
 initial_epoch=0)

官方文档中该函数的参数说明如下:
在这里插入图片描述
但是,模型在训练之前得先定义loss,optimizers这些,因此,我们还需要在model训练之前先使用compile定义loss这些。我们这是一个多分类问题,因此我们选用如下设置:

model.compile(optimizer=Adam(lr=0.002), loss='categorical_crossentropy',
              metrics=[categorical_crossentropy, categorical_accuracy])

compile编译之后就可以进行训练了。

model.fit_generator(
    train_generator,
       steps_per_epoch=2000,
        epochs=50)

2.3 模型评估

我们在训练神经网络的时候,除了正常的Loss这些评估指标,可能还需要针对具体任务进行评估,因此keras.metric中集成了不同的评价指标,这里我们选用分类的loss和accurancy作为我们的评估指标。当然,如果我们想实现top-5等精度函数,还可以自定义组合评估指标,然后再监控的时候进行回调计算。

from keras.metrics import categorical_accuracy, top_k_categorical_accuracy, categorical_crossentropy
 def top_5_accuracy(self,y_true,y_pred):
        return top_k_categorical_accuracy(y_true, y_pred, k=5)

2.4 模型可视化

keras主要是基于后端的一个高层封装,因此可视化方面主要还是低端框架的可视化工具,这里我们用的是tensorflow的后端,因此我们可以很方便的使用tensorboard。而keras将模型可视化,模型保存这些操作均定义承了callback回调类,因此我们可以在keras.callback中找到tensorbard来进行显示。

keras.callbacks.TensorBoard(log_dir='./logs', 
histogram_freq=0, 
batch_size=32, 
write_graph=True, 
write_grads=False, 
write_images=False, 
embeddings_freq=0,
embeddings_layer_names=None, 
embeddings_metadata=None, 
embeddings_data=None, 
update_freq='epoch')

官方文档中该函数的说明如下:
在这里插入图片描述
我们可以直接这么调用:

from keras.callbacks import EarlyStopping, ReduceLROnPlateau,ModelCheckpoint,TensorBoard
tensorboard = TensorBoard(write_images=True,update_freq='batch')

而我们定义的tensorboard如何应用呢,这里我们是在模型训练的时候进行的回调

callback = [tensorboard]
model.fit_generator(
    train_generator,
       steps_per_epoch=2000,
        epochs=50,callbacks=callback)

2.5 模型保存

训练好的模型还需要之后再重复利用,因此模型保存是必不可少的,而keras在这方面也是做了不少的工作。keras提供了几种不同的模型保存方法,有直接保存权重,也有基于回调函数的ModelCheckpoint,因此这个根据最终的实际需求来定,这里我们选择直接保存模型的权重。

model.save_weights(filepath='./my_modelsavePath')

2.6 模型预测

训练好的模型可以直接预测新的数据,而keras在这方面直接封装了predict和predict_on_batch两种方式进行模型预测。

predict(x, batch_size=None, verbose=0, steps=None)
predict_on_batch(x)

2.7后记

整个代码如下:

from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Activation,Conv2D,BatchNormalization,MaxPool2D,Flatten
from keras.optimizers import Adam
from keras.metrics import categorical_accuracy, categorical_crossentropy
from keras.utils.vis_utils import plot_model
from keras.callbacks import EarlyStopping, ReduceLROnPlateau,ModelCheckpoint,TensorBoard
datasetdir = '/home/swx/balldetection/dataset/train'
train_datagen = ImageDataGenerator(featurewise_center=True,
    featurewise_std_normalization=True,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True,
    rescale=1/255.0)

train_generator = train_datagen.flow_from_directory(
        datasetdir,
        target_size=(300, 300),
        batch_size=32,
        class_mode='categorical')
model = Sequential()
model.add(Conv2D(filters=64,kernel_size=(3,3),strides=(1,1),padding='SAME',input_shape=(300, 300, 3)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPool2D((2,2),strides=(2,2),padding='SAME'))
model.add(Conv2D(filters=128,kernel_size=(3,3),strides=(1,1),padding='SAME'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPool2D((2,2),strides=(2,2),padding='SAME'))
model.add(Conv2D(filters=256,kernel_size=(3,3),strides=(1,1),padding='SAME'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPool2D((2,2),strides=(2,2),padding='SAME'))
model.add(Flatten())
model.add(Dense(15,activation='softmax'))
model.compile(optimizer=Adam(lr=0.002), loss='categorical_crossentropy',
              metrics=[categorical_crossentropy, categorical_accuracy])
print(model.summary())
plot_model(model,'model.png')
tensorboard = TensorBoard(write_images=True,update_freq='batch')
callback = [tensorboard]
model.fit_generator(
    train_generator,
       steps_per_epoch=2000,
        epochs=50,callbacks=callback)
model.save_weights(filepath='./my_modelsavePath')

这里,我只是简要的分享了我的入门keras的思路,后续我还会继续加上一些这次没写的内容,比如数据读取的另外的方式,模型训练过程的监控,比如loss不下降后如何及时停止等,如果你有任何问题和疑问,欢迎在下面评论区互相探讨,我的邮箱SFlyswx@outlook.com.

参考

keras英文文档
keras github

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值