小编ver*_*man的帖子

TensorFlow:记住下一批次的LSTM状态(有状态LSTM)

给定训练有素的LSTM模型,我想对单个时间步进行推理,即seq_length = 1在下面的示例中.在每个时间步之后,需要记住内部LSTM(内存和隐藏)状态以用于下一个"批处理".在推理的最开始,init_c, init_h给定输入计算内部LSTM状态.然后将它们存储在LSTMStateTuple传递给LSTM 的对象中.在训练期间,每个时间步都更新此状态.然而,对于推理,我希望state在批次之间保存,即初始状态只需要在开始时计算,然后在每个"批次"(n = 1)之后保存LSTM状态.

我发现这个相关的StackOverflow问题:Tensorflow,在RNN中保存状态的最佳方法?.但是,这仅在以下情况下有效state_is_tuple=False,但TensorFlow很快就会弃用此行为(请参阅rnn_cell.py).Keras似乎有一个很好的包装器可以使有状态的 LSTM成为可能,但我不知道在TensorFlow中实现这一目标的最佳方法.TensorFlow GitHub上的这个问题也与我的问题有关:https://github.com/tensorflow/tensorflow/issues/2838

有关构建有状态LSTM模型的任何好建议吗?

inputs  = tf.placeholder(tf.float32, shape=[None, seq_length, 84, 84], name="inputs")
targets = tf.placeholder(tf.float32, shape=[None, seq_length], name="targets")

num_lstm_layers = 2

with tf.variable_scope("LSTM") as scope:

    lstm_cell  = tf.nn.rnn_cell.LSTMCell(512, initializer=initializer, state_is_tuple=True)
    self.lstm  = tf.nn.rnn_cell.MultiRNNCell([lstm_cell] * num_lstm_layers, state_is_tuple=True)

    init_c = # compute initial LSTM memory state using contents in placeholder 'inputs'
    init_h = # compute initial LSTM …
Run Code Online (Sandbox Code Playgroud)

python stateful lstm tensorflow recurrent-neural-network

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

TensorFlow - tf.data.Dataset读取大型HDF5文件

我正在设置一个TensorFlow管道,用于读取大型HDF5文件作为我的深度学习模型的输入.每个HDF5文件包含100个可变大小长度的视频,存储为压缩JPG图像的集合(以使磁盘上的大小可管理).使用tf.data.Dataset和映射tf.py_func,使用自定义Python逻辑从HDF5文件中读取示例非常简单.例如:

def read_examples_hdf5(filename, label):
    with h5py.File(filename, 'r') as hf:
        # read frames from HDF5 and decode them from JPG
    return frames, label

filenames = glob.glob(os.path.join(hdf5_data_path, "*.h5"))
labels = [0]*len(filenames) # ... can we do this more elegantly?

dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))
dataset = dataset.map(
    lambda filename, label: tuple(tf.py_func(
        read_examples_hdf5, [filename, label], [tf.uint8, tf.int64]))
)

dataset = dataset.shuffle(1000 + 3 * BATCH_SIZE)
dataset = dataset.batch(BATCH_SIZE)
iterator = dataset.make_one_shot_iterator()
next_batch = iterator.get_next()
Run Code Online (Sandbox Code Playgroud)

这个例子有效,但问题是它似乎tf.py_func一次只能处理一个例子.由于我的HDF5容器存储了100个示例,因此这种限制会导致显着的开销,因为文件经常需要打开,读取,关闭和重新打开.将所有100个视频示例读入数据集对象然后继续使用下一个HDF5文件(最好是在多个线程中,每个线程处理它自己的HDF5文件集合)会更有效率.

所以,我想要的是在后台运行的一些线程,从HDF5文件中读取视频帧,从JPG解码它们,然后将它们提供给数据集对象.在引入tf.data.Dataset管道之前,使用 …

python video hdf5 tensorflow tensorflow-datasets

17
推荐指数
2
解决办法
7874
查看次数

TensorFlow - Titan X上的低GPU使用率

有一段时间,我注意到TensorFlow(v0.8)似乎没有完全使用我的Titan X的计算能力.对于我一直运行的几个CNN,GPU使用率似乎没有超过~30%.通常,GPU利用率甚至更低,更像是15%.显示此行为的CNN的一个特定示例是来自DeepMind的Atari论文的带有Q学习的CNN(请参阅下面的代码链接).

当我看到我们实验室的其他人运行用Theano或Torch编写的CNN时,GPU使用率通常为80%以上.这让我想知道,为什么我在TensorFlow中编写的CNN如此"慢",我该怎么做才能更有效地利用GPU处理能力呢?通常,我对如何分析GPU操作并发现瓶颈所在的方式感兴趣.任何建议如何做到这一点都非常受欢迎,因为目前TensorFlow似乎不太可能.

我做的事情是为了找到更多关于这个问题的原因:

  1. 分析TensorFlow的设备位置,一切似乎都在gpu:/ 0上,所以看起来不错.

  2. 使用cProfile,我优化了批处理生成和其他预处理步骤.预处理在单个线程上执行,但TensorFlow步骤执行的实际优化需要更长的时间(请参阅下面的平均运行时间).提高速度的一个明显想法是使用TFs队列运行器,但由于批量准备比优化快20倍,我想知道这是否会产生很大的不同.

    Avg. Time Batch Preparation: 0.001 seconds
    Avg. Time Train Operation:   0.021 seconds
    Avg. Time Total per Batch:   0.022 seconds (45.18 batches/second)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在多台计算机上运行以排除硬件问题.

  4. 大约一周前升级到最新版本的CuDNN v5(RC),CUDA Toolkit 7.5并重新安装TensorFlow.

可以在此处找到发生此"问题"的Q-learning CNN的示例:https://github.com/tomrunia/DeepReinforcementLearning-Atari/blob/master/qnetwork.py

显示低GPU利用率的NVIDIA SMI示例:NVIDIA-SMI

performance profiling gpu conv-neural-network tensorflow

15
推荐指数
1
解决办法
3161
查看次数

将 MatplotLib 或自定义颜色图应用于 OpenCV 图像

OpenCV 的颜色图数量有限。MatplotLib 有更多的颜色图,但将这些颜色图应用于给定的 OpenCV 图像并不简单。使用 Python API 时如何将以下页面中的 MatplotLib 颜色映射应用于 OpenCV 图像?这类似于将自定义颜色图应用于给定图像。

https://matplotlib.org/examples/color/colormaps_reference.html

python opencv visualization matplotlib

9
推荐指数
3
解决办法
8207
查看次数

TensorFlow - 从TFRecords文件中读取视频帧

TLDR; 我的问题是如何从TFRecords加载压缩视频帧.

我正在建立一个数据管道,用于在大型视频数据集(Kinetics)上训练深度学习模型.为此,我使用的是TensorFlow,更具体地说是结构tf.data.DatasetTFRecordDataset结构.由于数据集包含大约30万个10秒的视频,因此需要处理大量数据.在训练期间,我想从视频中随机采样64个连续帧,因此快速随机采样非常重要.为实现这一目标,培训期间可能存在许多数据加载方案:

  1. 来自视频的示例.使用ffmpegor OpenCV和示例帧加载视频.在视频中寻找是不太理想的,并且解码视频流比解码JPG要慢得多.
  2. JPG图片.通过将所有视频帧提取为JPG来预处理数据集.这会生成大量文件,由于随机访问可能不会很快.
  3. 数据容器.将数据集预处理为TFRecordsHDF5文件.需要更多工作才能准备好管道,但最有可能是这些选项中最快的.

我决定使用选项(3)并使用TFRecord文件来存储数据集的预处理版本.但是,这也不像看起来那么简单,例如:

  1. 压缩.将视频帧存储为TFRecords中的未压缩字节数据将需要大量磁盘空间.因此,我提取所有视频帧,应用JPG压缩并将压缩字节存储为TFRecords.
  2. 视频数据.我们正在处理视频,因此TFRecords文件中的每个示例都会非常大并且包含几个视频帧(对于10秒的视频,通常为250-300,具体取决于帧速率).

我编写了以下代码来预处理视频数据集,并将视频帧写为TFRecord文件(每个大小约为5GB):

def _int64_feature(value):
    """Wrapper for inserting int64 features into Example proto."""
    if not isinstance(value, list):
        value = [value]
    return tf.train.Feature(int64_list=tf.train.Int64List(value=value))

def _bytes_feature(value):
    """Wrapper for inserting bytes features into Example proto."""
    return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))


with tf.python_io.TFRecordWriter(output_file) as writer:

  # Read and resize all video frames, np.uint8 of size [N,H,W,3]
  frames = ... …
Run Code Online (Sandbox Code Playgroud)

python deep-learning tensorflow tfrecord tensorflow-datasets

7
推荐指数
2
解决办法
4039
查看次数

在 Python 中读取 h264 流

我正在尝试从Parrot Bebop 2无人机读取视频流。视频流作为 H264 流作为“套接字”写入文件。

$ ffmpeg -i [STREAM]
Input #0, h264, from 'stream_h264':
  Duration: N/A, bitrate: N/A
  Stream #0:0: Video: h264 (Constrained Baseline), 1 reference frame, yuv420p(progressive, left), 1280x720, 23.98 fps, 23.98 tbr, 1200k tbn, 47.95 tbc
Run Code Online (Sandbox Code Playgroud)

使用以下参数在 MPlayer 中读取视频流不是问题。使用 VLC 或 ffmpeg 播放它也不应该太难。对于 MPlayer,以下工作:

mplayer -fs -demuxer h264es -benchmark stream_h264
Run Code Online (Sandbox Code Playgroud)

这以高分辨率播放流。但是,我的目标是使用 Python(主要是 OpenCV)对帧执行图像处理。因此,我想将帧读入 NumPy 数组。我已经考虑过使用,cv2.VideoCapture但这似乎不适用于我的流。其他(有点容易)使用我不知道的选项,因此我的问题是是否有人推荐我如何阅读 Python 中的视频帧?

非常欢迎所有建议!

python opencv ffmpeg numpy stream

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

计算 Eigen::Matrix 的 sign() 的最佳方法

由于 Eigen C++ 库不包含计算矩阵的内置方法,因此sign(x)我正在寻找执行此操作的最佳方法。有关 的定义,sign()请参阅Matlab 文档,尽管我实际上并不需要 0 元素的情况。我想出的方法如下。

Eigen::MatrixXf a = Eigen::MatrixXf(2,2);
a << -0.5, 1.0,
      0.3, -1.4;

// Temporary objects containing 1's and -1's
const Eigen::MatrixXi pos = Eigen::MatrixXi::Ones(a.rows(), a.cols());
const Eigen::MatrixXi neg = Eigen::MatrixXi::Ones(a.rows(), a.cols()) * -1;

// Actually filling of the matrix sign(a)
Eigen::MatrixXi a_sign = (a.array() >= 0).select(pos, neg);

std::cout << a << std::endl << std::endl;
std::cout << a_sign << std::end;
Run Code Online (Sandbox Code Playgroud)

这是有效的,因此输出由下式给出

-0.5    1
 0.3 -1.4

-1  1
 1 -1 …
Run Code Online (Sandbox Code Playgroud)

c++ math matrix eigen

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