TensorFlow 1.x:keras训练卷积神经网络
本文于
1227
天之前发表,文中内容可能已经过时。
Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow , CNTK , 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。
如果你在以下情况下需要深度学习库,请使用 Keras:
允许简单而快速的原型设计(由于用户友好,高度模块化,可扩展性)。
同时支持卷积神经网络和循环神经网络,以及两者的组合。
在 CPU 和 GPU 上无缝运行。
Keras的后台支持tensorflow和theno,看起来就像是一个非常正式的高级封装,非常有助于快速的开发。最近我也正从tensorflow的低级封装转到高级封装,没有别的原因,生命苦短。
本文将进行一个猫狗分类。
首先载入库 当然如果没有安装keras的要先安装一下哦,安装keras之前要保证自己的设备上已经有了tensorflow或者theno。
1 2 3 4 5 import numpy as npimport kerasfrom keras.models import Sequentialfrom keras.layers import Dense, Dropout, Flattenfrom keras.layers import Conv2D, MaxPooling2Dfrom 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" ) 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 pltstep = 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 顺序模型