《关于负采样tfnnsampled.docx》由会员分享,可在线阅读,更多相关《关于负采样tfnnsampled.docx(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、关于负采样tf.nn.sampled.我又开场搞mnist了复盘。实际整了下这个代码发现loss是下面这种还有为0的时候what这是真的吗这么看是看不出啥的必须加上正确率啥的评价指标。step3500,loss2.792289step3600,loss0.068885step3700,loss5.048674step3800,loss1.509981step3900,loss0.000000step4000,loss1.149292step4100,loss3.140670step4200,loss1.334031那么要明白tf.nn.sampled_softmax_loss返回的是个啥东西h
2、elp后的解释是batch_size大小的1维tensor如下sampled_losstf.Tensorsoftmax_cross_entropy_with_logits/Reshape_2:0shape(?,)dtypefloat32因此可知这个玩意还是调用的穿插熵这也与源码相符logits,labels_compute_sampled_logits(weightsweights,biasesbiases,labelslabels,inputsinputs,num_samplednum_sampled,num_classesnum_classes,num_truenum_true,sampl
3、ed_valuessampled_values,subtract_log_qTrue,remove_accidental_hitsremove_accidental_hits,partition_strategypartition_strategy,namename,seedseed)labelsarray_ops.stop_gradient(labels,namelabels_stop_gradient)sampled_lossesnn_ops.softmax_cross_entropy_with_logits_v2(labelslabels,logitslogits)#sampled_lo
4、ssesisabatch_sizetensor.returnsampled_losses由于sampled_loss是batch_size的长度与种类数不同即使一样也不对啊这里确实不是这个含义所以不可能从这里求argmax所以这里面是找不到y_pred的因此在计算中想求得必须另外写怎么求y_pred这就费事了这需要另外定义个优化器及方法这样的话反向传播也会影响权值的学习这是不对的但是不影响测试集求评价指标这样就可以直接调用sklearn的classification_report简单而又方便。然而我有点蒙蔽这个保存的模型的输入输出是啥啊输入毫无疑问输出呢我蒙蔽了真的这个sampled_soft
5、max_loss无法计算y_pred加载ckpt后我也不知道怎么得到何况我看了这个ckpt那是相当懵逼脑袋全是毛线了。如图就特么单层FC搞这么复杂whatsampled_losstf.nn.sampled_softmax_loss(weightsweightsh1,biasesbiasesb1,labelslabels,inputslayer_1,num_samplednum_sampled,num_truenum_true,num_classesnum_classes,namesampled_softmax_loss)我清楚是命名了这个Op结果没有这个tensorwhatwocsess.gr
6、aph.get_tensor_by_name(sampled_softmax_loss:0)Traceback(mostrecentcalllast):Filepyshell#35,line1,inmodulesess.graph.get_tensor_by_name(sampled_softmax_loss:0)FileD:python36libsite-packagestensorflow_corepythonframeworkops.py,line3783,inget_tensor_by_namereturnself.as_graph_element(name,allow_tensorT
7、rue,allow_operationFalse)FileD:python36libsite-packagestensorflow_corepythonframeworkops.py,line3607,inas_graph_elementreturnself._as_graph_element_locked(obj,allow_tensor,allow_operation)FileD:python36libsite-packagestensorflow_corepythonframeworkops.py,line3649,in_as_graph_element_lockedgraph.%(re
8、pr(name),repr(op_name)KeyError:Thenamesampled_softmax_loss:0referstoaTensorwhichdoesnotexist.Theoperation,sampled_softmax_loss,doesnotexistinthegraph.sess.graph.get_tensor_by_name(add:0)tf.Tensoradd:0shape(?,256)dtypefloat32sess.graph.get_tensor_by_name(relu:0)tf.Tensorrelu:0shape(?,256)dtypefloat32
9、sess.graph.get_tensor_by_name(reduce_mean:0)tf.Tensorreduce_mean:0shape()dtypefloat32也是醉了这个sampled_softmax_loss真是厉害了我求出来最后的loss怎么测试呢没有啥评价指标吗有点不科学啊直接将测试数据放入得到的输出layer-256D就是embedding我表示难以置信这样的话同一类别的应该会很相似下面我试试将test的第一个召回了与其近似的100个果然是同一个标签训练应该有效果吧。假如想搞一下深化那么就是再来几层FC这样能用这个loss函数吗我试试加了一层到128D结果出现其他标签也是意
10、料之中但是我发现假如按照stackoverflow上的做法shape并不一样啊如下是两层FC的weightsh2tf.VariableVariable_1:0shape(256,128)dtypefloat32_reflabelstf.TensorReshape:0shape(?,1)dtypeint64biasesb2tf.VariableVariable_3:0shape(128,)dtypefloat32_reflayer_1tf.Tensorrelu2:0shape(?,128)dtypefloat32num_samplednum_truenum_classes10而按照sampled
11、_softmax_loss的help结果如下发现权值w以及b是不对的shape试试单层FCweightsnum_classes,dimbiasesnum_classeslabelsbatch_size,num_trueinputsbatch_size,dimbut同样的问题weightsh1tf.VariableVariable:0shape(784,256)dtypefloat32_refbiasesb1tf.VariableVariable_2:0shape(256,)dtypefloat32_reflabelstf.TensorReshape:0shape(?,1)dtypeint64l
12、ayer_1tf.Tensorrelu1:0shape(?,256)dtypefloat32关于召回率及多个测试请看关于召回率及hitrate的另一篇博文再见这个sampled_softmax_loss只有这点用了待续。20200518早上将醒未醒之时突然觉察这个keras的Embedding与本文得到的结果是一样的shape如下embtf.keras.layers.Embedding(784,128)W051809:32:37.3578649244deprecation.py:506FromD:pythonlibsite-packagestensorflow_corepythonkerasi
13、nitializers.py:119:callingRandomUniform._init_(fromtensorflow.python.ops.init_ops)withdtypeisdeprecatedandwillberemovedinafutureversion.Instructionsforupdating:Callinitializerinstancewiththedtypeargumentinsteadofpassingittotheconstructorinputstf.keras.Input(shape784)emb(inputs)tf.Tensorembedding/emb
14、edding_lookup/Identity_1:0shape(?,784,128)dtypefloat32关键在于怎么定义输入维度是一维还是784我以为Embedding就是类似于FC的作用发如今shape上也不一样哎看来梦中都是浮云啊。后续2关于sampled_softmax_loss的进一步解读官方有个。关于inputs其中解释讲是batch_size大小的固定长dim维度的输入对于num_classes中的每个类都有一个dim长度的embeddingvector。num_sampled是负采样数然后计算在labels以及负采样类之间的穿插熵这就化成了二分类问题。详细的解释看着有点费力只有真正解析了才知道吧。更多问题请加下面的推荐群讨论。ForVideoRecommendationinDeeplearningQQGroup277356808ForSpeech,Image,VideoindeeplearningQQGroup868373192Imherewaitingforyou