相关疑难解决方法(0)

为什么TensorFlow 2比TensorFlow 1慢得多?

许多用户都将其作为切换到Pytorch的原因,但是我还没有找到牺牲/最渴望的实用质量,速度和执行力的理由/解释。

以下是代码基准测试性能,即TF1与TF2的对比-TF1的运行速度提高了47%至276%

我的问题是:在图形或硬件级别上,什么导致如此显着的下降?


寻找详细的答案-已经熟悉广泛的概念。相关的Git

规格:CUDA 10.0.130,cuDNN 7.4.2,Python 3.7.4,Windows 10,GTX 1070


基准测试结果


UPDATE:禁用每下面的代码不会急于执行没有帮助。但是,该行为是不一致的:有时以图形方式运行有很大帮助,而其他时候其运行速度相对于Eager

由于TF开发人员没有出现在任何地方,因此我将自己进行调查-可以跟踪相关的Github问题的进展。

更新2:分享大量实验结果,并附有解释;应该在今天完成。


基准代码

# use tensorflow.keras... to benchmark tf.keras; used GPU for all above benchmarks
from keras.layers import Input, Dense, LSTM, Bidirectional, Conv1D
from keras.layers import Flatten, Dropout
from keras.models import Model
from keras.optimizers import Adam
import keras.backend as K
import numpy as np
from time import time

batch_shape = (32, 400, 16) …
Run Code Online (Sandbox Code Playgroud)

python performance-testing keras tensorflow tensorflow2.0

94
推荐指数
2
解决办法
4140
查看次数

为什么矩阵乘法比numpy更快而不是Python中的ctypes?

我试图找出最快的矩阵乘法方法,尝试了3种不同的方法:

  • 纯python实现:这里没有惊喜.
  • Numpy实现使用 numpy.dot(a, b)
  • 使用ctypesPython中的模块与C连接.

这是转换为共享库的C代码:

#include <stdio.h>
#include <stdlib.h>

void matmult(float* a, float* b, float* c, int n) {
    int i = 0;
    int j = 0;
    int k = 0;

    /*float* c = malloc(nay * sizeof(float));*/

    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            int sub = 0;
            for (k = 0; k < n; k++) {
                sub = sub + a[i * n + …
Run Code Online (Sandbox Code Playgroud)

c python benchmarking matrix-multiplication

49
推荐指数
5
解决办法
2万
查看次数

如果 Keras 结果不可重复,那么比较模型和选择超参数的最佳做法是什么?

更新:这个问题是针对 Tensorflow 1.x 的。我升级到 2.0 并且(至少在下面的简单代码中)重现性问题似乎已在 2.0 上解决。这样就解决了我的问题;但我仍然很好奇 1.x 上针对此问题使用了哪些“最佳实践”。

在 keras/tensorflow 上训练完全相同的模型/参数/数据不会给出可重复的结果,并且每次训练模型时损失都显着不同。有很多关于此的 stackoverflow 问题(例如,如何在 keras 中获得可重现的结果),但推荐的解决方法似乎对我或 StackOverflow 上的许多其他人不起作用。好的,就是这样。

但是考虑到 keras 在张量流上的不可重复性的限制——比较模型和选择超参数的最佳实践是什么?我正在测试不同的架构和激活,但由于每次的损失估计都不同,我永远不确定一个模型是否比另一个更好。是否有处理此问题的最佳做法?

我认为这个问题与我的代码没有任何关系,但以防万一;这是一个示例程序:

import os
#stackoverflow says turning off the GPU helps reproducibility, but it doesn't help for me
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = ""
os.environ['PYTHONHASHSEED']=str(1)

import tensorflow as tf
import tensorflow.keras as keras
import tensorflow.keras.layers 
import random
import pandas as pd
import numpy as np

#StackOverflow says this is needed for reproducibility but it doesn't help for …
Run Code Online (Sandbox Code Playgroud)

python reproducible-research keras tensorflow

3
推荐指数
2
解决办法
2231
查看次数

如何在Python中显示真实的数值?

情况1

for num in [.1, .2, .3, .4, .5, .6, .7, .8, .9,]:
    print(format(num, ".50f"))
Run Code Online (Sandbox Code Playgroud)
0.10000000000000000555111512312578270211815834045410
0.20000000000000001110223024625156540423631668090820
0.29999999999999998889776975374843459576368331909180
0.40000000000000002220446049250313080847263336181641
0.50000000000000000000000000000000000000000000000000
0.59999999999999997779553950749686919152736663818359
0.69999999999999995559107901499373838305473327636719
0.80000000000000004440892098500626161694526672363281
0.90000000000000002220446049250313080847263336181641
Run Code Online (Sandbox Code Playgroud)

不精确,正如预期的那样(除了.5)。


案例2

for num in [1., 2., 3., 4., 5., 6., 7., 8., 9.]:
    print(format(num, ".50f"))
Run Code Online (Sandbox Code Playgroud)
1.00000000000000000000000000000000000000000000000000
2.00000000000000000000000000000000000000000000000000
3.00000000000000000000000000000000000000000000000000
4.00000000000000000000000000000000000000000000000000
5.00000000000000000000000000000000000000000000000000
6.00000000000000000000000000000000000000000000000000
7.00000000000000000000000000000000000000000000000000
8.00000000000000000000000000000000000000000000000000
9.00000000000000000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

完美的精度 - ???


众所周知,计算中不存在完美的浮点整数:所有浮点都以二进制基数表示,其精度取决于位大小(float32float64等)。那么上面的案例2是怎么回事呢?即使对于 ,零仍然存在".1000f",基本上意味着无限的精度。此外,0.5也以某种方式完美地表现出来。

如果format不能强制 Python 打印浮点数的“真”值,那么什么可以呢?


尝试的替代方案

  1. format(round(num, 50), ".50f")
  2. format(numpy.float128(num), ".50f")
  3. format(round(numpy.float128(num), 50), …

python floating-point precision floating-accuracy

2
推荐指数
1
解决办法
907
查看次数