深度学习原理与实践chapter07_第1页
深度学习原理与实践chapter07_第2页
深度学习原理与实践chapter07_第3页
深度学习原理与实践chapter07_第4页
深度学习原理与实践chapter07_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七章TensorFlow模型第七章TensorFlow模型TensorFlow模型编程模式tf.nntf.layers

tf.Estimatortf.Keras

读取数据载入数据创建迭代器使用dataset数据TensorFlow模型搭建Tensorflow模型训练损失函数--tf.losses模块优化器--tf.Train训练示例Tensorflow评估评价指标评估函数--tf.metricsTensorFlow模型载入、保存以及调用可视化分析和评估模型tf.summaryTensorboard

可视化评估工具Tensorboard使用案例示例--鸢尾花分类TensorFlow模型编程模式

TensorFlow模型编程有丰富的API,有两种不同的编程模式—图模式与eagerexecution模式。图模式的调试一般采用tfdbg,而eagerexecution由于可以打印中间变量,非常易于调试。一般来说,图模式的效率要高些。TensorFlow有底层的低级API,也有高级的API。对于同一项目,源码也不同,效率也不同。高级API是封装好的功能块,能节省很多代码。对于初学者,尽量使用高级API与eagerexecution模式,会加快学习和完成项目的进程。一般TensorFlow模型我们可以通过tf.nn,tf.layers,tf.estimator以及tf.keras等搭建。TensorFlow模型编程模式--tf.nnTensorFlow低级APItf.nn包括激活函数、卷积运算、池操作、形态过滤、规范化、损失操作、分类操作、查找嵌入的张量、构造循环神经网络、连接时间分类(CTC)、评估、候选抽样、抽样损失函数、候选取样器、杂项候选人抽样工具以及TensorFlow量化操作等函数。

神经元输出值计算

xw_plus_b:计算神经元输出值(matmul(x,weights)+biases)。x=[[1,2,3],[4,5,6]]w=[[7,8],[9,10],[11,12]]b=[[3,3],[3,3]]result=tf.nn.xw_plus_b(x,w,[3,3])bias_add(...):加上偏置值

tf.nn.bias_add

是tf.add

的一个特例,tf.nn.bias_add中参数bias的维度需要与value相同。TensorFlow模型编程模式--tf.nn激活函数提供用于神经网络的不同类型的非线性函数。relu(...):计算relu。即max(features,0)。relu6(...):计算relu

,即下阈值为0,上阈值为6。

relu_layer(...):计算Relu(x*weight+biases)。crelu(...):计算ConcatenatedReLU.CReLU(x)=[ReLU(x),ReLU(−x)]。elu(...):计算elu.leaky_relu(...):计算LeakyReLU.selu(...):计算scaledexponentiallinear(selu).quantized_relu_x(...):计算QuantizedRectifiedLinear。sigmoid(...):计算sigmoid。dropout(...):计算dropout。softplus(...):计算softplus:log(exp(features)+1)。softsign(...):计算softsign:features/(abs(features)+1)。tanh(...):计算tanh。

TensorFlow模型编程模式--tf.nn

卷积运算在一批图像上扫描2维滤镜,将滤镜应用到适当大小的每个图像的每个窗口。atrous_conv2d(...):计算带孔或膨胀(空洞)2d卷积。atrous_conv2d_transpose(...):计算带孔或膨胀(空洞)2d反卷积。conv1d(...):计算1-D卷积。conv2d(...):计算2-D卷积。conv2d_transpose(...):计算2-D反卷积。conv2d_backprop_filter(...):计算2-D卷积相对于filter的反向梯度。conv2d_backprop_input(...):计算2-D卷积相对于输入的反向梯度。conv3d(...):计算3-D卷积。conv3d_transpose(...):计算3-D反卷积。conv3d_backprop_filter_v2(...):计算3-D卷积相对于filter的反向梯度。convolution(...):计算N-D卷积。separable_conv2d(...):计算2-D可分卷积。depthwise_conv2d(...):计算2-D深度卷积。depthwise_conv2d_native(...):计算2-D深度卷积(4-D输入和卷积核张量)。depthwise_conv2d_native_backprop_filter(...):计算2-D深度卷积相对于卷积核的反向梯度。depthwise_conv2d_native_backprop_input(...):计算2-D深度卷积相对于输入的反向梯度。quantized_conv2d(...):计算2-D量化卷积(4-D输入和卷积核张量)。TensorFlow模型编程模式--tf.nn

池化操作通过输入张量扫描矩形窗口,计算每个窗口的缩减操作(平均值,最大值或最大值与argmax)。avg_pool(...):计算均值池化。avg_pool3d(...):计算3-D均值池化。max_pool(...):计算最大值池化池化。max_pool3d(...):计算3-D最大值池化。max_pool_with_argmax(...):计算池化区域中元素的最大值和该最大值所在的位置。fractional_avg_pool(...):计算分级均值池化。fractional_max_pool(...):计算分级最大值池化。quantized_avg_pool(...):计算量化张量均值池化。quantized_max_pool(...):计算量化张量最大值池化。pool(...):计算N_D池化。TensorFlow模型编程模式--tf.nn

形态运算符是图像处理中使用的非线性滤波器。膨胀与腐蚀(Dilation与Erosion)。膨胀和侵蚀是相互的。构造信号g的输入信号f的扩张等于对f的反射g的侵蚀的否定,反之亦然。dilation2d(...):计算灰度膨胀。erosion2d(...):计算灰度腐蚀。with_space_to_batch(...):计算输入的space-to-batch的表示。

TensorFlow模型编程模式--tf.nn输入值可能大小相差很大,归一化可以防止神经元饱和,并帮助泛化。moments(...):计算平均值和方差。batch_norm_with_global_normalization(...):批处理归一化。batch_normalization(...):批处理归一化。fused_batch_norm(...):批处理归一化。lrn(...):局部响应归一化。l2_normalize(...):L2归一化(过时)。local_response_normalization(...):局部响应归一化。normalize_moments(...):计算充分统计量的平均值和方差。weighted_moments(...):计算频率加权平均值和方差。

TensorFlow模型编程模式--tf.nn损失操作测量两张量之间或在张量和零之间的误差。这些可以用于测量网络在回归任务中的准确度,或用于正则化目的(重量衰减)。

l2_loss(...):计算L2损失。tf.nn.l2_normalize计算l2范化log_poisson_loss(...):计算对数泊松损失nce_loss(...):计算噪音对比估计(NoiseContrastiveEstimation)损失。sampled_softmax_loss(...):计算采样的softmax损失。TensorFlow模型编程模式--tf.nn神经网路输出层操作sparse_softmax_cross_entropy_with_logits(...):计算logits

和labels之间的稀疏softmax

交叉熵。softmax(...):计算softmax

激活函数。(过时)log_softmax(...):计算对数softmax

激活函数。(过时)sigmoid_cross_entropy_with_logits(...):计算logits

的sigmoid交叉熵。softmax_cross_entropy_with_logits(...):计算logits

和labels的softmax

交叉熵。(过时)softmax_cross_entropy_with_logits_v2(...):计算logits

和labels的softmax

交叉熵。weighted_cross_entropy_with_logits(...):计算权重交叉熵。TensorFlow模型编程模式--tf.nn连接时序分类(ConnectionistTemporalClassificationCTC)ctc_beam_search_decoder(...):计算最大的K个概率分布。ctc_greedy_decoder(...):贪婪策略计算最大的概率分布。ctc_loss(...):计算CTC损失。

TensorFlow模型编程模式--tf.nn预测评估操作in_top_k(predictions,targets,k,name=None)predictions:预测的结果,预测矩阵。targets:实际的标签,大小为样本数。k:每个样本的预测结果的前k个最大的数里面是否包含targets预测中的标签,一般都是取1,即取预测最大概率的索引与标签对比。top_k(...):返回input中每行最大的k个数,并且返回它们所在位置的索引。TensorFlow模型编程模式--tf.nn

当具有数千或数百万个输出类的多类或多标签模型时,使用完整的样本进行训练是非常缓慢的。候选抽样训练算法可以通过仅考虑每批示例的的小随机选择子集来缩短训练时间。all_candidate_sampler(...):产生所有采用类的集合。fixed_unigram_candidate_sampler(...):根据其他渠道知道类别满足某些分布的采样。learned_unigram_candidate_sampler(...):根据学习得出的分布的采样。log_uniform_candidate_sampler(...):根据log-uniform(Zipfian)分布的采样。uniform_candidate_sampler(...):根据均匀分布的采样。compute_accidental_hits(...):计算在采样中符合真类别的ID位置。sufficient_statistics(...):最小充分统计量包括平均值和方差。TensorFlow模型编程模式--tf.nn

RNN神经元模块bidirectional_dynamic_rnn(...):建立动态的双向循环神经网络。dynamic_rnn(...):通过RNNCell

神经元建立动态的循环神经网络。raw_rnn(...):通过RNNCell

神经元建立循环神经网络和循环函数loop_fn。static_bidirectional_rnn(...):建立静态的双向循环神经网络。static_rnn(...):通过RNNCell

神经元建立静态的循环神经网络。static_state_saving_rnn(...):建立接受时间删减计算(time-truncatedRNNcalculation)的状态保存器(statesaver)的循环神经网络。classBasicLSTMCell:基本LSTM循环神经网络神经元类。classBasicRNNCell:RNN神经元基本类。classDeviceWrapper:设定RNNCell

在特定的设备上运行。classDropoutWrapper:设定给定神经元的输入输出之间加上dropout。classGRUCell:门循环神经网络神经元(GatedRecurrentUnitcell)classLSTMCell:LSTM长短时循环神经网络神经元(Longshort-termmemoryunit(LSTM)recurrentnetworkcell)。classLSTMStateTuple:LSTM神经元的多元体,包括状态大小、零状态以及输出状态。classMultiRNNCell:多个RNN神经元复合神经元。classRNNCell:创建RNN神经元抽象对象。classResidualWrapper:设定给定RNN神经元的输入会加入到输出中。TensorFlow模型编程模式--tf.layers

tf.layers提供用于深度学习的更高层次封装的API,利用它我们可以轻松地构建模型。

卷积层函数及类conv1d(…):一维卷积层(对应类classConv1D)conv2d(…):二维卷积层(对应类classConv2D)conv2d_transpose(…):二维反卷积层(对应类classConv2DTranspose)conv3d(…):三维卷积层(对应类classConv3D)conv3d_transpose(…):三维反卷积层(对应类classConv3DTranspose)separable_conv1d(…):一维深度可分离卷积层(对应类classSeparableConv1D)separable_conv2d(...):二维深度可分离卷积层(对应类classSeparableConv2D)TensorFlow模型编程模式--tf.layers池化层函数及类average_pooling1d(…):一维平均池化层(对应类classAveragePooling1D)average_pooling2d(…):二维平均池化层(对应类classAveragePooling2D)average_pooling3d(…):三维平均池化层(对应类classAveragePooling3D)max_pooling1d(…):一维最大池化层(对应类classMaxPooling1D)max_pooling2d(…):二维最大池化层(对应类classMaxPooling2D)max_pooling3d(…):三维最大池化层(对应类classMaxPooling3D)

TensorFlow模型编程模式--tf.layers标准化层函数及类batch_normalization(…):批量标准化层(对应类classBatchNormalization)tensorflow.layers.batch_normalization集成了tf.nn中的moments和batch_normalization

的两个方法。

importtensorflowastfa=tf.constant([1.,2.,3.,4.,7.,5.,8.,4.,6.],shape=(1,3,3,3))a_mean,a_var=tf.nn.moments(a,axes=[1,2],keep_dims=True)b=tf.rsqrt(a_var)c=(a-a_mean)*b#c和d算的结果相同,是对整个batch图片归一化#只有当batch_size为1时,结果才与e,f值相同d=tf.nn.batch_normalization(a,a_mean,a_var,offset=None,scale=1,variance_epsilon=0)#e和f算的结果相同,是对batch中的每张图片归一化e=tf.layers.batch_normalization(a,training=True)f=tf.contrib.layers.batch_norm(a,is_training=True)TensorFlow模型编程模式--tf.layers全连接层函数及类dense(…):全连接层(对应类classDense)。Dropout层函数及类dropout(…):Dropout层(对应类classDropout)随机的拿掉网络中的部分神经元,从而减小对W权重的依赖,以达到减小过拟合的效果。Flatten函数及类flatten(…):Flatten层,即把一个Tensor展平(对应类classFlatten)。TensorFlow模型编程模式--tf.Estimator

Estimator是用于处理模型的高级工具。Estimator具有下列优势:可以在本地主机上或分布式多服务器环境中运行基于Estimator的模型可以在CPU、GPU或TPU上运行基于Estimator的模型,而无需重新编码模型;Estimator简化了在模型开发者之间共享实现的过程;可以使用高级直观代码开发先进的模型;

Estimator本身在tf.layers

之上构建而成,可以简化自定义过程。Estimator可以自动构建图。Estimator提供安全的分布式训练循环,可以控制如何以及何时构建图、初始化变量、开始排队、处理异常、创建检查点文件并从故障中恢复,以及保存TensorBoard

的摘要等等。借助预创建的Estimator,开发者能够在高级层面上进行操作。预创建的Estimator会自动创建和管理Graph

和Session

对象。借助预创建的Estimator只需稍微更改一点代码,就可以尝试不同的模型架构。依赖预创建的Estimator的TensorFlow程序通常包含下列四个步骤:编写一个或多个数据集导入函数。定义特征列。实例化相关的预创建的Estimator。调用训练、评估或推理方法。

TensorFlow模型编程模式--tf.Estimator

Estimator模块包含类classBaselineClassifier:简单基准分类器。classBaselineRegressor:简单基准回归器classBestExporter:导出最好模型的图与检查点。classBoostedTreesClassifier:TensorFlow提升树模型分类器。classBoostedTreesRegressor:TensorFlow提升树模型回归器。classDNNClassifier:DNN分类器。classDNNLinearCombinedClassifier:线性与DNN混合分类器。classDNNLinearCombinedRegressor:线性与DNN混合回归器。classDNNRegressor:DNN回归器。classEstimator:训练与评估。classEstimatorSpec:Estimator返回的操作与对象。classEvalSpec:训练与评估调用时eval部分的设置。classExporter:导出类类型。classFinalExporter:导出最终的图与检查点。classLatestExporter:最新的导出图和检查点。classLinearClassifier:线性分类器。classLinearRegressor:线性回归器。classModeKeys:模型模式的标注名称。classRunConfig:Estimator运行配置设定。classTrainSpec:训练与评估调用中train部分的配置。classVocabInfo:热启动词典信息。classWarmStartSettings:热启动设置。TensorFlow模型编程模式--tf.Estimator

Estimator模块包含函数classifier_parse_example_spec(...):生成传给tf.parse_example的分类器解析文档。regressor_parse_example_spec(...):生成传给tf.parse_example的回归器解析文档。train_and_evaluate(...):训练与评估estimator。

TensorFlow模型编程模式--tf.keras

TensorFlow提供了keras

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

TensorFlow模型编程模式--tf.keras

tf.Keras模块包模块

activationsmodule:激励函数模块。applicationsmodule:封装的预训练好权重的Keras

应用模块。backendmodule:Keras

后端API。callbacksmodule:训练过程中回调实用函数模块。constraintsmodule:权重限制函数模块。datasetsmodule:Keras数据集模块。estimatormodule:estimator模块。initializersmodule:Keras

初始化模块(马上将被TFinitializers代替)。layersmodule:Keras

层API。lossesmodule:损失函数模块。metricsmodule:度量函数模块。modelsmodule:模型复制以及模型相关的API。optimizersmodule:优化器类模块。preprocessingmodule:Keras

数据处理实用程序模块。regularizersmodule:归一化模块。utilsmodule:Keras实用程序模块。wrappersmodule:Keras

模型封装模块,便于与其他平台的兼容。TensorFlow模型编程模式--tf.keras

tf.Keras模块包含类classModel:将多个层组合为一个对象。classSequential:层的线性堆叠。ttf.Keras模块包含函数Input(...):实例化Keras

张量。TensorFlow读取数据TensorFlow程序读取数据的方法:供给数据(Feeding):在TensorFlow程序运行的每一步,让Python代码来供给数据。这种方法,数度慢,正在淘汰。采用tf.data读取数据:在TensorFlow图的起始,让tf.data管理一个输入数据管线来读取数据。TensorFlow读取数据

tf.data模块包含以下类:classDataset:数据集合。classFixedLengthRecordDataset:从一个或多个二进制文件读取固定长度的记录。classIterator:Dataset的遍历指针。classTFRecordDataset:从一个或多个TFRecord文件读取相容的记录。classTextLineDataset:从一个或多个文本文件读取相容的的行。使用Dataset类,需要遵循三个步骤:载入数据:为数据创建一个Dataset实例。创建迭代器:通过使用创建的Dataset构建一个迭代器来对数据集进行迭代。使用数据:通过使用创建的迭代器,可以找到可传输给模型的数据集元素。TensorFlow读取数据--载入数据

from_tensors()这个函数会把传入的tensor当做一个元素,from_tensor_slices()会把传入的tensor除开第一维之后的大小当做元素个数。dataset1=tf.data.Dataset.from_tensors(np.zeros(shape=(10,5,2),dtype=np.float32))dataset2=tf.data.Dataset.from_tensor_slices(tensors=np.zeros(shape=(10,5,2),dtype=np.float32))print(dataset1)print(dataset2)结果:<TensorDatasetshapes:(10,5,2),types:float32><TensorSliceDatasetshapes:(5,2),types:float32>

TensorFlow读取数据--载入数据我们也可以传递多个numpy数组,最典型的例子是当数据被划分为特征和标签的时候:features,labels=(np.random.sample((100,2)), np.random.sample((100,1))) dataset= tf.data.Dataset.from_tensor_slices((features,labels))动态地改变Dataset中的数据,可以从placeholder中载入。x=tf.placeholder(tf.float32,shape=[None,2])dataset=tf.data.Dataset.from_tensor_slices(x)

TensorFlow读取数据--载入数据我们也可以从dataset.generator中初始化一个Dataset。当一个数组中元素长度不相同时,使用这种方式处理是很有效的。在这种情况下,需要指定数据的类型和大小以创建正确的tensor。sequence=np.array([[1],[2,3],[3,4]])defgenerator():foriinsequence: yieldidataset=tf.data.Dataset().from_generator(generator,output_types=tf.float32,output_shapes=[1,2,2])TensorFlow读取数据--载入数据读取文本文件里面的数据files=['test_file_1.txt','test_file_2.txt']dataset=tf.data.TextLineDataset(files)从TFRecord

文件导入filenames=["test.tfrecord","test.tfrecord"]dataset=tf.data.TFRecordDataset(filenames)

TensorFlow读取数据--载入数据

Dataset通过Transformation完成数据变换,打乱,组成batch,生成epoch等一系列操作变成新的Dataset。MapDataset的map接收一个函数,Dataset中的每个元素都会被当作这个函数的输入,并将函数返回值作为新的Datasetdataset=tf.data.Dataset.from_tensor_slices(np.array([1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]))dataset.dataset.map(lambdax:x+1)#2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0Batchbatch就是将多个元素组合成一批,如下面的程序将dataset中的每32个元素组合为一个一批:dataset=dataset.batch(32)Shuffleshuffle的功能为打乱dataset中的元素dataset=dataset.Shuffle(buffer_size=10000)Repeatrepeat的功能就是将整个序列重复多次,主要用来处理机器学习中的epoch,dataset=dataset.repeat(5)TensorFlow读取数据--创建迭代器

遍历读取Dataset中值的最常见方法是构建迭代器对象。创建单次迭代器最简单的迭代器形式,仅支持对数据集进行一次迭代,不需要显式初始化。单次迭代器可以处理基于队列的现有输入管道支持的几乎所有情况,但它们不支持参数化。创建单次迭代器的函数为dataset.make_one_shot_iterator()#tf.data.Dataset.range(n),生成dataset,元素值从0到n-1。此处n为100dataset=tf.data.Dataset.range(100)iterator=dataset.make_one_shot_iterator()next_element=iterator.get_next()foriinrange(100):value=sess.run(next_element)asserti==valueTensorFlow读取数据--创建迭代器创建可初始化迭代器需要先运行显式iterator.initializer

指令,才能使用可初始化迭代器。虽然有些不便,但它允许您使用一个或多个tf.placeholder()张量(可在初始化迭代器时馈送)参数化数据集的定义。使用dataset.make_initializable_iterator()创建可初始化迭代器。max_value=tf.placeholder(64,shape=[])dataset=tf.data.Dataset.range(max_value)iterator=dataset.make_initializable_iterator()next_element=iterator.get_next()#初始化10个元素的dataset的迭代器sess.run(iterator.initializer,feed_dict={max_value:10})foriinrange(10):value=sess.run(next_element)asserti==value#初始化与上面同样的dataset迭代器,但具有100个元素。sess.run(iterator.initializer,feed_dict={max_value:100})foriinrange(100):value=sess.run(next_element)asserti==valueTensorFlow读取数据--创建迭代器构建可重新初始化迭代器可重新初始化迭代器可以用来对多个不同的Dataset对象进行初始化TensorFlow读取数据--创建迭代器

构建可馈送迭代器可馈送迭代器可以与tf.placeholder

一起使用,通过熟悉的feed_dict

机制来选择每次调用tf.Session.run

时所使用的Iterator。它提供的功能与可重新初始化迭代器的相同,但在迭代器之间切换时不需要从数据集的开头初始化迭代器。TensorFlow读取数据--使用dataset数据iterator.get_next()方法返回一个或多个tf.Tensor

对象,这些对象对应于迭代器指定的的下一个元素。如果迭代器到达数据集的末尾,则执行Iterator.get_next()指令会产生tf.errors.OutOfRangeError。在此之后,迭代器将处于不可用状态;如果需要继续使用,则必须对其重新初始化。

dataset=tf.data.Dataset.range(5)iterator=dataset.make_initializable_iterator()next_element=iterator.get_next()#一般情况下,result为模型的输出或优化器的训练操作结果,这里仅作为示例。result=tf.add(next_element,next_element)sess.run(iterator.initializer)print(sess.run(result))#==>"0"print(sess.run(result))#==>"2"print(sess.run(result))#==>"4"print(sess.run(result))#==>"6"print(sess.run(result))#==>"8"try:

sess.run(result)excepttf.errors.OutOfRangeError:

print("Endofdataset")#==>"Endofdataset"

TensorFlow读取数据--使用dataset数据TFRecord

文件格式是一种面向记录的简单二进制格式,很多TensorFlow应用采用此格式来训练数据。通过tf.data.TFRecordDataset

类,您可以将一个或多个TFRecord

文件的内容作为输入管道的一部分进行流式传输。filenames=tf.placeholder(tf.string,shape=[None])dataset=tf.data.TFRecordDataset(filenames)dataset=dataset.map(...)#Parsetherecordintotensors.dataset=dataset.repeat()#Repeattheinputindefinitely.dataset=dataset.batch(32)iterator=dataset.make_initializable_iterator()#通过馈送合适的文件名,执行不同的操作,如训练或测试。#用训练数据初始化迭代器。training_filenames=["/var/data/file1.tfrecord","/var/data/file2.tfrecord"]sess.run(iterator.initializer,feed_dict={filenames:training_filenames})#用测试数据初始化迭代器。validation_filenames=["/var/data/validation1.tfrecord",...]sess.run(iterator.initializer,feed_dict={filenames:validation_filenames})

TensorFlow读取数据--使用dataset数据

tf.data.TextLineDataset

提供了一种从一个或多个文本文件中提取行的简单方法。给定一个或多个文件名,TextLineDataset

会为这些文件的每行生成一个字符串值元素。像TFRecordDataset

一样,TextLineDataset

将filenames视为tf.Tensor,因此可以通过传递tf.placeholder(tf.string)来进行参数化。利用`Dataset.flat_map()`将文件每一行生成为数据集中的一个字符串值元素filenames=["/var/data/file1.txt","/var/data/file2.txt"]dataset=tf.data.Dataset.from_tensor_slices(filenames)#利用`Dataset.flat_map()`将文件每一行生成为一个字符串值元素。#如果文件以标题行开头或包含评论,即行以#开始。#可以使用Dataset.flat_map()中的skip()和Dataset.filter()转换来移除这些行dataset=dataset.flat_map(lambdafilename:(

tf.data.TextLineDataset(filename).skip(1).filter(lambdaline:tf.not_equal(tf.substr(line,0,1),"#"))))

TensorFlow模型搭建

神经网络可以通过tf.nn,tf.layers,tf.estimator以及tf.keras等搭建defconv_net(x_dict,n_classes,dropout,reuse,is_training):withtf.variable_scope('ConvNet',reuse=reuse):x=x_dict['images']x=tf.reshape(x,shape=[-1,28,28,1])#卷积层,32卷积核,核大小为5conv1=tf.layers.conv2d(x,32,5,activation=tf.nn.relu)#最大池化,核大小为2,步长2conv1=tf.layers.max_pooling2d(conv1,2,2)#卷积层,64卷积核,核大小为3conv2=tf.layers.conv2d(conv1,64,3,activation=tf.nn.relu)#最大池化,核大小为2,步长2conv2=tf.layers.max_pooling2d(conv2,2,2)

fc1=tf.contrib.layers.flatten(conv2)#扁平化数据到1-D向量

fc1=tf.layers.dense(fc1,1024)#全连接层#对全连接层进行Dropout(验证时,不使用dropout)fc1=tf.layers.dropout(fc1,rate=dropout,training=is_training)#输出层,分类预测

out=tf.layers.dense(fc1,n_classes)returnout

TensorFlow模型搭建

defmodel_fn(features,labels,mode):

logits_train=conv_net(features,num_classes,dropout,reuse=False,is_training=True)

logits_test=conv_net(features,num_classes,dropout,reuse=True,is_training=False)#预测、pred_classes

分类、pred_probas

分类概率

pred_classes=tf.argmax(logits_test,axis=1)

pred_probas=tf.nn.softmax(logits_test)#如果为预测模式,现在返回

ifmode==tf.estimator.ModeKeys.PREDICT:returntf.estimator.EstimatorSpec(mode,predictions=pred_classes)#定义损失函数和优化器

loss_op=tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(

logits=logits_train,labels=tf.cast(labels,dtype=32)))optimizer=tf.train.AdamOptimizer(learning_rate=learning_rate)

train_op=optimizer.minimize(loss_op,global_step=tf.train.get_global_step())#评估模型精度

acc_op=tf.metrics.accuracy(labels=labels,predictions=pred_classes)#TFEstimators需要返回EstimatorSpec,EstimatorSpec

定义了训练】评估等操作

estim_specs=tf.estimator.EstimatorSpec(mode=mode,predictions=pred_classes,loss=loss_op,

train_op=train_op,

eval_metric_ops={'accuracy':acc_op})returnestim_specs

model=tf.estimator.Estimator(model_fn)#创建EstimatorTensorFlow模型搭建importtensorflowastfimportosresnet=tf.keras.applications.resnet50defmy_model_fn():

base_model=resnet.ResNet50(include_top=True,#是否含全连接层 weights='imagenet',#预训练权重

input_shape=(224,224,3),#缺省输入形状

classes=2)#二分类

base_model.summary()optimizer=tf.keras.optimizers.RMSprop(lr=2e-3,decay=0.9)

base_pile(optimizer=optimizer,loss='categorical_crossentropy',metrics=["accurary"])#将keras

模型转化为estimator模型,模型保存目录路径为’train’model_dir=os.path.join(os.path.dirname(os.path.abspath(__file__)),“train”)

est_model=tf.keras.estimator.model_to_estimator(base_model,model_dir=model_dir)returnest_model

TensorFlow模型训练--损失函数

tf.losses

模块下主要的函数有:absolute_difference():为训练过程添加一个“绝对差异”loss,其实就是做差后取绝对值作为loss。add_loss():为loss集合添加额外定义的loss。compute_weighted_loss():计算加权loss。cosine_distance():为训练过程添加一个余弦距离loss。(过时)get_losses():从loss集合中获取loss列表。get_regularization_loss():获取总的正则化loss。get_regularization_losses():获得正则化loss列表。get_total_loss():返回其值表示总损失的张量。hinge_loss():为训练过程添加一个hingeloss。huber_loss():为训练过程添加一个HuberLoss。log_loss():为训练过程添加一个LogLoss。mean_pairwise_squared_error():为训练过程添加一个pairwise-errors-squaredloss。mean_squared_error():为训练过程添加一个Sum-of-Squaresloss,就是常说的均方误差loss。sigmoid_cross_entropy():sigmoid交叉熵loss(用tf.nn.sigmoid_cross_entropy_with_logits

实现)softmax_cross_entropy():softmax交叉熵loss(用tf.nn.softmax_cross_entropy_with_logits

实现)sparse_softmax_cross_entropy():稀疏softmax交叉熵loss(用tf.nn.sparse_softmax_cross_entropy_with_logits

实现)TensorFlow模型训练--优化器tf.train.Optimizer优化器的基类tf.train.GradientDescentOptimizer

梯度下降算法优化器

tf.train.AdagradDAOptimizer

AdagradDualAveraging算法优化器tf.train.AdagradOptimizer:Adagrad算法优化器tf.train.AdadeltaOpzimizer

Adadelta

算法优化器tf.train.MomentumOptimizerMomentum算法优化器tf.train.AdamOptimizerAdam算法优化器tf.train.ProximalGradientDescentOptimizerproximal梯度下降算法优化器tf.train.ProximalAdagradOptimizerProximalAdagrad算法优化器tf.train.RMSPropOptimizer

RMSProp

算法优化器classFtrlOptimizer:FTRL算法优化器TensorFlow模型训练--训练示例

评估--评价指标

评估--评价指标精确度(precision):TP/(TP+FP)=TP/P召回率(recall):TP/(TP+FN)=TP/T真阳性率(Truepositiverate):TPR=TP/(TP+FN)=TP/T(敏感性sensitivity)假阳性率(Falsepositiverate):FPR=FP/(FP+TN)=FP/F(特异性:specificity)准确率(Accuracy):Acc=(TP+TN)/(P+N)F-measure:2*recall*precision/(recall+precision)ROC曲线:FPR为横坐标,TPR为纵坐标PR曲线:recall为横坐标,precision为纵坐标假阳率,预测为正样本但是预测错了的可能性,显然,我们不希望该指标太高。真阳率(和召回率是一样的),则是预测为正样本但是预测对了的可能性,当然,我们希望真阳率越高越好。评估--评价指标ROC曲线在斜对角线以下,则表示该分类器效果差于随机分类器,反之,效果好于随机分类器,当然,我们希望ROC曲线尽量除于斜对角线以上,也就是向左上角(0,1)凸起。评估--评价指标AUC(AreaundertheROCcurve)。AUC实际上就是ROC曲线下的面积。AUC直观地反映了ROC曲线表达的分类能力。AUC=1,代表完美分类器0.5<AUC<1,优于随机分类器0<AUC<0.5,差于随机分类器评估--评价指标图像识别中,也经常用到Intersection-Over-Union(IOU)评估--评估函数tf.metricsaccuracy(...):计算总的预测值与标签一致的准确率。auc(...):计算根据黎曼和的近似AUC值。average_precision_at_k(...):计算平均精确度。false_negatives(...):计算假阴率加权总数。false_negatives_at_thresholds(...):计算给定阈值的假阴率总数。false_positives(...):计算假阳率加权总数。false_positives_at_thresholds(...):计算给定阈值的假阳率总数。true_negatives(...):计算真阴率加权总数。true_negatives_at_thresholds(...):计算给定阈值的真阴率总数。true_positives(...):计算真阳率加权总数。true_positives_at_thresholds(...):计算给定阈值的真阳率总数。mean(...):计算加权平均值。mean_absolute_error(...):计算平均绝对误差。mean_cosine_distance(...):计算余弦距离。mean_iou(...):计算每步meanIntersection-Over-Union(mIOU)。mean_per_class_accuracy(...):计算每类别准确率的平均值。mean_relative_error(...):计算平均相对误差。mean_squared_error(...):计算标签和预测值的方差。mean_tensor(...):计算给定张量的平均值。percentage_below(...):计算小于特定阈值的百分比。precision(...):计算精确度。precision_at_k(...):计算k精确度。precision_at_thresholds(...):计算特定阈值下精确度。precision_at_top_k(...):计算top-k精确度。recall(...):计算召回率。recall_at_k(...):计算k召回率。recall_at_thresholds(...):计算特定阈值下召回率。recall_at_top_k(...):计算top-k召回率。root_mean_squared_error(...):计算标准误差sensitivity_at_specificity(...):计算给定假阳性率情况下的真阳性率。specificity_at_sensitivity(...):计算给定真阳性率情况下的假阳性率。TensorFlow模型载入、保存以及调用模型保存方法有两种,基本方法以及不需重新定义网络结构的方法基本方法保存:定义变量,使用saver.save()方法保存。载入:定义变量,使用saver.restore()方法载入。保存示例代码saver=tf.train.Saver(max_to_keep=3)withtf.Session()assess:

sess.run(init)

save_path=saver.save(sess,"save/model.ckpt")载入示例代码saver=tf.train.Saver()withtf.Session()assess:

saver.restore(sess,"save/model.ckpt")TensorFlow模型载入、保存以及调用不需重新定义网络结构的方法tf.train.import_meta_graph

从文件中将保存的graph的所有节点加载到当前的defaultgraph中,并返回一个saver。也就是说,我们在保存的时候,除了将变量的值保存下来,其实还有将对应graph中的各种节点保存下来,所以模型的结构也同样被保存下来了。载入

withtf.Session()assess:

new_saver=tf.train.import_meta_graph('my-save-dir/my-model-10000.meta')

new_saver.restore(sess,'my-save-dir/my-model-10000')#tf.get_collection()返回一个list.但是这里只要第一个参数即可

y=tf.get_collection('pred_network')[0]graph=tf.get_default_graph()"""因为y中有placeholder,所以sess.run(y)的时候还需要用实际待预测的样本以及相应的参数来填充这些placeholder,而这些需要通过graph的get_operation_by_name方法来获取。"""input_x=graph.get_operation_by_name('input_x').outputs[0]keep_prob=graph.get_operation_by_name('keep_prob').outputs[0]#使用y进行预测sess.run(y,feed_dict={input_x:....,keep_prob:1.0})可视化分析和评估模型--tf.summary

tf.summary

包含以下类:classEvent:事件classFileWriter:将训练摘要写入文件。classFileWriterCache:训练摘要Cache。classSessionLog:Session日志。classSummary:训练摘要。classSummaryDescription:训练摘要描述。classTaggedRunMetadata:标注的运行元数据。tf.summary

包含以下函数:audio(...):音频输出。get_summary_description(...):获取训练摘要描述。histogram(...):直方图histogram输出。image(...):图片Images输出。merge(...):摘要合并。merge_all(...):合并缺省图的所有摘要。scalar(...):标量Scalar数据输出。tensor_summary(...):张量数据摘要输出。text(...):文本数据摘要输出。

可视化分析和评估模型–

Tensorboard

Tensorboard可以记录与展示以下数据形式:

(1)标量Scalars

(2)图片Images

(3)音频Audio

(4)计算图Graph

(5)数据分布Distribution

(6)直方图Histograms

(7)嵌入向量Embeddings可视化分析和评估模型–

Tensorboard

Tensorboard的可视化过程:(1)首先肯定是先建立一个graph,你想从这个graph中获取某些数据的信息(2)确定要在graph中的哪些节点放置summaryoperations以记录信息。

使用tf.summary.scalar记录标量,使用tf.summary.histogram记录数据的直方图

使用tf.summary.distribution记录数据的分布图,使用tf.summary.image记录图像数据,等等。(3)operations并不会去真的执行计算,除非你告诉他们需要去run,或者它被其他的需要run的o

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论