1. 程式人生 > 實用技巧 >tensorflow學習:第二課,tf.constant api的使用

tensorflow學習:第二課,tf.constant api的使用

在TensorFlow API中建立常量的函式原型如下所示:

tf.constant(
    value,
    dtype=None,
    shape=None,
    name='Const',
    verify_shape=False
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

可以看到第一個值value是必須的,可以是一個數值,也可以是一個列表。
如果是數值:

tensor=tf.constant(1)
  • 1

為檢視結果必須建立一個會話,並用取值函式eval()來檢視建立的tensor的值:

sess=tf.Session()
with sess.as_default():
    print
('結果是:', tensor.eval())
  • 1
  • 2
  • 3
結果是:1
  • 1

而如果value是一個列表:

tensor=tf.constant([1, 2])
sess=tf.Session()
with sess.as_default():
    print('結果是:', tensor.eval())
  • 1
  • 2
  • 3
  • 4
結果是:[1 2]
  • 1

後面四個引數可寫可不寫,第二個引數表示資料型別,一般可以是tf.float32, tf.float64等:

tensor=tf.constant([1, 2], dtype=tf.float32)
sess=tf.Session()
with sess.as_default():
    print
('結果是:', tensor.eval())
  • 1
  • 2
  • 3
  • 4
結果是: [1. 2.]
  • 1

注意到資料型別相比之前發生了改變,因為這次我們指定了資料型別為float32,所以不是1 2,而是1. 2.。

第三個引數表示張量的“形狀”,即維數以及每一維的大小。如果指定了第三個引數,當第一個引數value是數字時,張量的所有元素都會用該數字填充:

tensor=tf.constant(-1, shape=[2, 3])
sess=tf.Session()
with sess.as_default():
    print('結果是:', tensor.eval())
  • 1
  • 2
  • 3
  • 4
結果是: [[-1 -1 -1]
         [-1 -1 -1]]
  • 1
  • 2

可以看到是一個二維張量,第一維大小為2, 第二維大小為3,全用數字-1填充。

而當第一個引數value是一個列表時,注意列表的長度必須小於等於第三個引數shape的大小(即各維大小的乘積),否則會報錯:

tensor=tf.constant([1, 2, 3, 4, 5, 6, 7], shape=[2, 3])
  • 1
Traceback (most recent call last):
  File "<pyshell#68>", line 1, in <module>
    tensor=tf.constant([1, 2, 3, 4, 5, 6, 7], shape=[2, 3])
ValueError: Too many elements provided. Needed at most 6, but received 7
  • 1
  • 2
  • 3
  • 4

這是因為函式會生成一個shape大小的張量,然後用value這個列表中的值一一填充shape中的元素。這裡列表大小為7,而shape大小為2*3=6,無法正確填充,所以發生了錯誤。
而如果列表大小小於shape大小,則會用列表的最後一項元素填充剩餘的張量元素:

tensor=tf.constant([1, 2], shape=[1, 4, 3])
sess=tf.Session()
with sess.as_default():
    print('結果是:', tensor.eval())
  • 1
  • 2
  • 3
  • 4
結果是: [[[1 2 2]
          [2 2 2]
          [2 2 2]
          [2 2 2]]]
  • 1
  • 2
  • 3
  • 4

第四個引數name可以是任何內容,主要是字串就行。
不輸入任何內容時:

tensor=tf.constant([1, 2])
print(tensor)
  • 1
  • 2
Tensor("Const_16:0", shape=(2,), dtype=int32)
  • 1

作為對比:

tensor=tf.constant([1, 2], name="jiayu")
print(tensor)
  • 1
  • 2
Tensor("jiayu_1:0", shape=(2,), dtype=int32)
  • 1

第五個引數verify_shape預設為False,如果修改為True的話表示檢查value的形狀與shape是否相符,如果不符會報錯。

tensor=tf.constant([[1, 2, 3], [4, 5, 6]], shape=[2, 3], verify_shape=True)
  • 1

以上程式碼value與shape都是兩行三列,檢查結果正確。而下面的程式碼會報錯:

tensor=tf.constant([1, 2], shape=[3, 2], verify_shape=True)

在TensorFlow API中建立常量的函式原型如下所示:

tf.constant(
    value,
    dtype=None,
    shape=None,
    name='Const',
    verify_shape=False
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

可以看到第一個值value是必須的,可以是一個數值,也可以是一個列表。
如果是數值:

tensor=tf.constant(1)
  • 1

為檢視結果必須建立一個會話,並用取值函式eval()來檢視建立的tensor的值:

sess=tf.Session()
with sess.as_default():
    print('結果是:', tensor.eval())
  • 1
  • 2
  • 3
結果是:1
  • 1

而如果value是一個列表:

tensor=tf.constant([1, 2])
sess=tf.Session()
with sess.as_default():
    print('結果是:', tensor.eval())
  • 1
  • 2
  • 3
  • 4
結果是:[1 2]
  • 1

後面四個引數可寫可不寫,第二個引數表示資料型別,一般可以是tf.float32, tf.float64等:

tensor=tf.constant([1, 2], dtype=tf.float32)
sess=tf.Session()
with sess.as_default():
    print('結果是:', tensor.eval())
  • 1
  • 2
  • 3
  • 4
結果是: [1. 2.]
  • 1

注意到資料型別相比之前發生了改變,因為這次我們指定了資料型別為float32,所以不是1 2,而是1. 2.。

第三個引數表示張量的“形狀”,即維數以及每一維的大小。如果指定了第三個引數,當第一個引數value是數字時,張量的所有元素都會用該數字填充:

tensor=tf.constant(-1, shape=[2, 3])
sess=tf.Session()
with sess.as_default():
    print('結果是:', tensor.eval())
  • 1
  • 2
  • 3
  • 4
結果是: [[-1 -1 -1]
         [-1 -1 -1]]
  • 1
  • 2

可以看到是一個二維張量,第一維大小為2, 第二維大小為3,全用數字-1填充。

而當第一個引數value是一個列表時,注意列表的長度必須小於等於第三個引數shape的大小(即各維大小的乘積),否則會報錯:

tensor=tf.constant([1, 2, 3, 4, 5, 6, 7], shape=[2, 3])
  • 1
Traceback (most recent call last):
  File "<pyshell#68>", line 1, in <module>
    tensor=tf.constant([1, 2, 3, 4, 5, 6, 7], shape=[2, 3])
ValueError: Too many elements provided. Needed at most 6, but received 7
  • 1
  • 2
  • 3
  • 4

這是因為函式會生成一個shape大小的張量,然後用value這個列表中的值一一填充shape中的元素。這裡列表大小為7,而shape大小為2*3=6,無法正確填充,所以發生了錯誤。
而如果列表大小小於shape大小,則會用列表的最後一項元素填充剩餘的張量元素:

tensor=tf.constant([1, 2], shape=[1, 4, 3])
sess=tf.Session()
with sess.as_default():
    print('結果是:', tensor.eval())
  • 1
  • 2
  • 3
  • 4
結果是: [[[1 2 2]
          [2 2 2]
          [2 2 2]
          [2 2 2]]]
  • 1
  • 2
  • 3
  • 4

第四個引數name可以是任何內容,主要是字串就行。
不輸入任何內容時:

tensor=tf.constant([1, 2])
print(tensor)
  • 1
  • 2
Tensor("Const_16:0", shape=(2,), dtype=int32)
  • 1

作為對比:

tensor=tf.constant([1, 2], name="jiayu")
print(tensor)
  • 1
  • 2
Tensor("jiayu_1:0", shape=(2,), dtype=int32)
  • 1

第五個引數verify_shape預設為False,如果修改為True的話表示檢查value的形狀與shape是否相符,如果不符會報錯。

tensor=tf.constant([[1, 2, 3], [4, 5, 6]], shape=[2, 3], verify_shape=True)
  • 1

以上程式碼value與shape都是兩行三列,檢查結果正確。而下面的程式碼會報錯:

tensor=tf.constant([1, 2], shape=[3, 2], verify_shape=True)