logo资料库

Keras TensorFlow教程:如何从零开发一个复杂深度学习模型.pdf

第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
资料共17页,剩余部分请下载后查看
Keras 是提供⼀一些⾼高可⽤用的 Python API ,能帮助你快速的构建和训练⾃自⼰己的深度 学习模型,它的后端是 TensorFlow 或者 Theano 。本⽂文假设你已经熟悉了了 TensorFlow 和卷积神经⽹网络,如果,你还没有熟悉,那么可以先看看这个10分钟 ⼊入⻔门 TensorFlow 教程和卷积神经⽹网络教程,然后再回来阅读这个⽂文章。 在这个教程中,我们将学习以下⼏几个⽅方⾯面: 1. 为什什么选择 Keras?为什什么 Keras 被认为是深度学习的未来? 2. 在Ubuntu上⾯面⼀一步⼀一步安装Keras。 3. Keras TensorFlow教程:Keras基础知识。 4. 了了解 Keras 序列列模型 4.1 实际例例⼦子讲解线性回归问题 5. 使⽤用 Keras 保存和回复预训练的模型 6. Keras API 6.1 使⽤用Keras API开发VGG卷积神经⽹网络 6.2 使⽤用Keras API构建并运⾏行行SqueezeNet卷积神经⽹网络 1. 为什什么选择Keras? Keras 是 Google 的⼀一位⼯工程师 François Chollet 开发的⼀一个框架,可以帮助你在 Theano 上⾯面进⾏行行快速原型开发。后来,这被扩展为 TensorFlow 也可以作为后 端。并且最近,TensorFlow决定将其作为 contrib ⽂文件中的⼀一部分进⾏行行提供。 Keras 被认为是构建神经⽹网络的未来,以下是⼀一些它流⾏行行的原因: 1. 轻量量级和快速开发:Keras 的⽬目的是在消除样板代码。⼏几⾏行行 Keras 代码就 能⽐比原⽣生的 TensorFlow 代码实现更更多的功能。你也可以很轻松的实现 CNN 和 RNN,并且让它们运⾏行行在 CPU 或者 GPU 上⾯面。 2. 框架的“赢者”:Keras 是⼀一个API,运⾏行行在别的深度学习框架上⾯面。这个框 架可以是 TensorFlow 或者 Theano。Microsoft 也计划让 CNTK 作为 Keras 的⼀一个后端。⽬目前,神经⽹网络框架世界是⾮非常分散的,并且发展⾮非常快。具 体,你可以看看 Karpathy 的这个推⽂文:
想象⼀一下,我们每年年都要去学习⼀一个新的框架,这是多么的痛苦。到⽬目前为⽌止, TensorFlow 似乎成为了了⼀一种潮流,并且越来越多的框架开始为 Keras 提供⽀支持, 它可能会成为⼀一种标准。 ⽬目前,Keras 是成⻓长最快的⼀一种深度学习框架。因为可以使⽤用不不同的深度学习框架 作为后端,这也使得它成为了了流⾏行行的⼀一个很⼤大的原因。你可以设想这样⼀一个场 景,如果你阅读到了了⼀一篇很有趣的论⽂文,并且你想在你⾃自⼰己的数据集上⾯面测试这 个模型。让我们再次假设,你对TensorFlow ⾮非常熟悉,但是对Theano了了解的⾮非 常少。那么,你必须使⽤用TensorFlow 对这个论⽂文进⾏行行复现,但是这个周期是⾮非常 ⻓长的。但是,如果现在代码是采⽤用Keras写的,那么你只要将后端修改为 TensorFlow就可以使⽤用代码了了。这将是对社区发展的⼀一个巨⼤大的推动作⽤用。 2. 怎么安装Keras,并且把TensorFlow作为后 端 a) 依赖安装 安装 h5py,⽤用于模型的保存和载⼊入: pip install h5py 还有⼀一些依赖包也要安装。 pip install numpy scipy pip install pillow 如果你还没有安装TensorFlow,那么你可以按照这个教程先去安装TensorFlow。 ⼀一旦,你安装完成了了 TensorFlow,你只需要使⽤用 pip 很容易易的安装 Keras。
sudo pip install keras 使⽤用以下命令来查看 Keras 版本。 >>> import keras Using TensorFlow backend. >>> keras.__version__ '2.0.4' ⼀一旦,Keras 被安装完成,你需要去修改后端⽂文件,也就是去确定,你需要 TensorFlow 作为后端,还是 Theano 作为后端,修改的配置⽂文件位于 ~/.keras/keras.json 。具体配置如下: { "floatx": "float32", "epsilon": 1e-07, "backend": "tensorflow", "image_data_format": "channels_last" } 请注意,参数 image_data_format 是 channels_last ,也就是说这个后端 是 TensorFlow。因为,在TensorFlow中图像的存储⽅方式是[height, width, channels],但是在Theano中是完全不不同的,也就是 [channels, height, width]。因此,如果你没有正确的设置这个参数,那么你模型的中间结果将是⾮非 常奇怪的。对于Theano来说,这个参数就是channels_first。 那么,⾄至此你已经准备好了了,使⽤用Keras来构建模型,并且把TensorFlow作为后 端。 3. Keras基础知识 在Keras中主要的数据结构是 model ,该结构定义了了⼀一个完整的图。你可以向已 经存在的图中加⼊入任何的⽹网络结构。 import keras Keras 有两种不不同的建模⽅方式: 1. 1. Sequential models:这种⽅方法⽤用于实现⼀一些简单的模型。你只需要向⼀一 些存在的模型中添加层就⾏行行了了。 2. 2. Functional API:Keras的API是⾮非常强⼤大的,你可以利利⽤用这些API来构造 更更加复杂的模型,⽐比如多输出模型,有向⽆无环图等等。 在本⽂文的下⼀一节中,我们将学习Keras的Sequential models 和 Functional API的 理理论和实例例。
4. Keras Sequential models 在这⼀一部分中,我将来介绍Keras Sequential models的理理论。我将快速的解释它 是如何⼯工作的,还会利利⽤用具体代码来解释。之后,我们将解决⼀一个简单的线性回 归问题,你可以在阅读的同时运⾏行行代码,来加深印象。 以下代码是如何开始导⼊入和构建序列列模型。 from keras.models import Sequential models = Sequential() 接下来我们可以向模型中添加 Dense(full connected layer),Activation, Conv2D,MaxPooling2D函数。 from keras.layers import Dense, Activation, Conv2D, MaxPooling2D, Flatten, Dropout model.add(Conv2D(64, (3,3), activation='relu', input_shape = (100,100,32))) # This ads a Convolutional layer with 64 filters of size 3 * 3 to the graph 以下是如何将⼀一些最流⾏行行的图层添加到⽹网络中。我已经在卷积神经⽹网络教程中写 了了很多关于图层的描述。 1. 卷积层 这⾥里里我们使⽤用⼀一个卷积层,64个卷积核,维度是33的,之后采⽤用 relu 激活函数 进⾏行行激活,输⼊入数据的维度是 `100100*32`。注意,如果是第⼀一个卷积层,那么 必须加上输⼊入数据的维度,后⾯面⼏几个这个参数可以省略略。 model.add(Conv2D(64, (3,3), activation='relu', input_shape = (100,100,32))) 2. MaxPooling 层 指定图层的类型,并且指定⾚赤的⼤大⼩小,然后⾃自动完成⾚赤化操作,酷毙了了! model.add(MaxPooling2D(pool_size=(2,2))) 3. 全连接层 这个层在 Keras 中称为被称之为 Dense 层,我们只需要设置输出层的维度,然后 Keras就会帮助我们⾃自动完成了了。 model.add(Dense(256, activation='relu')) 4. Dropout model.add(Dropout(0.5)) 5. 扁平层
model.add(Flatten()) 数据输⼊入 ⽹网络的第⼀一层需要读⼊入训练数据。因此我们需要去制定输⼊入数据的维度。因 此,input_shape参数被⽤用于制定输⼊入数据的维度⼤大⼩小。 model.add(Conv2D(32, (3,3), activation='relu', input_shape= (224, 224, 3))) 在这个例例⼦子中,数据输⼊入的第⼀一层是⼀一个卷积层,输⼊入数据的⼤大⼩小是 224*224*3 。 以上操作就帮助你利利⽤用序列列模型构建了了⼀一个模型。接下来,让我们学习最重要的 ⼀一个部分。⼀一旦你指定了了⼀一个⽹网络架构,你还需要指定优化器器和损失函数。我们 在Keras中使⽤用compile函数来达到这个功能。⽐比如,在下⾯面的代码中,我们使⽤用 rmsprop 来作为优化器器,binary_crossentropy 来作为损失函数值。 model.compile(loss='binary_crossentropy', optimizer='rmsprop') 如果你想要使⽤用随机梯度下降,那么你需要选择合适的初始值和超参数: from keras.optimizers import SGD sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss='categorical_crossentropy', optimizer=sgd) 现在,我们已经构建完了了模型。接下来,让我们向模型中输⼊入数据,在Keras中是 通过 fit 函数来实现的。你也可以在该函数中指定 batch_size 和 epochs 来训 练。 model.fit(x_train, y_train, batch_size = 32, epochs = 10, validation_data(x_val, y_val)) 最后,我们使⽤用 evaluate 函数来测试模型的性能。 score = model.evaluate(x_test, y_test, batch_size = 32) 这些就是使⽤用序列列模型在Keras中构建神经⽹网络的具体操作步骤。现在,我们来构 建⼀一个简单的线性回归模型。 4.1 实际例例⼦子讲解线性回归问题 问题陈述 在线性回归问题中,你可以得到很多的数据点,然后你需要使⽤用⼀一条直线去拟合 这些离散点。在这个例例⼦子中,我们创建了了100个离散点,然后⽤用⼀一条直线去拟合它 们。
a) 创建训练数据 TrainX 的数据范围是 -1 到 1,TrainY 与 TrainX 的关系是3倍,并且我们加⼊入了了⼀一 些噪声点。 import keras from keras.models import Sequential from keras.layers import Dense import numpy as np trX = np.linspace(-1, 1, 101) trY = 3 * trX + np.random.randn(*trX.shape) * 0.33 b) 构建模型 ⾸首先我们需要构建⼀一个序列列模型。我们需要的只是⼀一个简单的链接,因此我们只 需要使⽤用⼀一个 Dense 层就够了了,然后⽤用线性函数进⾏行行激活。 model = Sequential() model.add(Dense(input_dim=1, output_dim=1, init='uniform', activation='linear')) 下⾯面的代码将设置输⼊入数据 x,权重 w 和偏置项 b。然我们来看看具体的初始化 ⼯工作。如下: weights = model.layers[0].get_weights() w_init = weights[0][0][0] b_init = weights[1][0] print('Linear regression model is initialized with weights w: %.2f, b: %.2f' % (w_init, b_init)) ## Linear regression model is initialized with weight w: -0.03, b: 0.00 现在,我们可以l利利⽤用⾃自⼰己构造的数据 trX 和 trY 来训练这个线性模型,其中 trY 是 trX 的3倍。因此,权重 w 的值应该是 3。 我们使⽤用简单的梯度下降来作为优化器器,均⽅方误差(MSE)作为损失值。如下: model.compile(optimizer='sgd', loss='mse') 最后,我们使⽤用 fit 函数来输⼊入数据。 model.fit(trX, trY, nb_epoch=200, verbose=1) 在经过训练之后,我们再次打印权重: weights = model.layers[0].get_weights() w_final = weights[0][0][0]
b_final = weights[1][0] print('Linear regression model is trained to have weight w: %.2f, b: %.2f' % (w_final, b_final)) ##Linear regression model is trained to have weight w: 2.94, b: 0.08 正如你所看到的,在运⾏行行 200 轮之后,现在权重⾮非常接近于 3。你可以将运⾏行行的 轮数修改为区间 [100, 300] 之间,然后观察输出结构有什什么变化。现在,你已经 学会了了利利⽤用很少的代码来构建⼀一个线性回归模型,如果要构建⼀一个相同的模型, 在 TensorFlow 中需要⽤用到更更多的代码。 5. 使⽤用 Keras 保存和回复预训练的模型 HDF5 ⼆二进制格式 ⼀一旦你利利⽤用Keras完成了了训练,你可以将你的⽹网络保存在HDF5⾥里里⾯面。当然,你需 要先安装 h5py。HDF5 格式⾮非常适合存储⼤大量量的数字收,并从 numpy 处理理这些 数据。⽐比如,我们可以轻松的将存储在磁盘上的多TB数据集进⾏行行切⽚片,就好像他 们是真正的 numpy 数组⼀一样。你还可以将多个数据集存储在单个⽂文件中,遍历他 们或者查看 .shape 和 .dtype 属性。 如果你需要信⼼心,那么告诉你,NASA也在使⽤用 HDF5 进⾏行行数据存储。h5py 是 python对HDF5 C API 的封装。⼏几乎你可以⽤用C在HDF5上⾯面进⾏行行的任何操作都可 以⽤用python在h5py上⾯面操作。 保存权重 如果你要保存训练好的权重,那么你可以直接使⽤用 save_weights 函数。 model.save_weights("my_model.h5") 载⼊入预训练权重 如果你想要载⼊入以前训练好的模型,那么你可以使⽤用 load_weights 函数。 model.load_weights('my_model_weights.h5') 6. Keras API 如果对于简单的模型和问题,那么序列列模型是⾮非常好的⽅方式。但是如果你要构建 ⼀一个现实世界中复杂的⽹网络,那么你就需要知道⼀一些功能性的API,在很多流⾏行行的 神经⽹网络中,我们都有⼀一个最⼩小的⽹网络结构,完整的模型是根据这些最⼩小的模型 进⾏行行叠加完成的。这些基础的API可以让你⼀一层⼀一层的构建模型。因此,你只需要 很少的代码就可以来构建⼀一个完整的复杂神经⽹网络。
让我们来看看它是如何⼯工作的。⾸首先,你需要导⼊入⼀一些包。 from keras.models import Model 现在,你需要去指定输⼊入数据,⽽而不不是在顺序模型中,在最后的 fit 函数中输⼊入数 据。这是序列列模型和这些功能性的API之间最显著的区别之⼀一。我们使⽤用 input() 函数来申明⼀一个 1*28*28 的张量量。 from keras.layers import Input ## First, define the vision modules digit_input = Input(shape=(1, 28, 28)) 现在,让我们来利利⽤用API设计⼀一个卷积层,我们需要指定要在在哪个层使⽤用卷积⽹网 络,具体代码这样操作: x = Conv2D(64, (3, 3))(digit_input) x = Conv2D(64, (3, 3))(x) x = MaxPooling2D((2, 2))(x) out = Flatten()(x) 最后,我们对于指定的输⼊入和输出数据来构建⼀一个模型。 vision_model = Model(digit_input, out) 当然,我们还需要指定损失函数,优化器器等等。但这些和我们在序列列模型中的操 作⼀一样,你可以使⽤用 fit 函数和 compile 函数来进⾏行行操作。 接下来,让我们来构建⼀一个vgg-16模型,这是⼀一个很⼤大很“⽼老老”的模型,但是由于 它的简洁性,它是⼀一个很好的学习模型。 6.1 使⽤用Keras API开发VGG卷积神经⽹网络 VGG: VGG卷积神经⽹网络是⽜牛津⼤大学在2014年年提出来的模型。当这个模型被提出时,由 于它的简洁性和实⽤用性,⻢马上成为了了当时最流⾏行行的卷积神经⽹网络模型。它在图像 分类和⽬目标检测任务中都表现出⾮非常好的结果。在2014年年的ILSVRC⽐比赛中, VGG 在Top-5中取得了了92.3%的正确率。 该模型有⼀一些变种,其中最受欢迎的当 然是 vgg-16,这是⼀一个拥有16层的模型。你可以看到它需要维度是 224*224*3 的输⼊入数据。
分享到:
收藏