我正在使用Tensorflow中的LSTM-RNN训练一些音乐数据,并遇到了一些我不理解的GPU内存分配问题:我遇到一个OOM,而实际上似乎还有足够的VRAM可用.一些背景:我正在研究Ubuntu Gnome 16.04,使用的是GTX1060 6GB,Intel Xeon E3-1231V3和8GB RAM.所以现在首先是我能理解的错误消息的一部分,并且我将在最后为可能要求它提供帮助的任何人添加整个错误消息:
I tensorflow/core/common_runtime/bfc_allocator.cc:696] 8 Chunks of size 256 totalling 2.0KiB I tensorflow/core/common_runtime/bfc_allocator.cc:696] 1 Chunks of size 1280 totalling 1.2KiB I tensorflow/core/common_runtime/bfc_allocator.cc:696] 5 Chunks of size 44288 totalling 216.2KiB I tensorflow/core/common_runtime/bfc_allocator.cc:696] 5 Chunks of size 56064 totalling 273.8KiB I tensorflow/core/common_runtime/bfc_allocator.cc:696] 4 Chunks of size 154350080 totalling 588.80MiB I tensorflow/core/common_runtime/bfc_allocator.cc:696] 3 Chunks of size 813400064 totalling 2.27GiB I tensorflow/core/common_runtime/bfc_allocator.cc:696] 1 Chunks of size 1612612352 totalling 1.50GiB I tensorflow/core/common_runtime/bfc_allocator.cc:700] Sum Total of in-use chunks: 4.35GiB I tensorflow/core/common_runtime/bfc_allocator.cc:702] …
在tensorflow层中.dense(输入,单位,激活)实现具有任意激活功能的多层感知器层。
输出=激活(matmul(输入,权重)+偏差)
通常,输入的形状为shape = [batch_size,input_size],可能看起来像这样:(单位= 128,激活= tf.nn.relu是任意选择的)
inputx = tf.placeholder(float, shape=[batch_size, input_size])
dense_layer = tf.layers.dense(inputx, 128, tf.nn.relu)
Run Code Online (Sandbox Code Playgroud)
我没有找到任何有关如何输入高维输入的文档,例如,因为可能输入time_steps导致张量为shape = [time_step,batch_size,input_size]。这里想要的是将层应用于批次的每个元素的每个时间步的每个单个input_vector。换个说法,layers.dense()的内部矩阵应该简单地以numpy样式使用广播。我在这里期望的行为实际发生了什么?即是:
inputx = tf.placeholder(float, shape=[time_step, batch_size, input_size])
dense_layer = tf.layers.dense(inputx, 128, tf.nn.relu)
Run Code Online (Sandbox Code Playgroud)
在batch_size中的每个元素的每个time_step上,将密集层应用于大小为input_size的每个输入?然后这应该导致张量(在上面的density_layer中)的形状为[time_step,batch_size,128]我在问,例如tf.matmul不支持numpy风格的广播,所以我不确定张量流如何处理这些情况。
我只是想学习Tensorflow,但我对Python很新,所以我使用Anaconda我创建了一个conda环境:
$ conda create ?n tensorflow python =3.5
Run Code Online (Sandbox Code Playgroud)
当然我激活了我的conda环境
$ source activate tensorflow
Run Code Online (Sandbox Code Playgroud)
然后我在Spyder玩了一下,试图绘制一个MNIST数字(我的导师的复制粘贴代码经过多次测试),当然包括
import matplotlib.pyplot as plt
[...]
plt.plot(number)
Run Code Online (Sandbox Code Playgroud)
但用bash执行Python文件给了我:
(tensorflow) leon@leon-linux:~/ANNsCourse/Session1$ python helloWorld.py
Traceback (most recent call last):
File "helloWorld.py", line 10, in <module>
import matplotlib.pyplot as plt
ImportError: No module named 'matplotlib'
Run Code Online (Sandbox Code Playgroud)
我现在很困惑,因为(tensorflow)在bash中显然表示我的conda tensorflow环境有效(至少从我的理解).另外,根据我的理解,conda应该内置matplotlib,对吧?它还应该在我的conda tensorflow环境中加载它,对吧?这就是我的导师的幻灯片所说的
没有必要安装更多的软件包,如numpy或matplotlib,因为Anaconda已经包含了它们的当前版本.
以及我从Google Googled和StackOverflowed所能获得的东西.谷歌搜索和StackOverflowing都没有给我任何好的答案(也可能只是因为我还不够了解).
我最好的猜测是我仍然需要将matplotlib包含在我的tensorflow conda环境中,但这与我的导师和谷歌相矛盾,而我也不知道如何做到这一点.
编辑:conda list给了我matplotlib不在我的张量流环境中,所以我去了
conda install matplotlib
Run Code Online (Sandbox Code Playgroud)
我仍然担心我的conda tensorflow环境有问题,默认情况下matplotlib不应该在那里吗?它还告诉我:
Package plan for installation in environment /home/leon/.conda/envs/tensorflow:
The following NEW packages will be INSTALLED:
cycler: 0.10.0-py35_0 …Run Code Online (Sandbox Code Playgroud)
问题是,是否只是改变learning_rate参数tf.train.AdamOptimizer实际上会导致行为的任何变化:假设代码如下所示:
myLearnRate = 0.001
...
output = tf.someDataFlowGraph
trainLoss = tf.losses.someLoss(output)
trainStep = tf.train.AdamOptimizer(learning_rate=myLearnRate).minimize(trainLoss)
with tf.Session() as session:
#first trainstep
session.run(trainStep, feed_dict = {input:someData, target:someTarget})
myLearnRate = myLearnRate * 0.1
#second trainstep
session.run(trainStep, feed_dict = {input:someData, target:someTarget})
Run Code Online (Sandbox Code Playgroud)
myLearnRate现在减少了trainStep吗?这是,只创建trainStep一次评估的节点:
trainStep = tf.train.AdamOptimizer(learning_rate=myLearnRate).minimize(trainLoss)
Run Code Online (Sandbox Code Playgroud)
或者是否每次评估session.run(train_step)?我怎么能AdamOptimizer在Tensorflow中检查我是否确实更改了Learnrate.
免责声明1:我知道手动更改LearnRate是不好的做法.
免责声明2:我知道有一个类似的问题,但它是通过输入张量来解决的,learnRate在每个trainStep(这里)更新.这让我对假设它只会用张量作为输入工作倾斜learning_rate的AdamOptimizer,但我也不是确信这一点,我也能理解它背后的原因.
在尝试使用此处记录的基本 LSTM 单元在 Tensorflow 中复制 LSTM 单元的权重时,我偶然发现了 trainable_weights 和 trainable_variables 属性。
可悲的是,源代码对于像我这样的菜鸟来说并没有真正提供信息。不过,一些实验确实产生了以下信息:两者都具有完全相同的布局,都是长度为 2 的列表,其中第一个条目是 tf.Variable 形状:(2*num_units, 4*num_units),第二个列表条目的形状为 (4*num_units,),其中 num_units 是初始化 BasicLSTMCell 的 num_units。我现在的直觉猜测是,第一个列表项是 lstm 的四个内部层的权重的串联,第二个项目是各个偏差的串联,显然符合这些偏差的预期大小。
现在的问题是,这些之间实际上是否有任何区别?我认为它们可能只是从 rnn_cell 类继承这些的结果?
(使用python)
我对Tensorflow LSTM-Implementation有一个疑问.目前在TF中有几种实现,但我使用:
cell = tf.contrib.rnn.BasicLSTMCell(n_units)
Run Code Online (Sandbox Code Playgroud)
然后得到我的输出我打电话:
rnn_outputs, rnn_states = tf.nn.dynamic_rnn(cell, x,
initial_state=initial_state, time_major=False)
Run Code Online (Sandbox Code Playgroud)
time_major=False)x的形状(batch_size, time_steps, input_length)batch_size我的batch_size 在哪里time_steps是时间步我RNN将通过量input_length一个输入向量的长度(在一个特定批次的一个特定时间步长上送入网络的向量)我希望rnn_outputs有形,(batch_size, time_steps, n_units, input_length)因为我没有指定另一个输出大小.文档nn.dynamic_rnn告诉我输出的形状(batch_size, input_length, cell.output_size).文档tf.contrib.rnn.BasicLSTMCell确实有一个属性output_size,默认为n_units(我使用的LSTM单元格的数量).
那么每个LSTM-Cell是否只为每个给定的时间步输出一个标量?我希望它输出一个输入向量长度的向量.从我现在的理解情况来看,情况似乎并非如此,所以我很困惑.你能告诉我是否是这种情况或我如何改变它以输出每个单个lstm-cell的输入矢量大小的矢量?
我搜索了很多答案,但只找到了一个问题,即是否可以在另一个班级写一个类和类似的东西.
所以有第一个文件,它是:
文档1:
class MyClass1 {
private $myAttribute1;
__construct(){
this->myAttribute1 = 'blabla';
}
}
Run Code Online (Sandbox Code Playgroud)
现在打电话给同一份文件
$myObject1 = new MyClass1();
Run Code Online (Sandbox Code Playgroud)
在NetBeans中完全正常工作.
同时当我构建另一个文档时,我们称之为Document2,并在那里构建另一个类MyClass1,Netbeans告诉我有一个问题:
书2:
myClass2 {
$myAttribute2 = new myClass1();
}
Run Code Online (Sandbox Code Playgroud)
所以这在我的NetBeans中不起作用,只是告诉我'意想不到的新'.我如何使用MyClass1,myClass2因为这种方式不起作用?
tensorflow ×6
python ×4
lstm ×2
conda ×1
gpu ×1
importerror ×1
matplotlib ×1
output ×1
php ×1
vram ×1