永发信息网

如何从零开发一个复杂深度学习模型

答案:1  悬赏:0  手机版
解决时间 2021-02-21 12:42
如何从零开发一个复杂深度学习模型
最佳答案



Keras 是提供一些高可用的 Python API ,能帮助你快速的构建和训练自己的深度学习模型,它的后端是 TensorFlow 或者 Theano 。本文假设你已经熟悉了 TensorFlow 和卷积神经网络,如果,你还没有熟悉,那么可以先看看这个10分钟入门 TensorFlow 教程和卷积神经网络教程,然后再回来阅读这个文章。
在这个教程中,我们将学习以下几个方面:
为什么选择 Keras?为什么 Keras 被认为是深度学习的未来?
在Ubuntu上面一步一步安装Keras。
Keras TensorFlow教程:Keras基础知识。
了解 Keras 序列模型
4.1 实际例子讲解线性回归问题
使用 Keras 保存和回复预训练的模型
Keras API
6.1 使用Keras API开发VGG卷积神经网络
6.2 使用Keras API构建并运行SqueezeNet卷积神经网络
1. 为什么选择Keras?
Keras 是 Google 的一位工程师François Chollet 开发的一个框架,可以帮助你在 Theano 上面进行快速原型开发。后来,这被扩展为 TensorFlow 也可以作为后端。并且最近,TensorFlow决定将其作为 contrib 文件中的一部分进行提供。
Keras 被认为是构建神经网络的未来,以下是一些它流行的原因:
轻量级和快速开发:Keras 的目的是在消除样板代码。几行 Keras 代码就能比原生的 TensorFlow 代码实现更多的功能。你也可以很轻松的实现 CNN 和 RNN,并且让它们运行在 CPU 或者 GPU 上面。
框架的“赢者”: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 有两种不同的建模方式:
Sequential models:这种方法用于实现一些简单的模型。你只需要向一些存在的模型中添加层就行了。
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
以下是如何将一些最流行的图层添加到网络中。我已经在卷积神经网络教程中写了很多关于图层的描述。
卷积层
这里我们使用一个卷积层,64个卷积核,维度是33的,之后采用 relu 激活函数进行激活,输入数据的维度是 `100100*32`。注意,如果是第一个卷积层,那么必须加上输入数据的维度,后面几个这个参数可以省略。
model.add(Conv2D(64, (3,3), activation='relu', input_shape = (100,100,32)))
MaxPooling 层
指定图层的类型,并且指定赤的大小,然后自动完成赤化操作,酷毙了!
model.add(MaxPooling2D(pool_size=(2,2)))
全连接层
这个层在 Keras 中称为被称之为 Dense 层,我们只需要设置输出层的维度,然后Keras就会帮助我们自动完成了。
model.add(Dense(256, activation='relu'))
Dropout
model.add(Dropout(0.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上面操作。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
茜朵咖啡西餐地址在什么地方,想过去办事
有关核酸的叙述错误的是BA.真核细胞的DNA.分
烟墩村村地址在哪,我要去那里办事
直销银行与腾讯的前海微众银行阿里巴巴的网商
镇江市丹阳地税局第六税务分局地址在哪,我要
下列不属于人力资源管理需要关注的主要风险的
朝阳银行北票新鑫支行怎么去啊,有知道地址的
醉馆休闲吧在哪里啊,我有事要去这个地方
易语言怎么让一张图片在一个特定的坐标上出现
百世快递差评怎么变好评?
难得老鹅汤我想知道这个在什么地方
如何在家中养螃蟹
男人需要,求那个个的种子,要高清的哦
红警 如何控制汽车
丰县大沙河镇一坝村民委员会这个地址在什么地
推荐资讯
怎么把邮件打印出来
筋头巴脑一锅香我想知道这个在什么地方
、短暂的瞬间,漫长的永远什么意思
东莞虎门北栅是不是有个中国电子工业园,知道
哪里有专门的WAR3 VODS 下载啊
很困惑,数学复习全书买哪个版本的好哇
做梦梦见自己打烂杯子啦在周公解梦里是什么意
我妈妈说谈恋爱找老婆要找独生女是什么意思?
确定是这个牌子丝袜?
腾讯手机管家7.0新版发布于2017年5月12日,这
大团山在什么地方啊,我要过去处理事情
双子座和天秤座注定不和?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?