如何快速打印Tensorflow结果到TXT?

How to quickly print Tensorflow results to TXT?

我想知道如何通过 Tensorflow 有效地将 NN 权重因子保存到 TXT 文件。流动是我尝试使用 fp.write 将 Tensorflow 的结果保存到 TXT 的示例。但是,当我有 4 层 NN,每层有 1000 个隐藏单元时,需要超过 1 天的时间。

fp = open('NN_for_Dymola.txt', 'w')

#############################
fp.write("********** W1 **********\n")

fp.write("[")
for i in range(n_hidden_1):
    fp.write("{"),
    if i == n_hidden_1-1: 
        for j in range(n_input):
            if j == n_input - 1:
                fp.write( '%1.10f' % sess.run(weights['h1'][j,i]) ),
            else:
                fp.write( '%1.10f,' % sess.run(weights['h1'][j,i]) ),
        fp.write( '}' ),
    else:
        for j in range(n_input):
            if j == n_input - 1:
                fp.write( '%1.10f' % sess.run(weights['h1'][j,i]) ),
            else:
                fp.write( '%1.10f,' % sess.run(weights['h1'][j,i]) ),
        fp.write( '},' ),        
fp.write( ']' )

fp.close()

非常感谢!

TL;DR: 开销来自对权重矩阵的每个 元素 调用一次 sess.run()。您可以对每个矩阵调用一次,然后改为对 Numpy 数组进行操作。


我怀疑缓慢的根源是这个表达式,它是为权重矩阵的每个元素计算的:

sess.run(weights['h1'][j, i])

为什么这么慢?首先,TensorFlow 会构造一个新的切片算子来提取索引 [j, i] 处的元素,然后调用 运行 时间到 运行 提取该值的步骤。 TensorFlow 被设计为当您一次定义一个运算符并多次使用它时是高效的。

幸运的是,您不必以这种方式访问​​各个元素。您可以调用 sess.run(weights['h1']) 一次以获取包含所有权重的 Numpy 数组,然后写出其元素。例如,下面的代码应该快得多:

h1_val = sess.run(weights['h1'])

fp = open('NN_for_Dymola.txt', 'w')

#############################
fp.write("********** W1 **********\n")

fp.write("[")
for i in range(n_hidden_1):
    fp.write("{"),
    if i == n_hidden_1-1: 
        for j in range(n_input):
            if j == n_input - 1:
                fp.write( '%1.10f' % h1_val[j,i] ),
            else:
                fp.write( '%1.10f,' % h1_val[j,i] ),
        fp.write( '}' ),
    else:
        for j in range(n_input):
            if j == n_input - 1:
                fp.write( '%1.10f' % h1_val[j,i] ),
            else:
                fp.write( '%1.10f,' % h1_val[j,i] ),
        fp.write( '},' ),        
fp.write( ']' )

fp.close()

您可以使用 numpy.savetxt() 获得更快的结果,但该方法对格式的控制较少。