背景
在用tensorflow进行神经网络建模的学习中,发现教程里在不同的位置用到了tf.argmax和np.argmax, 作用基本相同,都是反馈最大值的下标,于是乎甚是疑惑,这两兄弟到底有什么区别?
找度娘
百度了之后,查看了10余篇帖子,发现他们都没有提到这两兄弟的区别的精髓,经过实践后,本新手有了些心得,下面阐述下我的理解
相同点
这方面很多帖子说的很明白了,不赘述。简单说,语法规则基本一致,如下所示:
tf.argmax(
input,
axis=None,
name=None,
dimension=None,
output_type=tf.int64
)
input是任意维度的数组或tensor,是必选项,其余参数皆为可选。
一般只需要用到input 、axis两个参数,axis参数取值为0时,函数反馈的是第一维的下标,简单说就是,如果input是个二维数组,函数通过比较每一列的数的大小,最终反馈数值最大的行标;类似的,axis=1时反馈的是第二维的下标;axis=-1时反馈的是最后一维的下标。
不同点
这是本帖子的精髓
1、虽然两兄弟的作用都是一样,但是返回的值的类型不同,tf反馈的是一个tensor,np反馈的是一个array。
有什么区别?像我一样的新手,可能会弄不清汤,简单说,就是tensor必须要sess.run了之后才会输出tensor的值,而array可以直接输出。见如下代码:
In[1]:tf.argmax([[2, 3, 1], [8, 2, 4]], axis=1)
Out[1]: <tf.Tensor 'ArgMax_29:0' shape=(2,) dtype=int64>
In[2]: np.argmax([[2, 3, 1], [8, 2, 4]], axis=1)
Out[2]: array([1, 0], dtype=int64)
因此,如果要print(np.argmax([[2, 3, 1], [8, 2, 4]], axis=1))能直接得到array[1, 0], 而要想通过tf输出array[1, 0], 只能print(sess.run(tf.argmax([[2, 3, 1], [8, 2, 4]], axis=1)),注意中间增加了sess.run
2、当input为tensor的时候,最好用tf,否则np在识别tensor的维度时可能出错;同理,当input为array时,最好用np,更方便。