logo头像

猪老大要进步!

TensorFlow 1.x:keras训练卷积神经网络

本文于 1227 天之前发表,文中内容可能已经过时。

Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlowCNTK, 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。

如果你在以下情况下需要深度学习库,请使用 Keras:

  • 允许简单而快速的原型设计(由于用户友好,高度模块化,可扩展性)。
  • 同时支持卷积神经网络和循环神经网络,以及两者的组合。
  • 在 CPU 和 GPU 上无缝运行。

Keras的后台支持tensorflow和theno,看起来就像是一个非常正式的高级封装,非常有助于快速的开发。最近我也正从tensorflow的低级封装转到高级封装,没有别的原因,生命苦短。

本文将进行一个猫狗分类。

首先载入库

当然如果没有安装keras的要先安装一下哦,安装keras之前要保证自己的设备上已经有了tensorflow或者theno。

1
2
3
4
5
import numpy as npimport keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.optimizers import SGD

接着构建模型

这里构建模型超级简单,使用Sequential()新建之后再add就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
model = Sequential()
# 输入: 3 通道 32x32 像素图像 -> (32, 32, 3) 张量。
# 使用 32 个大小为 3x3 的卷积滤波器。
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(Conv2D(32, (3, 3),activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(2, activation='softmax'))

接下来读取训练数据

数据的预读取已经完成,详见神经网络训练–数据预读取和存储

训练数据一共是20对图片和标签,其中标签最好使用keras的to_categorical转化一下。我这里train_y原来就是0/1,shape是(20,1),经过转化之后,值变成了[1,0]/[0,1],shape变成了(20,2)。

1
2
3
4
5
# 直接读取之前存储的二进制文件
train_x = np.load("train_x.npy")
train_y = np.load("train_y.npy")
# 必须要把label搞一个to_categorical
train_y = keras.utils.to_categorical(train_y)

编译、训练

选用梯度下降法SGD,编译之后训练100个epoch。

1
2
3
4
5
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=["accuracy"])

his = model.fit(train_x, train_y, batch_size=10, epochs=100)
score = model.evaluate(train_x, train_y, batch_size=20)

过程可视化

将mode.fit的结果通过图像展示出来看看。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
l = np.array(his.history['loss'])
import matplotlib.pyplot as plt
step = np.linspace(1,100,100)
plt.plot(step,l,label="Train Loss")
plt.legend(loc='upper right')
plt.title('epoch-loss')
plt.xlim((0, 100))
plt.gca().set_ylim(bottom=0)
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

a = np.array(his.history['accuracy'])
plt.plot(step,a,label="Train Accuracy")
plt.legend(loc='lower right')
plt.title('epoch-acc')
plt.xlim((0, 100))
plt.ylim((0, 1.005))
plt.xlabel('epoch')
plt.ylabel('acc')plt.show()

[训练过程

参考资料:

1、Keras中文文档–开始使用 Keras Sequential 顺序模型

支付宝打赏 微信打赏

赞赏是不耍流氓的鼓励