创建和控制张量
-
学习目标:
- 初始化 TensorFlow Variable 并赋值
- 创建和控制张量
- 回忆线性代数中的加法和乘法知识
- 熟悉基本的 TensorFlow 数学和数组运算
from __future__ import print_function
import tensorflow as tf
try:
tf.contrib.eager.enable_eager_execution()
print('TF imported with eager execution!')
except ValueError:
print('TF already imported with eager execution!')
TF imported with eager execution!
矢量加法
# 创建一个包含质数的primes矢量
primes = tf.constant([2,3,4,7,11,13], dtype=tf.int32)
print('primes:', primes)
primes: tf.Tensor([ 2 3 4 7 11 13], shape=(6,), dtype=int32)
# 创建一个全1的矢量
ones = tf.ones([6], dtype=tf.int32)
print('ones:', ones)
ones: tf.Tensor([1 1 1 1 1 1], shape=(6,), dtype=int32)
# 通过前两个矢量相加创建一个新的矢量
just_beyond_primes = tf.add(primes, ones)
print('just_beyond_primes:', just_beyond_primes)
just_beyond_primes: tf.Tensor([ 3 4 5 8 12 14], shape=(6,), dtype=int32)
# 通过翻倍创建新的矢量
twos = tf.constant([2] * 6, dtype=tf.int32)
primes_doubled = primes * twos
print('primes_doubled:', primes_doubled)
primes_doubled: tf.Tensor([ 4 6 8 14 22 26], shape=(6,), dtype=int32)
# 调用张量的numpy方法会返回该张量的值(以NumPy数组形式)
some_matrix = tf.constant([[1,2,3],[4,5,6]], dtype=tf.int32)
print(some_matrix)
print('\nvalue of some_matrix is:\n', some_matrix.numpy())
tf.Tensor(
[[1 2 3]
[4 5 6]], shape=(2, 3), dtype=int32)
value of some_matrix is:
[[1 2 3]
[4 5 6]]
张量形状
- 形状用于描述张量维度的大小和数量。张量的形状表示为list, 其中第i个元素表示维度i的大小,列表的长度表示张量的阶(维数)
# A Scalar (0-D tensor)
scalar = tf.zeros([])
# A vector with 3 elements
vector = tf.zeros([3])
# A martix with 2 rows and 3 columns
martix = tf.zeros([2,3])
print('scalar has shape', scalar.get_shape(), 'and value:\n', scalar.numpy())
print('vector has shape', vector.get_shape(), 'and value:\n', vector.numpy())
print('martix has shape', martix.get_shape(), 'and value:\n', martix.numpy())
scalar has shape () and value:
0.0
vector has shape (3,) and value:
[0. 0. 0.]
martix has shape (2, 3) and value:
[[0. 0. 0.]
[0. 0. 0.]]
广播
- 在TensorFlow中可以对张量执行传统意义上不可行的运算,TensorFlow支持广播(一种借鉴于NumPy的概念)
- 利用广播,元素级运算中较小数组会增大到与较大数组具有相同的形状
- 当张量被广播时,从概述上来说,系统会复制其条目
primes = tf.constant([2,3,5,7,11,13], dtype=tf.int32)
print('primes:', primes)
one = tf.constant(1, dtype=tf.int32)
print('one:', one)
just_beyond_primes = tf.add(primes, one)
print('just_beyond_primes:', just_beyond_primes)
two = tf.constant(2, dtype=tf.int32)
primes_doubled = primes * two
print('primes_doubled', primes_doubled)
primes: tf.Tensor([ 2 3 5 7 11 13], shape=(6,), dtype=int32)
one: tf.Tensor(1, shape=(), dtype=int32)
just_beyond_primes: tf.Tensor([ 3 4 6 8 12 14], shape=(6,), dtype=int32)
primes_doubled tf.Tensor([ 4 6 10 14 22 26], shape=(6,), dtype=int32)
primes_squared = tf.multiply(primes, primes) # 数乘
just_under_primes_squared = primes_squared - 1
print(just_under_primes_squared)
tf.Tensor([ 3 8 24 48 120 168], shape=(6,), dtype=int32)
print(primes * primes -1)
tf.Tensor([ 3 8 24 48 120 168], shape=(6,), dtype=int32)
矩阵乘法
- tf.matmul(x, y)
张量变形
-
使用tf.reshape(matrix, [2, 8])方法改变张量形状(8
2变成2
8或4*4) -
也可以改变张量的维度tf.reshape(matrix, [2,2,4]) # 如将2
8变成2
2*4,或者多维变成一维
变量、初始化和赋值
- 上面提到的都是静态值(tf.constant), 调用numpy()始终返回同一结果
-
定义Variable对象,它的值是可以改变的
- v = tf.contrib.eager.Variable([3]) # 定义变量并初始化为3
- w = tf.contrib.eager.Variable(tf.random_normal([1, 4] mean=1.0, stddev=0.35)) # 1*4矩阵,均值为1,标准方差为0.35
-
要改变变量的值,使用assign操作
- v = tf.assign(v, [7])
- v.assign([5])
die1 = tf.contrib.eager.Variable(tf.random_uniform([10,1], minval=1, maxval=7, dtype=tf.int32))
die2 = tf.contrib.eager.Variable(tf.random_uniform([10,1], minval=1, maxval=7, dtype=tf.int32))
dice_sum = tf.add(die1, die2)
resulting_matrix = tf.concat(values=[die1, die2, dice_sum], axis=1) # 合并的值和方向
print(resulting_matrix)
tf.Tensor(
[[2 4 6]
[3 3 6]
[1 3 4]
[3 2 5]
[1 2 3]
[2 2 4]
[4 1 5]
[2 3 5]
[3 4 7]
[1 6 7]], shape=(10, 3), dtype=int32)
版权声明:本文为yql_007原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。