小编mem*_*emo的帖子

使用 tensorflow.contrib.signal 重建信号会导致放大或调制(帧、overlap_and_add、stft 等)

更新:我已经在 librosa 中重新实现了这个进行比较,结果确实与 tensorflow 的结果非常不同。Librosa 给出了我期望的结果(但不是 tensorflow)。

我已将此作为问题发布到 tensorflow repo 上,但那里很安静,所以我在这里尝试。此外,我不确定这是 tensorflow 中的错误,还是代表我的用户错误。为了完整起见,我也将在此处包含完整的源代码和结果。

A.) 当我使用 hann 窗口(也尝试过汉明)从具有frame_length=1024frame_step=256(即 25% 跳大小,75% 重叠)的信号创建帧,然后使用 重建时overlap_and_add,我希望信号能够正确重建(因为可乐等)。但相反,它的幅度恰好是两倍。我需要将结果信号除以二才能正确。

B.) 如果我使用 STFT 创建一系列重叠的频谱图,然后使用逆 STFT 重建,再次使用frame_length=1024frame_step=256,则再次以双倍幅度重建信号。

我意识到为什么会这样(hann 重叠 50% 时的单位增益,因此 75% 重叠会使信号加倍)。但是重建功能考虑到这一点不是很正常吗?例如 librosa istft 确实以正确的幅度返回信号,而 tensorflow 返回双倍。

C.) 在任何其他 frame_step 处,都存在严重的幅度调制。请参阅下面的图片。这似乎根本不对。

更新:如果我window_fn=tf.contrib.signal.inverse_stft_window_fn(frame_step)inverse_stft输出中明确设置是正确的。所以似乎frame_stepininverse_stft没有被传递到窗口函数中(这也是结果所暗示的)。

原始数据:

在此处输入图片说明

来自帧的张量流输出+overlap_and_add:

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

stft+istft 的张量流输出:

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

stft+istft 的 librosa 输出:

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

张量流代码:

from __future__ import print_function
from __future__ …
Run Code Online (Sandbox Code Playgroud)

python signal-processing time-series tensorflow

5
推荐指数
1
解决办法
1133
查看次数

如何在张量流中“重置”随机序列

我有一个包含 GB 变量的图和一个随机函数(例如 VAE)。我希望能够运行一个函数,并且始终使用相同的随机序列(例如,输入大量的 x,并且始终获得完全相同的 z 和 y)。

我可以使用随机种子来实现这一点,这样每次从头开始运行脚本(即初始化会话)时我总是得到相同的序列。不过,我希望能够在不破坏会话的情况下重置随机序列,这样我就可以一遍又一遍地调用我的函数(并获得相同的序列)。销毁并重新初始化会话并不是很理想,因为我丢失了 GB 的变量,并且每次重新加载都是浪费。再次设置随机种子(tf.set_random_seed)似乎没有影响(我认为来自 tf.set_random_seed 的种子以某种方式与操作种子结合并在创建时烘焙到操作中?)

有没有办法解决?

我已经阅读了有关张量流中随机种子的文档和大量帖子(例如TensorFlow:将种子重置为常量值不会产生重复结果Tensorflow `set_random_seed` 不起作用TensorFlow:不可重复结果如何获得Tensorflow 中可重现的结果如何使用 TensorFlow 获得稳定的结果,设置随机种子)但是我无法得到我想要的行为。

例如玩具代码

import tensorflow as tf
tf.set_random_seed(0)
a = tf.random_uniform([1], seed=1)

def foo(s, a, msg):
    with s.as_default(): print msg, a.eval(), a.eval(), a.eval(), a.eval()


s = tf.Session()
foo(s, a, 'run1 (first session):')

# resetting seed does not reset sequence. is there anything else I can do?
tf.set_random_seed(0)
foo(s, a, 'run2 …
Run Code Online (Sandbox Code Playgroud)

python random deterministic tensorflow

5
推荐指数
0
解决办法
532
查看次数

如何在张量流中追踪 NaN

我有一个处理图像的 VAE。如果我使用交叉熵、L1 或 L2 损失,则一切正常。如果我使用 MS-SSIM 损失,它可以在 <=128px 的图像上正常工作,但在 >128px 的图像上我得到 NaN(在几次迭代之后,通常在 5K 迭代之前)。使用 L1、L2 或 CE 损失的任何尺寸的图像都没有问题,使用 <=128px 的图像时 MS-SSIM 没有问题。

我的问题有两个:

  1. 在这种特殊情况下,这个 NaN 来自哪里。代码本身对我来说看起来很安全。(除非它是一个消失的梯度问题)。
  2. 如何在 tensorflow 中调试 NaN 以对其进行跟踪。我查看了调试器,但不知道如何处理它

细节:

损失函数的构造如下:

 if loss_fn == 0: self.gen_loss = tf.reduce_mean ( msa.tf.mmath.ce_loss(msa.tf.mmath.lmap(self.x, input_range, (0,1)), msa.tf.mmath.lmap(self.y, output_range, (0,1))) )# / data_size
 elif loss_fn == 1: self.gen_loss = self.l1_loss
 elif loss_fn == 2: self.gen_loss = self.l2_loss
 elif loss_fn == 3: self.gen_loss = 1.0 - tf.reduce_mean( msa.tf.ssim.ms_ssim(self.x, self.y) ) # see end of …
Run Code Online (Sandbox Code Playgroud)

python debugging nan tensorflow

5
推荐指数
0
解决办法
675
查看次数

对于shared_ptrs的random_shuffle向量是不好(甚至是危险的)?

using namespace std;
vector< shared_ptr<MyObject> > objects;

// objects gets filled in by something

random_shuffle(objects.begin(), objects.end());
Run Code Online (Sandbox Code Playgroud)

这有什么不好或效率低吗?有没有更好的方法呢?(我希望我的智能指针数组随机排序)

编辑:我问,因为会有很多交换,因为我不知道幕后的实现,我想知道是否有可能:

  • 许多参考计数可能像疯狂一样上下起伏,影响性能
  • 更糟糕的是,是否有可能导致内存泄漏的循环引用

c++ shuffle smart-pointers vector shared-ptr

3
推荐指数
1
解决办法
255
查看次数

如何在 tensorflow C/C++ 中输入和检索 LSTM 的状态

我想在python中构建和训练一个多层LSTM模型(stateIsTuple=True),然后在C++中加载和使用它。但是我很难弄清楚如何在 C++ 中提供和获取状态,主要是因为我没有可以引用的字符串名称。

例如,我将初始状态放在一个命名范围内,例如

    with tf.name_scope('rnn_input_state'):
        self.initial_state = cell.zero_state(args.batch_size, tf.float32)
Run Code Online (Sandbox Code Playgroud)

这出现在下图中,但是我如何在 C++ 中输入这些内容?

在此处输入图片说明

另外,如何在 C++ 中获取当前状态?我在 python 中尝试了下面的图形构造代码,但我不确定这是否正确,因为 last_state 应该是张量元组,而不是单个张量(尽管我可以看到张量板中的 last_state 节点是 2x2x50x128,这听起来像是连接了状态,因为我有 2 层,128 rnn 大小,50 迷你批量大小和 lstm 单元 - 具有 2 个状态向量)。

    with tf.name_scope('outputs'):
        outputs, last_state = legacy_seq2seq.rnn_decoder(inputs, self.initial_state, cell, loop_function=loop if infer else None)
        output = tf.reshape(tf.concat(outputs, 1), [-1, args.rnn_size], name='output')
Run Code Online (Sandbox Code Playgroud)

这就是张量板中的样子

在此处输入图片说明

我是否应该连接和拆分状态张量,以便只有一个状态张量进出?或者,还有更好的方法?

PS 理想情况下,该解决方案不会涉及对层数(或 rnn 大小)进行硬编码。所以我可以只有四个字符串 input_node_name、output_node_name、input_state_name、output_state_name,其余的都是从那里派生的。

c++ lstm tensorflow recurrent-neural-network

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

将包含对象的列表转换为包含这些对象的特定函数或属性的列表

鉴于:

obj_list = [obj0, obj1, obj2, obj3...]
Run Code Online (Sandbox Code Playgroud)

我想要:

names_list = [obj0.name(), obj1.name(), obj2.name(), obj3.name()...]
paths_list = [obj0.path(), obj1.path(), obj2.path(), obj3.path()...]
Run Code Online (Sandbox Code Playgroud)

所以出于调试目的,我可以这样做:

print names_list
Run Code Online (Sandbox Code Playgroud)

要么

if my_path not in paths_list ...
Run Code Online (Sandbox Code Playgroud)

当然我可以做

name_list =[]
path_list = []
for obj in obj_list:
    name_list.append(obj.name())
    path_list.append(obj.path())
Run Code Online (Sandbox Code Playgroud)

但是我不妨在C中写这个.当然有一种python方式在一个小命令中这样做,但我找不到它.

我顺便使用python 2.7

python list python-2.7

0
推荐指数
1
解决办法
47
查看次数