- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在带有 BasicLSTMCells 的 tensorflow 中使用循环神经网络。基本上,我有一个单词 id 的输入序列,我将每个 id 转换为单词嵌入,通过 rnn 一次传递一个单词嵌入,然后在读取整个序列后对单个单词进行预测。我的嵌入矩阵的维度为 V x H,其中 V 是我的词汇表的大小,H 是我的 rnn 中隐藏单元的数量。为了预测下一个单词,我将隐藏向量乘以大小为 H x V 的权重矩阵,然后计算 softmax。使用我描述的设置,一切似乎都按预期工作。我能够训练一些例子并做出合理的预测。但是,我注意到如果我尝试使用嵌入矩阵的转置,这将是一个大小为 H x V 的矩阵,而不是用于 softmax 层的单独矩阵,tensorflow 会引发一个值错误,声称尺寸为它没有指定的东西没有相同的等级。我已经验证了我的嵌入矩阵(嗯,它的转置)的维度与我正在创建的单独 softmax 矩阵的维度相同。仅更改使用我的嵌入矩阵与单独的 softmax 权重矩阵的一行代码会导致错误。我创建了一个相对较小的程序来演示我正在尝试做什么并说明导致错误的原因。当我尝试只使用一个隐藏层网络时,我无法在较小的网络上发生错误。
import sys
import time
import tensorflow as tf
from tensorflow.models.rnn import rnn
from tensorflow.models.rnn import rnn_cell
from tensorflow.models.rnn.rnn_cell import BasicLSTMCell
import numpy as np
INPUT_LENGTH = 17
BATCH_SIZE = 20
VOCAB_SIZE = 11
NUM_EPOCHS = 1000
HIDDEN_UNITS = 100
class Model(object):
def __init__(self, is_training):
initializer = tf.random_uniform_initializer(-1.0, 1.0)
self._target = tf.placeholder(tf.float32, [BATCH_SIZE, VOCAB_SIZE])
self._input_data=tf.placeholder(tf.int32,[BATCH_SIZE, INPUT_LENGTH])
self.embedding = tf.get_variable("embedding",
[VOCAB_SIZE, HIDDEN_UNITS],
initializer=initializer)
self.inputs = tf.split(1, INPUT_LENGTH,
tf.nn.embedding_lookup(self.embedding, self._input_data))
self.inputs2 = [tf.squeeze(input_, [1]) for input_ in self.inputs]
cell = rnn_cell.BasicLSTMCell(num_units=HIDDEN_UNITS)
initial_state = cell.zero_state(BATCH_SIZE, tf.float32)
outputs, states = rnn.rnn(cell, self.inputs2,
initial_state=initial_state)
self._outputs = outputs[-1]
self.soft_w = tf.get_variable("softmax_w",
[HIDDEN_UNITS, VOCAB_SIZE],
initializer=initializer)
prod = tf.matmul(self._outputs, self.soft_w)
#uncommenting out the following line causes the error
# prod = tf.matmul(self._outputs, self.embedding, False, True)
soft_b = tf.get_variable("softmax_b", [VOCAB_SIZE],
initializer=initializer)
self._logits = tf.nn.bias_add(prod,soft_b)
self._loss = tf.nn.softmax_cross_entropy_with_logits(self._logits,
self._target)
if not is_training:
return
learning_rate = .010001
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
self._train_op = optimizer.minimize(self._loss)
def train(self, sess, inputs, targets):
t = np.zeros((BATCH_SIZE, VOCAB_SIZE))
for i, target in enumerate(targets):
t[i,target] = 1.0
inputs = np.array(inputs)
inputs = inputs.reshape(BATCH_SIZE,INPUT_LENGTH)
fd = {self._target:t,
self._input_data:inputs}
o = sess.run([self._train_op, self._loss, self._outputs, self.embedding, self.soft_w], feed_dict = fd)
print o[2].shape
print o[3].shape
print o[4].shape
sys.exit()
return np.mean(o[1])
#this just generates dummy data
def read_data_rows(count):
ret = []
for i in range(count):
inputs = [4] * INPUT_LENGTH
output = 1
ret.append((inputs, output))
return ret
def main():
start = time.time()
tf.set_random_seed(1)
print "creating model",time.time()-start
m = Model(is_training=True)
with tf.Session() as sess:
print "initializing variables", time.time()-start
tf.initialize_all_variables().run()
for epoch in range(NUM_EPOCHS):
train_rows = read_data_rows(100)
for row_num in range(0, len(train_rows), BATCH_SIZE):
qs = []
ans = []
batch = train_rows[row_num:row_num+BATCH_SIZE]
for b in batch:
qs.append(b[0])
ans.append(b[1])
m.train(sess, qs, ans)
if __name__ == "__main__":
main()
我看到的错误是 ValueError: Shapes TensorShape([Dimension(100)]) and TensorShape([Dimension(17), Dimension(100)]) must have the same rank取消注释我上面提到的行时。我看到的错误的原因是什么?为什么嵌入矩阵的处理方式与矩阵 self.soft_w 不同?
最佳答案
TensorFlow 的 0.6.0(及更早版本)版本在 tf.nn.embedding_lookup()
和 tf.gather()
的渐变实现中存在错误当索引参数(self._input_data
在您的代码中)有多个维度时。
升级到最新的源版本应该可以修复这个错误。否则,this commit进行了相关更改(对 array_grad.py
)将使您的程序能够运行。
关于python - Tensorflow backprop 通过 rnn ValueError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34363549/
刚刚用 python 编写了我的第一个神经网络类。据我所知,一切都应该有效,但其中有一些我似乎找不到的错误(可能正盯着我的脸)。我首先在 MNIST 数据的 10,000 个示例上进行了尝试,然后在尝
我在带有 BasicLSTMCells 的 tensorflow 中使用循环神经网络。基本上,我有一个单词 id 的输入序列,我将每个 id 转换为单词嵌入,通过 rnn 一次传递一个单词嵌入,然后在
我正在尝试通过多次向后传递迭代运行它并在每一步更新输入来最小化与某个目标相关的一些输入。第一遍运行成功,但第二遍出现以下错误: RuntimeError:变量元组的元素 0 是易变的 此代码片段演示了
在查看 Tensorflow 1.15 中的 OptimizerV2 代码时,我注意到他们使用 backprop.GradientTape 来计算梯度。 我找不到任何关于此类的在线引用,只能找到 tf
我正在尝试使用 TensorFlow 2.0 应用引导式反向传播 ( https://arxiv.org/abs/1412.6806 )。要应用引导反向传播,我们需要修改 relu 梯度。我读了How
我从 Tensorflow 2.0 开始,并尝试实现 Guided BackProp 以显示显着图。我首先计算图像的 y_pred 和 y_true 之间的损失,然后找到由于这种损失导致的所有层的梯度
我是一名优秀的程序员,十分优秀!