- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 LSTM 单元和 Tensorflow 创建文本生成神经网络。我正在以时间主格式 [time_steps、batch_size、input_size] 的句子训练网络,并且我希望每个时间步都预测序列中的下一个单词。该序列在时间步长之前用空值填充,并且单独的占位符包含批处理中每个序列的长度。
有很多关于随时间反向传播概念的信息,但是我找不到有关 tensorflow 中用于可变长度序列成本计算的实际实现的任何信息。由于序列的末尾已填充,我假设我不想计算填充部分的成本。所以我需要一种方法将输出从第一个输出剪辑到序列的末尾。
这是我目前拥有的代码:
outputs = []
states = []
cost = 0
for i in range(time_steps+1):
output, state = cell(X[i], state)
z1 = tf.matmul(output, dec_W1) + dec_b1
a1 = tf.nn.sigmoid(z1)
z2 = tf.matmul(a1, dec_W2) + dec_b2
a2 = tf.nn.softmax(z2)
outputs.append(a2)
states.append(state)
#== calculate cost
cost = cost + tf.nn.softmax_cross_entropy_with_logits(logits=z2, labels=y[i])
optimizer = tf.train.AdamOptimizer(0.001).minimize(cost)
此代码无需可变长度序列即可工作。但是,如果我在末尾添加了填充值,那么它也会计算填充部分的成本,这没有多大意义。
如何只计算序列长度上限之前的输出成本?
最佳答案
解决了!
在深入研究了很多示例之后(大多数都在更高级别的框架中,例如 Keras,这很痛苦),我发现您必须创建一个掩码!回想起来似乎很简单。
以下代码用于创建 1 和 0 的掩码,然后按元素将其与矩阵相乘(这将是成本值)
x = tf.placeholder(tf.float32)
seq = tf.placeholder(tf.int32)
def mask_by_length(input_matrix, length):
'''
Input matrix is a 2d tensor [batch_size, time_steps]
length is a 1d tensor
length refers to the length of input matrix axis 1
'''
length_transposed = tf.expand_dims(length, 1)
# Create range in order to compare length to
range = tf.range(tf.shape(input_matrix)[1])
range_row = tf.expand_dims(range, 0)
# Use the logical operations to create a mask
mask = tf.less(range_row, length_transposed)
# cast boolean to int to finalize mask
mask_result = tf.cast(mask, dtype=tf.float32)
# Element-wise multiplication to cancel out values in the mask
result = tf.multiply(mask_result, input_matrix)
return result
mask_values = mask_by_length(x, seq)
输入值(主要时间)[time_steps,batch_size]
[[ 0.71, 0.22, 1.42, -0.28, 0.99] [ 0.41、2.24、0.09、0.74、0.65]]
序列值[batch_size]
[2, 3]
输出(主要时间)[time_steps,batch_size]
[[ 0.71, 0.22, 0, 0, 0, ] [ 0.41, 2.24, 0.09, 0, 0, ]]
关于python - 计算每个时间步长的可变长度输出的成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48040685/
我想计算一个圆上的所有点。我已经知道我可以使用 x = r * cos(theta) + x0, y = r * sin(theta) + y0 来计算点 - 但是我想知道是否有是根据我的像素 Can
我正在 pyqt 中构建一个工具,它有一个 slider 可以对几何区域进行排序。在某些情况下,数据的平均值或最小面积值与最大值之间可能存在极大差距。 让它像:面积 = [0.5、1.0、1.3、1.
我使用基本的指数移动平均线对一些数据进行平滑处理 filter : int main () { double a0 = 0.1; double input = 8.0; dou
给定一个整数列表是否存在找到值之间最大距离的默认方法? 所以如果我有这个数组 [1, 3, 5, 9, 15, 30] 值之间的最大步长是 15。列表对象是否有这样做的方法? 最佳答案 不,list
我试图通过每张幻灯片上 10 的幂来更改 slider 步长,但它无法正常工作。我不确定是应该使用 stepUp() 还是直接更改 step 的值。 这就是我如何增加 10 的幂: var incre
我有一个 python 函数,它接受一堆(1 个或 2 个)参数并返回一个二维数组。我一直在尝试使用 scipy curve_fit 和 least_squares 来优化输入参数,以便生成的二维数组
是否可以让 step 忽略 min 属性? 现在,它的步骤如下:2, 7, 12, 17, ... 相反,我希望它是:2, 5, 10, 15, 20, ... 我的真实代码实际上使用了这样的动态值
是否可以在纯css中设置一些宽度变化的步骤? 假设我的 div 宽度为 100%,因此当容器为 30px 时,它的宽度将为 30px。但是是否可以将一些“跳转”设置为 20px,以便当容器为 30px
抱歉问题措辞。如果您能想到更好的方式来表达问题,请进行编辑。 要一次一步地遍历 std::vector v,我们有很多选择。以下是一些立即浮现在脑海中的内容: 1. for ( auto & elem
我正在使用 Matlab 求解微分方程。我想强制 ode45 采取恒定步长,因此它在求解方程时总是在 T 轴上递增 0.01。我该怎么做? ode45 始终采取优化的随机步骤,我似乎无法弄清楚如何使其
我是一名优秀的程序员,十分优秀!