更新:我已经在 librosa 中重新实现了这个进行比较,结果确实与 tensorflow 的结果非常不同。Librosa 给出了我期望的结果(但不是 tensorflow)。
我已将此作为问题发布到 tensorflow repo 上,但那里很安静,所以我在这里尝试。此外,我不确定这是 tensorflow 中的错误,还是代表我的用户错误。为了完整起见,我也将在此处包含完整的源代码和结果。
A.) 当我使用 hann 窗口(也尝试过汉明)从具有frame_length=1024和 frame_step=256(即 25% 跳大小,75% 重叠)的信号创建帧,然后使用 重建时overlap_and_add,我希望信号能够正确重建(因为可乐等)。但相反,它的幅度恰好是两倍。我需要将结果信号除以二才能正确。
B.) 如果我使用 STFT 创建一系列重叠的频谱图,然后使用逆 STFT 重建,再次使用frame_length=1024和frame_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) 我有一个包含 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) 我有一个处理图像的 VAE。如果我使用交叉熵、L1 或 L2 损失,则一切正常。如果我使用 MS-SSIM 损失,它可以在 <=128px 的图像上正常工作,但在 >128px 的图像上我得到 NaN(在几次迭代之后,通常在 5K 迭代之前)。使用 L1、L2 或 CE 损失的任何尺寸的图像都没有问题,使用 <=128px 的图像时 MS-SSIM 没有问题。
我的问题有两个:
细节:
损失函数的构造如下:
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) 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)
这有什么不好或效率低吗?有没有更好的方法呢?(我希望我的智能指针数组随机排序)
编辑:我问,因为会有很多交换,因为我不知道幕后的实现,我想知道是否有可能:
我想在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,其余的都是从那里派生的。
鉴于:
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 ×4
tensorflow ×4
c++ ×2
debugging ×1
list ×1
lstm ×1
nan ×1
python-2.7 ×1
random ×1
shared-ptr ×1
shuffle ×1
time-series ×1
vector ×1