我是张力流的新手。我有以下问题:
input:浮点数列表(或动态数组。在python列表中是要使用的数据类型)
输出:是一个大小为len(input)
×len(input)
输入:
[1.0, 2.0, 3.0]
输出:
[[0.09003057, 0.24472847, 0.66524096],
[0.26894142, 0.73105858, 0.0 ],
[1.0, 0.0, 0.0 ]]
我尝试使用while
循环创建函数并独立计算每一行并连接它们,但我的导师让我探索其他方法。
您能否就如何解决此问题向我提出建议?
答案 0 :(得分:5)
您可以通过以下方法实现此目的:
tf.nn.softmax
,因为它也会为那些零提供小概率这是一个执行此操作的TensorFlow(v0.12.1)代码:
def create_softmax(x):
x_len = int(x.get_shape()[0])
# create a tiled array
# [1, 2, 3]
# =>
# [[1,2,3], [1,2,3], [1,2,3]]
x_tiled = tf.tile(tf.expand_dims(x, 0), [x_len, 1])
# get the mask to do element-wise multiplication
mask = tf.ones_like(x_tiled) # returns an array of the same size filled with 1
mask = tf.matrix_band_part(mask, 0, -1) # zeros everythings except from the upper triangular part
mask = tf.reverse(mask, [False, True]) # reverses the y dimension
# compute masked softmax
exp = tf.exp(x_tiled) * mask
sum_exp = tf.reshape(tf.reduce_sum(exp, reduction_indices=1), (-1, 1))
x_softmax = exp / sum_exp
return x_softmax
答案 1 :(得分:0)
这对你的班级来说可能有点晚了,但希望它能帮助别人。
如果您的目标是简单地输出len(input)xlen(input)
数组,则可以在将其维度扩展为1xlen(input)
之后,将len(input)x1
张量与输入数组相乘:
input_ = tf.placeholder(tf.float32, [len(input)])
input_shape = input_.get_shape().as_list()
tfvar = tf.Variable(tf.random_normal([1,input_shape[0]], mean=0.0,
stddev=.01, dtype=tf.float32))
def function(input_):
x = tf.expand_dims(input_, axis=1) # dims = len(input)x1
return tf.matmul(x,tfvar) # mtrx multiplication produces 3x3 mtrx
此函数应推广到任何1D input_
张量并产生平方len(input_)xlen(input_)
张量。
如果您的目标是训练tensorflow变量以准确生成提供的输出,则可以使用loss函数和优化器训练tfvar
:
desired_output = tf.constant([[0.09003057, 0.24472847, 0.66524096],
[0.26894142, 0.73105858, 0.0 ],
[1.0, 0.0, 0.0 ]],
dtype=tf.float32)
actual_output = function(input_)
loss = tf.reduce_mean(tf.square(actual_output-desired_output))
optimizer = tf.train.AdamOptimizer().minimize(loss)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
cost, opt = sess.run([loss, optimizer], feed_dict={input_:input})
注意,如果您想要更强大的训练课程,请添加偏差,非线性和更多图层。