PyTorch-Part3——TensorFlow 转 PyTorch

[TOC]

函数对应

TensorFlow - tf.reshape 函数 & Pytorch - torch.reshape 函数

TensorFlow - tf.concat 函数 & Pytorch - torch.cat 函数

TensorFlow - tf.abs 函数 &

  • 针对张量的每一位的元素分别计算其绝对值,并输出原格式的新张量。

TensorFlow - tf.expand_dims 函数 & torch.unsqueeze

  • TensorFlow - tf.less 函数 &
    torch.le same as torch.ge — >=
    torch.lt same as torch.gt — >
    与torch.min相同的是,其均是用来比较两个张量每一位元素的最小值,不同的是tf.less输出的是是否为最小值的bool值,torch.min是输出两元素中的最小值并重新组合成张量。
    返回值: 一个 torch.ByteTensor 张量,包含了每个位置的比较结果(是否 input >= other )。 返回类型: Tensor

  • torch.le(input, other, out=None) -> Tensor:

  • 逐元素比较input和other,即是否input <= other,第二个参数可以为一个数或与第一个参数相同形状和类型的张量。

  • torch.lt(input, other, out=None) -> Tensor:

  • 逐元素比较input和other,即是否input < other

TensorFlow - tf.equal 函数 & torch.equal

  • 若两个张量有相同的形状和元素值,则返回True, 否则False。

TensorFlow - tf.greater_equal 函数 & torch.ge torch.gt

  • 逐元素比较input和other,是否input > other。若两个张量有相同的形状和元素值,则返回True,否则False。

TensorFlow - tf.norm 函数 & torch.norm

TensorFlow - tf.argmin 函数 & torch.argmin

TensorFlow - tf.gather_nd 函数 &

  • 目前torch中自带的同类型函数只有torch.gather,用于处理指定一维度,无gather_nd的用法,但开源工具torchsample中则加入了类似的函数th_gather_nd,模仿tensorflow中的使用,详见:
    torchsample推荐安装,有点类似于tf中的keras,提供高级api,减少开发时间,实用。

    Pytorch的高级训练,数据增强和实用程序(torchsample/Keras)

TensorFlow - tf.gather 函数 & torch.gather

  • 根据索引从参数轴上收集切片.

TensorFlow - tf.shape 函数 & torch.size

TensorFlow - tf.range 函数 & torch.arange / torch.range

TensorFlow - tf.stack 函数 & torch.stack

TensorFlow - tf.reduce_mean 函数 & torch.mean

TensorFlow - tf.cast 函数 &

  • torch中没有相似的类型转换函数,直接使用torch.FloatTensor()或data.float()类似的进行转换就可以了。

TensorFlow - tf.count_nonzero 函数 & torch.nonzero

  • 计算并输出各个维度上非0元素的个数。

TensorFlow - tf.tile 函数 & Tensor.repeat()

Tensorflow tf.where & torch.le / torch.lt

Tensorflow tf.nn.in_top_k

  • tensorflow pytroch
    tf.reshape(input, shape) input.view()
    tf.expand_dims(input, dim) input.unsqueeze(dim) / input.view()
    tf.squeeze(input, dim) torch.squeeze(dim)/ input.view()
    tf.gather(input1, input2) input1[input2]
    tf.tile(input, shape) input.repeat(shape)
    tf.boolean_mask(input, mask) input[mask] #注意,mask是bool值,不是0,1的数值
    tf.concat(input1, input2) torch.cat(input1, input2)
    tf.matmul() torch.matmul()
    tf.minium(input, min) torch.clamp(input, max=min)
    tf.equal(input1, input2) torch.eq(input1, input2)/ input1 == input2
    tf.logical_and(input1, input2) input1 & input2
    tf.logical_not(input) ~ input
    tf.reduce_logsumexp(input, [dim]) torch.logsumexp(input, dim=dim)
    tf.reduce_any(input, dim) input.any(dim)
    tf.reduce_mean(input) torch.mean(input)
    tf.reduce_sum(input) input.sum()
    tf.transpose(input) input.t()
    tf.softmax_cross_entroy_with_logits(logits, labels) torch.nn.CrossEntropyLoss(logits, labels)

  • 获取词向量:

  • tensorflow中: input_emb = tf.gather(tf.get_variable(“input_emb”, [num, embedding_size]), input)
    pytorch中:1.embedding = nn.Embedding(num, embedding_size),2.input_emb = embedding (input)
    只是初始化embedding矩阵

  • tensorflow中: input_emb = tf.get_variable(“input_emb”, [num, embedding_size])
    pytorch中:1.embedding = nn.Embedding(num, embedding_size), 2.input_emb = embedding .weight

  • 基本重构完成代码之后,检查代码以下方面:

    1. 👌 初始化网络权重是否正确
    2. 👌 如果有预训练模型,检查是否加载正确
    3. 👌 检查优化器,整个任务是相同的学习率,还是说是不同层,设置了不同的学习率
    4. 👌 如果数据预处理也需要改动,最好也检查一下预处理是否正确

https://blog.csdn.net/qq_41895190/article/details/89954394

两个 tf 流程

  1. https://www.cnblogs.com/tengge/p/6376073.html
  2. https://blog.csdn.net/lcczzu/article/details/91449731

常见的loss问题

train loss与test loss结果分析

train loss 不断下降,test loss不断下降,说明网络仍在学习;

train loss 不断下降,test loss趋于不变,说明网络过拟合;

train loss 趋于不变,test loss不断下降,说明数据集100%有问题;

train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目;

train loss 不断上升,test loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。

二,
这个比较长,比较完整 Loss和神经网络训练

https://blog.csdn.net/u011534057/article/details/51452564

有1.梯度检验2.训练前检查,3.训练中监控4.首层可视化5.模型融合和优化等等等

三,https://www.zhihu.com/question/38937343

四,https://blog.csdn.net/u010911921/article/details/71079367

原文地址:http://blog.csdn.net/u010911921/article/details/71079367
这段在使用caffe的时候遇到了两个问题都是在训练的过程中loss基本保持常数值,特此记录一下。

1.loss等于87.33不变
loss等于87.33这个问题是在对Inception-V3网络不管是fine-tuning还是train的时候遇到的,无论网络迭代多少次,网络的loss一直保持恒定。

查阅相关资料以后发现是由于loss的最大值由FLT_MIN计算得到,FLT_MIN是其对应的自然对数正好是-87.3356,这也就对应上了loss保持87.3356了。

这说明softmax在计算的过程中得到了概率值出现了零,由于softmax是用指数函数计算的,指数函数的值都是大于0的,所以应该是计算过程中出现了float溢出的异常,也就是出现了inf,nan等异常值导致softmax输出为0.

当softmax之前的feature值过大时,由于softmax先求指数,会超出float的数据范围,成为inf。inf与其他任何数值的和都是inf,softmax在做除法时任何正常范围的数值除以inf都会变成0.然后求loss就出现了87.3356的情况。

解决办法

由于softmax输入的feature由两部分计算得到:一部分是输入数据,另一部分是各层的权值等组成

减小初始化权重,以使得softmax的输入feature处于一个比较小的范围

降低学习率,这样可以减小权重的波动范围

如果有BN(batch normalization)层,finetune时最好不要冻结BN的参数,否则数据分布不一致时很容易使输出值变得很大(注意将batch_norm_param中的use_global_stats设置为false )。

观察数据中是否有异常样本或异常label导致数据读取异常

本文遇到的情况采用降低学习率的方法,learning rate设置为0.01或者原来loss的或者。

2.loss保持0.69左右
采用VGG-16在做一个二分类问题,所以计算loss时等价与下面的公式:

当p=0.5时,loss正好为0.693147,也就是训练过程中,无论如何调节网络都不收敛。最初的网络配置文件卷积层的参数如下所示:

从VGG-16训练好的模型进行fine-tuning也不发生改变,当在网络中加入初始化参数和decay_mult以后再次训练网络开始收敛。

但是具体是什么原因造成的,暂时还没有找到,难道是初始化参数的问题还是?

参考资料
http://blog.csdn.net/jkfdqjjy/article/details/52268565?locationNum=14

https://groups.google.com/forum/#!topic/caffe-users/KEgrRlwXz9c

https://www.zhihu.com/question/68603783

loss一直不下降的原因有很多,可以从头到尾滤一遍: 1)数据的输入是否正常,data和label是否一致。 2)网络架构的选择,一般是越深越好,也分数据集。 并且用不用在大数据集上pre-train的参数也很重要的 3)loss 对不对。

具体到语音,很多是把audio转成频谱图送给CNN训练。

NIPS16 有个soundNet(torch的code),语音分类的performance很高,我觉得可以用来初始化你的model 参数, 可以参考下。

还有我见的3D-CNN 多用于视频,做audio 用3D 的工作比较少,倒是见过是用1维卷积做audio的

https://blog.csdn.net/u011534057/article/details/51452564/