给定训练有素的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) 我正在设置一个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管道之前,使用 …
有一段时间,我注意到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似乎不太可能.
我做的事情是为了找到更多关于这个问题的原因:
分析TensorFlow的设备位置,一切似乎都在gpu:/ 0上,所以看起来不错.
使用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)在多台计算机上运行以排除硬件问题.
大约一周前升级到最新版本的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
OpenCV 的颜色图数量有限。MatplotLib 有更多的颜色图,但将这些颜色图应用于给定的 OpenCV 图像并不简单。使用 Python API 时如何将以下页面中的 MatplotLib 颜色映射应用于 OpenCV 图像?这类似于将自定义颜色图应用于给定图像。
https://matplotlib.org/examples/color/colormaps_reference.html
TLDR; 我的问题是如何从TFRecords加载压缩视频帧.
我正在建立一个数据管道,用于在大型视频数据集(Kinetics)上训练深度学习模型.为此,我使用的是TensorFlow,更具体地说是结构tf.data.Dataset和TFRecordDataset结构.由于数据集包含大约30万个10秒的视频,因此需要处理大量数据.在训练期间,我想从视频中随机采样64个连续帧,因此快速随机采样非常重要.为实现这一目标,培训期间可能存在许多数据加载方案:
ffmpegor OpenCV和示例帧加载视频.在视频中寻找是不太理想的,并且解码视频流比解码JPG要慢得多.TFRecords或HDF5文件.需要更多工作才能准备好管道,但最有可能是这些选项中最快的.我决定使用选项(3)并使用TFRecord文件来存储数据集的预处理版本.但是,这也不像看起来那么简单,例如:
我编写了以下代码来预处理视频数据集,并将视频帧写为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
我正在尝试从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 中的视频帧?
非常欢迎所有建议!
由于 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)