我有以下代码:
norm_embed = tf.sqrt(tf.reduce_sum(tf.multiply(embeddings, embeddings), 1))
comparison = tf.greater(norm_embed, tf.constant(1.))
cond_assignment = tf.assign(embeddings, tf.where(comparison, embeddings/norm_embed, embeddings))
我尝试做的是我有一个embeddings
形状的[V, 1]
矩阵。我想规范化行的规范大于1的那些行。
但是,我得到了ValueError:
ValueError:尺寸必须相等,但为2和11202 ' truediv_1' (op:' RealDiv')输入形状:[11202,2],[11202]。
我理解矩阵norm_embed
具有[V]
形状,但在分段[V, k]
矩阵中,矢量[V]
应该广播后者[V, 1]
。我不明白为什么它没有发生。我也尝试将矢量重塑为then
形状,但它没有帮助。
为什么我在规范化期间收到ValueError?当超过值时,可能有其他方法来规范化行?
答案 0 :(得分:0)
代码有两个错误。
首先,我们需要重塑norm_embed
以获得两个维度:
norm_embed = tf.reshape(norm_embed, [V, 1])
其次,我们需要重塑比较运算符,只有1维。
comparison = tf.reshape(comparison, [vocabulary_size])
该代码起作用后:
norm_embed = tf.sqrt(tf.reduce_sum(tf.multiply(embeddings, embeddings), 1))
norm_embed = tf.reshape(norm_embed, [V, 1])
comparison = tf.greater(norm_embed, tf.constant(1.))
comparison = tf.reshape(comparison, [V])
replacement = tf.where(comparison, embeddings/norm_embed, embeddings)
cond_assignment = tf.assign(embeddings, replacement)