Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tensorflow.map_fn引发错误:TensorArray数据类型为双精度,但Op正在尝试写入数据类型浮点。_Python_Tensorflow - Fatal编程技术网

Python tensorflow.map_fn引发错误:TensorArray数据类型为双精度,但Op正在尝试写入数据类型浮点。

Python tensorflow.map_fn引发错误:TensorArray数据类型为双精度,但Op正在尝试写入数据类型浮点。,python,tensorflow,Python,Tensorflow,我运行的代码实现了一个和积网络 #SPN architecture D = 10 K = 100 N = 3 def lang_model(sample): #MODEL #1st layer prev_ivs = tf.one_hot(sample, K) #2nd layer S1 = tf.matmul(W1,prev_ivs, transpose_b=True) #3rd layer S2 = tf.transpose(tf

我运行的代码实现了一个和积网络

#SPN architecture
D = 10
K = 100
N = 3

def lang_model(sample):
    #MODEL

    #1st layer
    prev_ivs = tf.one_hot(sample, K)

    #2nd layer
    S1 = tf.matmul(W1,prev_ivs, transpose_b=True)

    #3rd layer
    S2 = tf.transpose(tf.matmul(W2, tf.reshape(S1, [1, N*D]), transpose_b=True))

    #4th layer
    P1 = tf.multiply(S2, S2)

    #5th layer
    S3 = tf.add(tf.multiply(S2, W3_1), tf.multiply(P1, W3_2))

    #6th layer
    #output layer
    prob_labels = tf.multiply(W4,S3)
    norm_const = tf.matmul(W4,S3, transpose_b=True)
    return (prob_labels, norm_const)


#input
inputs = tf.placeholder(tf.int64, shape=[None,N])

labels = tf.placeholder(tf.int64,shape=[None])

# sums weights
W1 = tf.get_variable('W1', initializer=tf.random_normal([D, K], stddev=0.03))
W2 = tf.get_variable('W2', initializer=tf.random_normal([K, D * N], stddev=0.03))
W3_1 = tf.get_variable('W3_1', initializer=tf.random_normal([K], stddev=0.03))
W3_2 = tf.get_variable('W3_2', initializer=tf.random_normal([K], stddev=0.03))
W4 = tf.get_variable('W4', initializer=tf.random_normal([1,K], stddev=0.03))
tf.get_variable_scope().reuse_variables()

batch_results = tf.map_fn(lang_model, inputs, dtype=(tf.float64, tf.float64))
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    input = np.array([[34, 59, 6],[5,95,13]])
    label = [5, 76]
    feed_dict ={inputs: input, labels: label}
    test = sess.run(batch_results, feed_dict=feed_dict)
    print(str(test))
出现以下错误:

InvalidArgumentError(see above for traceback): TensorArray dtype is double but Op is trying to write dtype float. 
[[Node: map / while / TensorArrayWrite_1 / TensorArrayWriteV3 = TensorArrayWriteV3[T=DT_FLOAT, _class=["loc:@map/while/MatMul_3"], _device="/job:localhost/replica:0/task:0/device:CPU:0"](map / while / TensorArrayWrite_1 / TensorArrayWriteV3 / Enter, map / while / Identity, map / while / MatMul_3, map / while / Switch_2:1)]] 
Process finished with exit code 1 

我无法理解这是我的代码问题还是tensorflow中的map_fn问题。Double应该是tf.float64,不是吗?因此,我尝试将占位符设置为tf.float64,然后在lang_模型内将其转换为tf.int64,但错误仍然会上升。问题是,
lang_模型
返回
float32
s,而
map_fn
说它返回
float64
s。解决此问题的一种方法是将函数的输出转换为
float64
s:

prob_labels = tf.cast(tf.multiply(W4,S3), tf.float64)
norm_const = tf.cast(tf.matmul(W4,S3, transpose_b=True), tf.float64)