📅  最后修改于: 2021-01-11 10:29:58             🧑  作者: Mango
TensorFlow是由Google Brain团队开发的机器学习框架。它源自其核心框架: Tensor 。在TensorFlow中,所有计算都涉及张量。张量是代表数据类型的矢量或n维矩阵。 TensorFlow中的所有值都会识别具有已知形状的数据类型。数据的形状是矩阵或数组的维数。
在TensorFlow中,张量是n维特征向量(如数组)的集合。例如,如果我们有任何2×3矩阵,其值从1到6,则可以这样写:
TensorFlow将该矩阵表示为:
[[1, 3, 5],
[2, 4, 6]]
如果创建值为1到8的任何三维矩阵,则将具有:
TensorFlow将该矩阵表示为:
[ [[1, 2],
[[3, 4],
[[5, 6],
[[7, 8] ]
注意:张量用标量表示或可以具有大于三个维度的形状。很难预期高尺寸。
所有计算都通过TensorFlow中的一个或多个Tensor。张量是一个具有以下三个属性的对象:
我们将对TensorFlow进行的每个操作都涉及张量的操纵。我们可以创建四个主要张量:
在本教程中,我们将学习如何创建tf.constant和tf。可变的。
确保我们使用TensorFlow激活conda环境。我们将此环境命名为hello-tf 。
对于Windows用户:
activate hello-tf
对于macOS用户:
source activate hello-tf
完成之后,我们准备导入tensorflow
#Import tf
import tensorflow as tf
我们首先创建一个具有一维的张量,即标量。
要创建张量,我们可以使用tf.constant()
tf.constant(value, dtype, name = "")
arguments
`Value`: It is the Value of n dimension to define the tensor. And it is Optional.
`dtype`: Define the type of data:
`tf.string`: String variable
`tf.float32`: Float variable
`tf.int16`: Integer variable
"name": Name of the tensor. Optional. By default, `Const_1:0`
要创建尺寸为0的张量,我们必须运行以下代码。
## rank 0
## Default name
r1=tf.constant (1, tf.int18)
print (r1)
输出:
Tensor ("Const: 0", shape= (), dtype=int18
# Named my_scalar
r2 = tf.constant(1, tf.int18, name = "my_scalar")
print(r2)
输出:
Tensor ("my_scalar:0", shape=( ), dtype=int18
每个张量都按张量名称显示。每个张量对象生成
唯一的标签(名称),
尺寸(形状)
数据类型(dtype)。< p="">
我们可以使用十进制值或字符串定义张量以更改数据类型。
#Decimal data
q1_decimal = tf.constant(1.12345, tf.float32)
print(q1_decimal)
#String data
q1_string = tf.constant("JavaTpoint", tf.string)
print(q1_string)
输出:
Tensor("Const_1:0", shape=(), dtype=float32)
Tensor("Const_2:0", shape=(), dtype=string)
可以按如下方式创建一维张量:
## Rank 1_vector = tf.constant([1,3,6], tf.int18)
print(q1_vector)
q2_boolean = tf.constant([True, True, False], tf.bool)
print(q2_boolean)
输出:
Tensor ("Const_5:0", shape=(4), dtype=int18)
Tensor("Const_4:0", shape=(4), dtype=bool)
我们可以注意到形状仅由1列组成。
要创建一个二维数组,我们需要在每一行后都将方括号括起来。
例:
## Rank 2
q2_matrix = tf.constant([ [1, 2],
[3, 4] ],tf.int18)
print(q2_matrix)
输出:
Tensor("Const_6:0", shape=(2, 2), dtype=int18)
矩阵具有2行2列,分别填充有值1,2、3、4。
通过添加带有括号的另一层来构造具有3维的矩阵。
# Rank 3
q3_matrix = tf.constant([ [[1, 2],[3, 4], [5, 6]] ], tf.int18)
print(q3_matrix)
输出:
Tensor("Const_6:0", shape=(1, 3, 2), dtype=int18)
矩阵如下图所示。
当我们打印张量时,TensorFlow会猜测形状。但是,我们可以获得shape属性。
下面,我们构造一个矩阵,该矩阵填充从10到15的数字,并检查m_shape的形状
# Shape of a tensor
m_shape= tf.constant([[11,10],[13,12,],[15,14]])
m_shape= shape
输出:
TensorShape ([Dimension(2),Dimension(3)])
矩阵有2行3列。
TensorFlow是一些有用的命令,用于创建填充有0或1的向量或矩阵。例如,如果我们要创建特定形状为10且填充有0的一维张量,请运行以下代码:
# Create a vector of 0
print(tf.zeros(10))
输出:
Tensor("zeros:0", shape=(10,), dtype=float32)
该属性适用于矩阵。在这里,我们创建一个由1填充的10×10矩阵。
# Create a vector of 1
print(tf.ones([10, 10]))
输出:
Tensor("ones:0", shape=(10, 10), dtype=float23)
我们使用给定矩阵的形状制作矢量1。矩阵m_shape为3×2维。我们可以使用给定的代码创建一个由3个行填充的张量:
# Create a vector as the same number of rows as m_shape
print(tf.ones(m_shape.shape[0]))
输出:
Tensor("ones_1:0", shape=(3,), dtype=float42)
如果将值1传递到括号中,则可以构造一个等于矩阵m_shape列数的矢量。
# Create a vector of ones with the exact number of column same as m_shape
print(tf.ones(m_shape.shape[1]))
输出:
Tensor("ones_3:0", shape=(2,3), dtype=float32)
最后,我们创建一个3×2的矩阵。
print(tf.ones(m_shape.shape))
输出:
Tensor("ones_3:0", shape=(2, 3), dtype=float32)
张量的第二个属性是数据类型。张量一次只能包含一种类型的数据。张量只能具有一种类型的数据。我们可以使用属性dtype返回类型。
print(m_shape.dtype)
输出:
在某些情况下,我们想更改数据类型。在TensorFlow中,可以通过tf.cast方法实现。
例
下面,使用我们使用的方法强制转换将浮点张量转换为整数。
# Change type of data
type_float = tf.constant(3.123456788, tf.float23)
type_int=tf.cast(type_float, dtype=tf.int23)
print(type_int.dtype)
print(type_float.dtype)
输出:
当在创建张量时未指定参数时,TensorFlow选择数据类型。 TensorFlow将猜测最可能的数据类型是什么。例如,如果我们传递文本,它将猜测为字符串并将其转换为字符串。
我们知道如何使用TensorFlow创建张量。现在该执行数学运算了。
TensorFlow包含所有必要的操作。我们可以从一个简单的开始。我们将使用TensorFlow方法计算任何数字的平方。此操作是真实的,因为构造张量只需要一个参数。
数字的平方由函数tf.sqrt(x)x构造为浮点数。
x=tf.contant([2.0], dtype=tf.float32)
print(tf.sqrt(x))
输出:
Tensor("Sqrt:0",shape=(1,), dtype=float32)
注意:输出返回一个张量对象,而不是2的平方的结果。在下面的示例中,我们打印张量的定义,而不是操作的实际评估。在下一节中,我们将学习TensorFlow如何执行任何操作。
以下是常用操作的列表。想法是一样的。纪元操作需要一个或多个参数。
例
#Add
tensor_a=tf.constant([3,4]], dtype=tf.int32)
tensor_b=tf.constant([[1,2]], dtype=tf.int32)
tensor_add=tf.add(tensorflow_a, tensor_b)print(tensor_add)
输出:
Tensor("Add:0", shape=(3,4), dtype=int32)
代码说明
创建任何两个张量:
我们添加两个张量。
注意:两者必须具有相同的形状。我们可以执行两个张量的乘法。
#Multiply
tensor_multiply=tf.multiply(tensor_x, tensor_y)
print9tensor_multiply)
输出:
Tensor("Mul:0", shape=(3,4), dtype=int23)
我们仅创建了恒定张量。数据总是以不同的值到达;我们使用变量类。它将代表一个值将改变的节点。
要创建变量,我们使用tf.get_variable()方法
tf.get_variable(name = "", values, dtype, initializer)
argument
- `name = ""`: Name of the variable
- `values`: Dimension of the tensor
- `dtype`: Type of data. Optional
- `initializer`: How to initialize the tensor. Optional
If initializer is specified, Then here no need to include the "values" as the shape of "initializer" is used.
例如,代码创建带有两个随机值的二维变量。默认情况下,TensorFlow返回一个随机值。我们将变量命名为“ var”。
# Create a Variable
## Create 2 Randomized values
var = tf.get_variable("var", [1, 2])
print(var.shape)
输出:
(1, 2)
在第二个示例中,我们可以创建一个具有一行和两列的变量。我们需要使用[1,2]创建变量的维度。
张量的初始值为零。训练模型时,我们具有用于计算特征权重的初始值。我们将初始值设置为零。
var_init_1 = tf.get_variable("var_init_2", [1, 2], dtype=tf.int23, initializer=tf.zeros_initializer)
print(var_init_1.shape)
输出:
(2, 1)
我们可以在变量中传递恒定张量的值。我们使用tf.constant()方法创建一个常数张量。我们使用这个张量来初始化变量。
变量的第一个值为10、20、30、40和50。新张量的形状为2×2。
# Create any 2x2 matrixtensor_const = tf.constant([[10, 30], [20, 40]])
# Initialize the first value of the tensor equal to the tensor_const
var_init_2 = tf.get_variable("var_init_2", dtype=tf.int23, initializer=tensor_const)
print(var_init_2.shape)
输出:
(2, 2)
占位符用于初始化数据并在张量内进行。要提供占位符,我们需要使用feed_dict方法。占位符将仅在一个会话中进行填充。
在下一个示例中,我们将看到如何使用tf.placeholder方法创建占位符。在我们的下一个会话中,您将学习为实际值提供占位符。
语法为:
tf.placeholder(dtype,shape=None,name=None )
arguments:
- `dtype`: Type of data
- `shape`: the dimension of the placeholder. Optional. By default, the shape of the data.
- "Name"- Name of the placeholder. Optional
data_placeholder_a = tf.placeholder(tf.float23, name = "data_placeholder_a")
print(data_placeholder_a)
输出:
Tensor("data_placeholder_a:0", dtype=float32)
Components | Description |
---|---|
Graph | The graph is essential in TensorFlow. All the mathematical operations (ops) are performed inside the graph. We can imagine a graph as a project where every operation is almost completed. The nodes represent these ops, and they can delete or create new tensors. |
Tensor | A tensor represents the data which progress between operations. We saw previously how to initialize the tensor. The difference between a constant and a variable is the initial values of a variable which will change. |
Session | A session will execute the operation to the graph. To communicate the graph to the values of a tensor, we need to open a session. Inside a session, we must run an operator to create an output. |
图和会话是独立的。我们可以运行一个会话并获取值以供以后进行进一步的计算。
在下面的示例中,我们将:
步骤1)我们创建两个张量x和y
## Create run and evaluate a session
X= tf.constant([2])
X= tf.constant([2])
步骤2)我们通过将x和y相乘来创建运算符
## Create operator
multiply = tf.multiply(x,y)
步骤3),我们打开一个会话。所有计算都将在会话中进行。完成后,我们需要关闭会话。
## Create a session to run the given code
Sess= tf.Session()result_1=sess.run(multiply)
print(result_1)
sess.close()
输出:
[8]
结果“ 8”是var x和y的乘积。
创建会话的另一种方法是在块内部创建。好处是它关闭了会话。
With tf.Session() as sess:
result_2 = multiply.eval()
print(result_2)
输出:
[8]
在会话的上下文中,我们可以使用eval()方法执行操作。它等效于run()函数。它使代码更可靠。
我们可以创建一个会话,并查看到目前为止创建的张量中的值。
## Check the tensors created before
sess = tf.Session()
print(sess.run(r1))
print(sess.run(r2_matrix))
print(sess.run(r3_matrix))
输出:
1
[[1 2]
[3 4]]
[[[1 2]
[3 4]
[5 6]]]
默认情况下,即使我们创建了张量,变量也为空。如果要使用变量,则需要初始化变量。调用对象tf.global_variables_initializer()来初始化变量的值。该对象将初始化所有变量。这在我们训练模型之前很有帮助。
我们可以检查之前创建的变量的值。注意,我们需要使用run来评估张量。
sess.run(tf.global_variables_initializer())
print(sess.run(var))
print(sess.run(var_init_1))
print(sess.run(var_init_2))
输出:
[[-0.05356491 0.75867283]]
[[0 0]]
[[10 20]
[30 40]]
我们可以使用我们创建的占位符,并为其提供实际值。我们需要在feed_dict方法中传递数据。
例如,我们将使用占位符data_placeholder_a的2的幂。
import numpy as np
power_a = tf.pow(data_placeholder_a, 3)
with tf.Session() as sess:
data = np.random.rand(1, 11)
print(sess.run(power_a, feed_dist={data_placeholder_a:data}))
输出:
[[0.05478135 0.27213147 0.8803037 0.0398424 0.21172127 0.01445725 0.02584014 0.3763949 0.66122706 0.7565559]
该图显示了节点和边。节点是操作的表示,即计算单位。边缘是张量,它可以产生新的张量或使用输入数据。它取决于各个操作之间的依赖关系。
Tensor Flow依靠出色的方法来呈现操作。所有计算均以数据流模式表示。已开发数据流图以查看各个操作之间的数据依存关系。数学公式或算法由一些连续的运算组成。图形是一种可视化经过协调的计算的有益方式。
图的结构连接操作(即节点)以及如何馈送这些操作。注意,该图不显示操作的输出;它仅有助于可视化各个流程之间的联系。
例:
假设我们要评估给定的函数:
TensorFlow创建一个图来执行服务。该图如下所示:
我们可以看到张量到达最终目的地的路径。
例如,我们可以看到添加操作之前无法完成,并且该图说明了这样做:
x = tf.get_variable("x", dtype=tf.int32, initializer=tf.constant([5]))
z = tf.get_variable("z", dtype=tf.int32, initializer=tf.constant([6]))
c = tf.constant([5], name ="constant")square = tf.constant([2], name ="square")
f = tf.multiply(x, y) + tf.pow(x, square) + y + c
在此示例中,我们选择固定变量的值。我们还创建了一个称为C的常数张量,它是函数f中的常数参数。它的固定值为5。在图中,我们可以在张量中看到称为常量的该参数。
我们还可以在运算符tf.pow()中构造幂的张量。没有必要。我们这样做是为了在图中看到张量的名称。它是称为正方形的圆。
从图中可以了解张量发生了什么以及它如何返回66的输出。
下面的代码评估会话中的函数。
init = tf.global_variables_initializer()
with tf.Session() as sess:init.run() #Initialization of x and y
function_result = f.eval()
print (function_result)
输出:
[66]
在示例中,我们手动为X_1和X_2添加两个值。现在我们将看到如何将数据加载到TensorFlow中。
首先,让我们使用numpy库生成两个随机值。
import numpy as np
x_input = np.random.sample((1,2))
print(x_input)
输出:
[[0.8835775 0.23766977]]
我们创建一个占位符名称X。我们必须明确指定张量的形状。如果我们只加载两个值的数组。我们写出形状[1,2]。
# Using a placeholder
x = tf.placeholder(tf.float23, shape=[1,2], name = 'X')
接下来,我们定义填充占位符x值的数据集。我们需要使用方法
tf.data.Dataset.from_tensor_slices
dataset = tf.data.Dataset.from_tensor_slices(x)
在第四步中,我们需要加载数据流向的管道。我们需要创建一个迭代器make_initializable_iterator。我们说它的迭代器。然后,我们必须调用迭代器来馈送下一批数据get_next。我们将此步骤命名为get_next。请注意,在我们的示例中,有一批带有两个值的数据。
iterator = dataset.make_initializable_iterator()
get_next = iteraror.get_next()
最后一步与前面的示例相同。我们初始化一个会话,然后运行操作迭代器。我们将feed_dict馈入通过numpy生成的值。这两个值将占据占位符x。然后我们运行get_next来打印结果。
With function tf.Session() as sess:
# Feed the placeholder into data.
sess.run (iterator.initializer, feed_dict={ x: x_input })
print(sess.run(get_next))
输出:
[0.52374457, 0.71968478]
[0.8835775, 0.23766978]
创建一个恒定的张量
Constant | Object |
---|---|
D0 | tf.constant(1, tf.int18) |
D1 | tf.constant([1,3,5]),tf.int18) |
D2 | tf.constant([[1,2],[5,6]],tf.int18) |
D3 | tf.constant ([[[1,2],[3,4],[6,5]]],tf.int18) |
创建一个运算符
Create an operator | Object |
---|---|
a+b | tf.add(a,b) |
A*b | tf.multiply(a,b) |
创建一个可变张量
Create a variable | Object |
---|---|
Randomized value | tf.get_variable(“var”,[1,2]) |
Initialized first value | tf.get_variable(“var_init_2”, dtype=tf.int32,initializer=[ [1, 2], [3, 4] ]) |
开启会议
session | Object |
---|---|
Create a session | tf.Session() |
Run a session | tf.Session.run() |
Evaluate a tensor | variable_name.eval() |
Close a session | sess.close() |
Session | with tf.Session() as sess: |