2022年世界杯中国小组赛积分
我该如何引用克拉斯?
请在您的出版物中引用Keras,如果它有助于您的研究。下面是一个BibTeX条目示例:
@misc{chollet2017kerasR, title={R Keras接口},author={Chollet, Fran\c{c}ois and Allaire, JJ等},year={2017}, publisher={GitHub}, howpublished={\url{https://github.com/rstudio/keras}},}英格兰vs伊朗让球
我如何在GPU上运行Keras ?
注意,基于gpu的后端安装和配置可能花费更多的时间和精力。因此,如果您刚刚开始使用Keras,您可能希望一开始坚持使用CPU版本,然后在您的训练变得对计算要求更高时安装适当的GPU版本。
下面是为各种支持的后端安装和启用GPU支持的说明。卡塔尔世界杯欧洲预选赛赛程表
TensorFlow
如果您的系统有NVIDIA®GPU,并且您安装了TensorFlow的GPU版本,那么您的Keras代码将自动在GPU上运行。
关于GPU安装的更多细节可以在这里找到:https://tensorflow.英格兰vs伊朗让球rstudio.com/installation_gpu.html.
Theano
如果在Theano后端上运行,则可以设置THEANO_FLAGS
环境变量,表示你想在GPU上执行张量操作。例如:
Sys.setenv(KERAS_BACKEND =“keras”)Sys.setenv(THEANO_FLAGS =“设备= gpu, floatX = float32”)图书馆(keras)
名称' gpu '可能需要根据您的设备标识符进行更改。gpu0
,gpu1
等等)。
CNTK
如果您安装了CNTK的GPU版本,那么您的Keras代码将自动在GPU上运行。
关于安装CNTK的GPU版本的更多信息可以在这里找到:https://docs.microsoft.com/en-us/cognitive-toolkit/setup-linux-python
如何在多个gpu上运行Keras模型?
我们建议使用TensorFlow后端。在多个gpu上运行一个模型有两种方法:数据并行性而且设备的并行性.
在大多数情况下,您需要的很可能是数据并行性。
数据并行性
数据并行性包括在每个设备上复制一次目标模型,并使用每个副本处理输入数据的不同部分。Keras有一个内置的工具,multi_gpu_model ()
,它可以产生任何模型的数据并行版本,并在多达8个gpu上实现准线性加速。
有关更多信息,请参见的文档multi_gpu_model.下面是一个简单的例子:
#在8个gpu上复制“模型”假设你的机器有8个可用的gpu。parallel_model < -multi_gpu_model(模型中,gpu =8)parallel_model% > %编译(损失=“categorical_crossentropy”,优化器=“rmsprop”)#这个“fit”调用将分布在8个gpu上。由于批处理大小是256,每个GPU将处理32个样本。parallel_model% > %适合(x, y,时代=20.,batch_size =256)
设备的并行性
设备并行性是指在不同的设备上运行同一模型的不同部分。它最适合具有并行架构的模型,例如具有两个分支的模型。
这可以通过使用TensorFlow设备作用域来实现。下面是一个简单的例子:
使用共享LSTM并行编码两个不同序列的模型input_a < -layer_input(形状=c(140,256))input_b < -layer_input(形状=c(140,256))shared_lstm < -layer_lstm(单位=64)#在一个GPU上处理第一个序列图书馆(tensorflow)与(特遣部队$device_scope(“/ gpu: 0”, {encoded_a < -shared_lstm(tweet_a)}):在另一个GPU上处理下一个序列与(特遣部队$device_scope(“/ gpu: 1”, {encoded_b < -shared_lstm(tweet_b)}):#在CPU上连接结果与(特遣部队$device_scope(“/ cpu: 0”, {merged_vector < -layer_concatenate(列表(encoded_a encoded_b))}):
" sample ", " batch ", " epoch "是什么意思?
以下是正确使用Keras时需要了解和理解的一些常见定义:
- 样本:数据集的一个元素。
- 例子:一个图像是样本在卷积网络中
- 例子:一个音频文件是样本用于语音识别模型
- 批处理:一套N样本。样品在批处理都是独立并行处理的。如果是训练,批处理只会对模型进行一次更新。
- 一个批处理一般来说,近似输入数据的分布比单一输入更好。批次越大,近似越好;然而,处理批处理需要更长的时间,并且仍然只会产生一次更新。对于推断(评估/预测),建议选择在不耗尽内存的情况下尽可能大的批大小(因为较大的批通常会导致更快的评估/预测)。
- 时代:任意截断,通常定义为“整个数据集的一遍”,用于将训练分为不同的阶段,这对日志记录和定期评估很有用。
- 当使用
evaluation_data
或evaluation_split
与适合
方法对Keras模型进行评价时代. - 在Keras中,有添加功能回调专门设计运行在一个时代.其中的例子是学习率更改和模型检查点(保存)。
- 当使用
为什么要就地修改Keras对象?
与大多数R对象不同,Keras对象是“可变的”。这意味着当你修改一个对象时,你是在“原地”修改它,你不需要将更新的对象分配回原始名称。例如,要向Keras模型添加层,可以使用以下代码:
模型% > %layer_dense(单位=32,激活=“relu”,input_shape =c(784))% > %layer_dense(单位=10,激活=“softmax”)
而不是这样的代码:
模型< -模型% > %layer_dense(单位=32,激活=“relu”,input_shape =c(784))% > %layer_dense(单位=10,激活=“softmax”)
您需要了解这一点,因为这使得Keras API与您可能使用过的大多数其他管道稍有不同,但它必须与底层Keras库的数据结构和行为相匹配。
我如何拯救一个Keras模型?
保存/加载整个模型(体系结构+权重+优化器状态)
您可以使用save_model_hdf5 ()
将Keras模型保存到一个HDF5文件中,该文件将包含:
- 模型的体系结构,允许重新创建模型
- 模型的权重
- 训练配置(丢失、优化器)
- 优化器的状态,允许在您停止的地方恢复训练。
然后你可以使用load_model_hdf5 ()
来重新实例化您的模型。load_model_hdf5 ()
还将使用保存的训练配置编译模型(除非模型一开始就没有编译过)。
例子:
save_model_hdf5(模型中,“my_model.h5”)模型< -load_model_hdf5(“my_model.h5”)
只保存/加载一个模型的架构
如果你只需要保存模型的体系结构,而不是它的重量或训练配置,你可以:
json_string < -model_to_json(模型)yaml_string < -model_to_yaml(模型)
生成的JSON / YAML文件是人类可读的,如果需要可以手动编辑。
然后你可以根据这些数据建立一个新的模型:
模型< -model_from_json(json_string)模型< -model_from_yaml(yaml_string)
只保存/加载一个模型的重量
如果你需要保存模型的权重,你可以用下面的代码在HDF5中完成。
save_model_weights_hdf5(“my_model_weights.h5”)
方法将保存的权重加载到模型中,假设您有实例化模型的代码相同架构:
模型% > %load_model_weights_hdf5(“my_model_weights.h5”)
如果你需要加载权重到不同的体系结构(具有一些公共层),例如用于微调或转移学习,您可以通过以下方式加载权重层的名字:
模型% > %load_model_weights_hdf5(“my_model_weights.h5”,by_name =真正的)
例如:
#假设原始模型是这样的:# model <- keras_model_sequential()% > % #模型# layer_致密(units = 2, input_dim = 3, name = "致密1")%>%# layer_density (units = 3, name = "dense_3") %>%#……# save_model_weights(模型、帧)#新模型模型< -keras_model_sequential()模型% > %layer_dense(单位=2,input_dim =3.,name =“密集1”)% > %#将被加载layer_dense(单位=3.,name =“dense_3”)#将不会被加载#第一个模型的重量;只会影响第一层dense_1。load_model_weights(帧,by_name =真正的)
为什么训练损耗远高于测试损耗?
Keras模型有两种模式:训练和测试。正则化机制,如Dropout和L1/L2权值正则化,在测试时关闭。
训练损耗是每批训练数据损耗的平均值。因为您的模型是随着时间变化的,所以一个纪元的第一批的损失通常比最后一批的损失要高。另一方面,一个历的测试损失是使用模型计算的,因为它是在历的末尾,从而导致较低的损失。
如何获得中间层的输出?
一个简单的方法是创建一个新的模型
这将输出你感兴趣的层:
模型< -...#创建原始模型layer_name < -“my_layer”intermediate_layer_model < -keras_model(输入=模型$输入,输出=get_layer(layer_name模型)$输出)intermediate_output < -预测(intermediate_layer_model数据)
我如何使用Keras与不适合内存的数据集?
发生器功能
为了增量地提供训练或评估数据,您可以编写一个R生成器函数,该函数生成批量训练数据,然后将该函数传递给fit_generator ()
功能(或相关功能)evaluate_generator ()
而且predict_generator ()
.
生成器函数的输出必须是以下形式之一的列表:
- (输入、目标)
- (输入、目标sample_weights)
所有数组都应该包含相同数量的样本。预计该生成器将无限循环其数据。例如,下面是一个简单的生成器函数,它产生随机采样的数据批次:
sampling_generator < -函数(X_data, Y_data, batch_size) {函数() {行< -样本(1:nrow(batch_size X_data)取代=真正的)列表(X_data(行),Y_data [,])}}模型% > %fit_generator(sampling_generator(Y_train X_trainbatch_size =128),steps_per_epoch =nrow(X_train)/128,时代=10)
的steps_per_epoch
参数指示在宣布一个历结束并开始下一个历之前要从生成器生成的步骤数(样品批次)。如果您的数据集除以批处理大小,它通常应该等于唯一样本的数量。
外部数据生成器
然而,上面的例子并没有解决不适合内存的数据集的用例。通常要做到这一点,你需要编写一个生成器,从另一个源(例如,一个稀疏矩阵或磁盘上的文件)读取数据,并在重复调用时维护该数据的偏移量。例如,假设你在一个目录中有一组文本文件,你想从其中读取:
data_files_generator < -函数(dir) {文件<list.files(dir)next_file < -0函数() {#移动到下一个文件(注意<<-赋值操作符)next_file < < - - - - - -next_file+1#如果我们已经耗尽了所有的文件,那么重新开始#开始列表(keras生成器需要屈服# data unlimited—终止由epoch控制#和fit_generator()的steps_per_epoch参数如果(next_file>长度(文件)next_file < < - - - - - -1#确定文件名文件< -文件[[next_file]]#处理并返回文件中的数据。注意,在#实际示例,您将进一步细分数据在#文件到适当大小的培训批次。这#会使这个函数更加复杂,所以我们#不要在这里演示它file_to_training_data(文件)}}
上面的函数是一个有状态生成器的示例——该函数维护跨调用的信息,以跟踪下一个要提供的数据。方法在生成器函数体外部定义共享状态并使用<<-
要从生成器内部赋值给它的运算符。
图像生成器
你也可以使用flow_images_from_directory ()
而且flow_images_from_data ()
功能与fit_generator ()
用于对存储在磁盘上的图像集进行训练(可选的图像增强/规范化通过image_data_generator ()
).
您可以在我们的CIFAR10例子.
批处理功能
您还可以使用train_on_batch ()
而且test_on_batch ()
功能。这些函数使您能够编写一个训练循环,只将每个批处理所需的数据读入内存。
当验证损失不再减少时,我如何中断训练?
你可以使用一个早期停止回调:
early_stopping < -callback_early_stopping(监控=“val_loss”,耐心=2)模型% > %适合(X, y,validation_split =0.2,回调函数=c(early_stopping))
了解更多回调函数的文档.
如何计算验证分割?
如果你设置validation_split
论点适合
对于例如0.1,则使用的验证数据将是最后的10%的数据。如果你将其设置为0.25,它将是最后25%的数据,等等。注意,在提取验证分割之前,数据没有被打乱,因此验证实际上只是最后的您传递的输入中的X %的样本。
相同的验证集用于所有时代(在同一个调用中)适合
).
训练过程中数据是否被打乱?
是的,如果洗牌
论点适合
被设置为真正的
(这是默认值),训练数据将在每个epoch随机洗牌。
验证数据从不洗牌。
如何记录每个epoch的训练/验证损失/准确性?
的model.fit
方法返回一个历史
Callback,它有一个历史
属性,该属性包含连续损耗和其他度量的列表。
嘘< -模型% > %适合(X, y,validation_split =0.2)嘘$历史
我如何“冻结”Keras层?
“冻结”一个层意味着从训练中排除它,即它的权重永远不会更新。这在微调模型或为文本输入使用固定嵌入时非常有用。
你可以通过可训练的
参数(boolean)到一个层构造函数,将一个层设置为不可训练的:
frozen_layer < -layer_dense(单位=32,可训练的=假)
此外,您可以设置可训练的
属性的真正的
或假
在实例化。要想生效,你需要打电话编译()
在修改后的模型上可训练的
财产。这里有一个例子:
x < -layer_input(形状=c(32))层< -layer_dense(单位=32)层$可训练的< -假y < -x% > %层frozen_model < -keras_model(x, y)#在下面的模型中,' layer '的权重在训练过程中不会更新frozen_model% > %编译(优化器=“rmsprop”,损失=mse的)层$可训练的< -真正的trainable_model < -keras_model(x, y)#使用这个模型,层的权重将在训练期间更新#(它也会影响上面的模型,因为它使用了相同的层实例)trainable_model% > %编译(优化器=“rmsprop”,损失=mse的)frozen_model% > %适合(数据、标签)#不更新图层的权重trainable_model% > %适合(数据、标签)#更新图层的权重
方法,可以冻结或解冻整个模型(或模型中的一系列层)的权重freeze_weights ()
而且unfreeze_weights ()
功能。例如:
#实例化VGG16模型conv_base < -application_vgg16(重量=“imagenet”,include_top =假,input_shape =c(150,150,3.))#冻结它的重量freeze_weights(conv_base)#创建一个复合模型,包括基础+更多的层模型< -keras_model_sequential()% > %conv_base% > %layer_flatten()% > %layer_dense(单位=256,激活=“relu”)% > %layer_dense(单位=1,激活=“乙状结肠”)#编译模型% > %编译(损失=“binary_crossentropy”,优化器=optimizer_rmsprop(lr =2 e-5),指标=c(“准确性”))# unfreeze weight from "block5_conv1" onunfreeze_weights(conv_base从=“block5_conv1”)#再次编译,因为我们冻结或解冻了图层模型% > %编译(损失=“binary_crossentropy”,优化器=optimizer_rmsprop(lr =2 e-5),指标=c(“准确性”))
如何使用有状态rnn ?
使RNN有状态意味着每批样本的状态将被重用为下批样本的初始状态。
因此,在使用有状态rnn时,假定:
- 所有批次的样品数量相同
- 如果
X1
而且X2
那么是连续批次的样品吗X2[[我]]
后续顺序是到吗X1[[我]
,每我
.
要在rnn中使用有状态性,你需要:
- 参数显式指定正在使用的批处理大小
batch_size
参数设置为模型中的第一层。如。batch_size = 32
对于32个样本批次的10个时间步序列,每个时间步有16个特征。 - 集
有状态= TRUE
在你的RNN层中。 - 指定
洗牌= FALSE
当调用合适的()。
方法重置单个层或整个模型中累积的状态reset_states ()
函数。
注意方法预测()
,符合()
,train_on_batch ()
,predict_classes ()
等将所有更新模型中有状态层的状态。这不仅允许进行有状态训练,还允许进行有状态预测。
我如何从顺序模型中删除一个层?
您可以在Sequential模型中删除最后添加的层pop_layer ()
:
模型< -keras_model_sequential()模型% > %layer_dense(单位=32,激活=“relu”,input_shape =c(784))% > %layer_dense(单位=32,激活=“relu”)% > %layer_dense(单位=32,激活=“relu”)长度(模型$层)#“3”模型% > %pop_layer()长度(模型$层)#“2”
我如何在Keras中使用预训练的模型?
代码和预先训练的权重可用于以下图像分类模型:
例如:
模型< -application_vgg16(重量=“imagenet”,include_top =真正的)
有关一些简单的用法示例,请参见Applications模块的文档.
VGG16模型也是深的梦想Keras示例脚本。
我如何使用其他Keras后端?
默认情况下,Keras Python和R包使用TensorFlow后端。其他可用的后端包括Theano或CNTK。要了解更多关于使用交替后端(例如Theano或CNTK)的信息,请参阅关于Keras后端的文章.
我如何使用PlaidML后端?
PlaidML是一个开源的便携式深度学习引擎,运行在大多数现有的PC硬件上,使用NVIDIA、AMD或Intel的支持opencl的gpu。PlaidML包含一个Keras后端,您可以按照下面的描述使用它。
首先,构建和安装PlaidML项目网站.在继续之前,您必须确保PlaidML被正确安装、设置和工作!
然后,要将Keras与PlaidML后端一起使用,请执行以下操作:
图书馆(keras)use_backend(“plaidml”)
这将自动发现并使用Python环境plaidml
而且plaidml-keras
被安装。如果这没有像预期的那样工作,您还可以强制选择特定的Python环境。例如,如果你在名为“PlaidML”的conda环境中安装了PlaidML,你会这样做:
图书馆(keras)use_condaenv(“plaidml”)use_backend(“plaidml”)
我如何在另一个R包中使用Keras ?
测试在凹口
在另一个R包中使用Keras的主要考虑因素是确保您的包可以在Keras不可用的环境中进行测试(例如CRAN测试服务器)。要做到这一点,请安排在Keras不可用时跳过测试is_keras_available ()
函数。
例如,这是一个testthat当Keras不可用时,可以用来跳过测试的实用函数:
# test当Keras不可用时跳过测试的实用程序skip_if_no_keras < -函数(version =零){如果(!is_keras_available(版本)跳过(“所需的keras版本无法进行测试”)}#在测试中使用函数test_that(“keras函数正常工作”, {skip_if_no_keras()#测试代码})
你可以通过版本
参数来检查Keras的特定版本。
Keras模块
另一个需要考虑的问题是获得对底层Keras python模块的访问权。如果您需要对Keras的访问级别低于Keras R包提供的级别,则可能需要这样做。
由于Keras R包可以绑定到Keras的多个不同实现(无论是原始的Keras还是Keras的TensorFlow实现),您应该使用keras:实现()
函数获取对正确python模块的访问权。函数中使用此函数.onLoad
包的功能,提供对包内模块的全局访问。例如:
# Keras python模块keras < -零#从keras R包中获取模块的引用.onLoad < -函数(库名,pkgname) {keras < < - - - - - -keras::实现()}
自定义图层
如果您创建R中的自定义层或导入其他包含自定义Keras层的Python包,请确保使用create_layer ()
函数使它们可以使用magrittr管算符组合。请参阅有关层包装器函数额外的细节。
在开发过程中如何使用Keras获得可复制的结果?
在模型的开发过程中,有时能够从一个又一个运行中获得可重复的结果是很有用的,以便确定性能的变化是由于实际的模型或数据修改,还是仅仅是一个新的随机样本的结果。
的use_session_with_seed ()
函数为R、Python、NumPy和TensorFlow建立了一个通用的随机种子。此外,它还禁用了散列随机化、GPU计算和CPU并行化,这些可能是非再现性的额外来源。
要使用该函数,请在加载keras包后立即调用它:
图书馆(keras)use_session_with_seed(42)#……剩下的代码如下…
该函数采取了所有已知的措施,以促进Keras会话的可复制结果,但是后端使用的各种单独特性或库可能会逃避它的影响。如果您遇到不可重复的结果,请调查问题的可能来源。的源代码use_session_with_seed ()
在这里:https://github.com/英格兰vs伊朗让球rstudio/tensorflow/blob/master/R/seed.R.非常欢迎通过拉请求投稿!
请再次注意use_session_with_seed ()
默认情况下禁用GPU计算和CPU并行化(因为两者都会导致不确定性计算),所以在模型训练时间非常重要的情况下一般不应该使用。方法可以重新启用GPU计算和/或CPU并行disable_gpu
而且disable_parallel_cpu
参数。例如:
图书馆(keras)use_session_with_seed(42,disable_gpu =假,disable_parallel_cpu =假)
Keras配置字段存储在哪里?
所有Keras数据的默认存储目录为:
如果Keras无法创建上述目录(例如,由于权限问题),/ tmp / .keras /
用作备份。
Keras配置文件是一个JSON文件,存储在$ HOME / .keras / keras.json
.默认配置文件如下所示:
{"image_data_format": "channels_last", "epsilon": 1e-07, "floatx": "float32", "backend": "tensorflow"}
它包含以下字段:
- 图像数据格式将被图像处理层和实用程序用作默认格式
channels_last
或channels_first
). - 的
ε
在某些运算中用来防止除零的数值模糊因子。 - 默认的浮点数据类型。
- 默认后端(在Keras的R接口中,它总是“tensorflow”)
同样,缓存的数据集文件,例如下载的数据集文件get_file ()
,默认存储在$ HOME / .keras /数据/
.