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,用于数据的获取和增广。
- 1
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.