仅供参考
框架名 | 主语言 | 从语言 | 灵活性 | 上手难度 | 开发者 |
---|---|---|---|---|---|
Tensorflow | C++ | cuda/python | 好 | 难 | |
Caffe | C++ | cuda/python/Matlab | 一般 | 中等 | 贾扬清 |
Pytorch | python | C/C++ | 好 | 中等 | |
MXNet | C++ | cuda/R/julia | 好 | 中等 | 李沐、陈天奇等 |
Torch | lua | C/cuda | 好 | 中等 | |
Theano | python | C++/cuda | 好 | 易 | 蒙特利尔理工学院 |
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
tensorflow.Session()
去调用,2.x 里删除了会话相关);tf.compat.v1.get_default_graph()
访问,要将操作添加到默认图形中,直接创建 OP 即可;(TensorFlow 1.x 为 tf.get_default_graph()
)def default_graph_demo():
a = tf.constant(2)
# 查看默认图
# 方法1:调用方法
default_g = tf.compat.v1.get_default_graph()
print("default_g:", default_g)
# 方法2:查看属性
# print("a的图属性:", a.graph) # 2.x 中不支持
return None
tf.Graph()
自定义创建图;tf.Graph.as_default()
上下文管理器,定义张量和节点,图上下文管理器会自动将张量和节点绑定在图中;def user_graph_demo():
g = tf.Graph()
# 1.构建图:在上下文管理器内部就可以定义用户自己创建图的数据和操作
with g.as_default():
a_t = tf.constant(2)
c_t = a_t
# 2.执行图
# 方式1:
with tf.compat.v1.Session(graph=g) as sess:
c_t_value = sess.run(c_t)
print(c_t_value)
print("我们自己创建的图为:\n", sess.graph)
# 方式2:(包括会话的开启和关闭)
# sess = tf.compat.v1.Session(graph=g)
# c_t_value = sess.run(c_t)
# print(c_t_value)
# sess.close()
return None
tensorboard --logdir=log_dir
;log_dir 为绝对路径
conda info --envs
:查看所有虚拟环境,当前项目的虚拟环境为 tensorflow-2.3.0;activate tensorflow-2.3.0
:启动当前项目的虚拟环境;tensorboard --logdir=tensorboard_out
:启动 TensorBoard;http://localhost:6006/
;def tensorboard_demo():
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
model = create_model()
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# log_dir为日志存放文件
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir="../resources/p02_deep_learning_tensorFlow/tensorboard_out", histogram_freq=1)
model.fit(x=x_train,
y=y_train,
epochs=5,
validation_data=(x_test, y_test),
callbacks=[tensorboard_callback])
return None
def create_model():
return tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
if __name__ == "__main__":
# 代码4:TensorBoard 可视化
tensorboard_demo()
类型 | 实例 |
---|---|
标量运算 | add,sub, mul, div,exp, log, greater, less,equal |
向量运算 | concat,slice,splot, constant,rank,shape, shuffle |
矩阵运算 | matmul, matrixinverse,matrixdateminant |
带状态的运算 | Variable, assgin, assginadd |
神经网络组件 | softmax,sigmoid,relu,convolution,max_pool |
存储,恢复 | Save,Restroe |
队列及同步运算 | Enqueue,Dequeue,MutexAcquire,MutexRelease |
控制流 | Merge,Switch, Enter,Leave,Nextlteration |
操作函数 | 操作对象 |
---|---|
tf.constant(Tensor对象) | 输入Tensor对象-Const输出 Tensor对象 |
tf.add(Tensor对象1,Tensor对象2) | 输入(Tensor对象1,Tensor对象2) ,add对象,输出 Tensor对象3 |
一个操作对象(Operation)是 TensorFlow 图中的一个节点,可以接收 0 个或者多个输入 Tensor 对象,并且可以输出 0 个或者多个 Tensor,Operation 对象是通过 op 构造函数 (如tf.matmul()) 创建的;
例如: c = tf.matmul(a, b) 创建了一个Operation 对象,类型为 MatMul 类型,它将张量 a, b 作为输入,c 作为输出,并且输出数据,打印的时候也是打印的数据。其中 tf.matmul) 是函数,在执行 matmul 函数的过程中会通过 MatMul 类创建—个与之对应的对象;
打印出来的是张量 Tensor,在 2.x 中为:值+shape+dtype;
tf.constant(42.0, name=“answer”)
创建了一个名为 “answer" 的新 tf.Operation。如果默认图已包含名为 “answer” 的指令,则 TensorFlow 会在名称上附加 “1"、“2” 等字符,以便让名称具有唯一性;会话在 2.x 版本中已经删除,但为了学习这里还是做了总结;
tf.compat.v1.Session(target=‘’,graph=None,config=None)
;(1.x 为 tf.Session
)
config=tf.compat.v1.ConfigProto(allow_soft_placement=True, log_device_placement=True)
tf.compat.v1.InteractiveSession()
;(1.x 为 tf.InteractiveSession
)run(fetches, feed_dict=None, options=None, run_metadata=None)
tf.placeholder()
占位符搭配使用,则会检查值的形式是否与占位符兼容;@tf.function
def get_h(x):
h = 2 * x
return h
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # 去警告
import tensorflow as tf
tf.compat.v1.disable_eager_execution()
def session_demo():
# 定义常量
a = tf.constant(2, name="a")
b = tf.constant(3)
c = tf.add(a, b)
# 定义占位符
a_p = tf.compat.v1.placeholder(tf.float32)
b_p = tf.compat.v1.placeholder(tf.float32)
c_p = tf.add(a_p, b_p)
# 默认的图
default_g = tf.compat.v1.get_default_graph()
print("默认的图为:\n", default_g)
# 开启会话
with tf.compat.v1.Session(config=tf.compat.v1.ConfigProto(allow_soft_placement=True, log_device_placement=True)) as sess:
print("sess的图属性: \n", sess.graph)
# 使用 run() 方法计算 c 的值
abc = sess.run([a,b,c])
print("abc的结果为: \n", abc)
# 占位符结果
c_p_sum = sess.run(c_p, feed_dict={a_p: 3.0, b_p: 4.0})
print("c_p_sum的结果为: \n", c_p_sum)
return None
if __name__ == "__main__":
# 代码5:会话的演示
session_demo()
阶 | 数学实例 | Python | 例子 |
---|---|---|---|
0 | 表量 | (只有大小) | s = 483 |
1 | 向量 | (大小和方向) | v = [1.1,2.2,3.3] |
2 | 矩阵 | (数据表) | m = [[1,2,3],[4,5.6],[7,8,9]] |
3 | 3阶张量 | (数据立体) | t = [[[2],[4],[6]],[[8],[10],[12]],[[14],[16],[18]]] |
4 | n阶 |
数据类型 | Python类型 | 描述 |
---|---|---|
DT_FLOAT | tf.float32 | 32位浮点数 |
DT_DOUBLE | tf.float64 | 64位浮点数 |
DT_INT64 | tf. int64 | 64位有符号整型 |
DT_INT32 | tf. int32 | 32位有符号整型 |
DT_INT16 | tf.int16 | 16位有符号整型 |
DT_INT8 | tf.int8 | 8位有符号整型 |
DT_UINT8 | tf.uint8 | 8位无符号整型 |
DT_STRING | tf.string | 可变长度的字节数组.每一个张量元素都是一个字节数组 |
DT_BOOL | tf.bool | 布尔型 |
DT_COMPLEX64 | tf.complex64 | 由两个32位浮点数组成的复数:实数和虚数 |
DT_QINT32 | tf.qint32 | 用于量化Ops的32位有符号整型 |
DT_QINT8 | tf.qint8 | 用于量化Ops的8位有符号整型 |
DT_QUINT8 | tf.quint8 | 用于最化Ops的8位无符号整型 |
tf.zeros(shape, dtype=tf.float32,name=None)
:创建所有元素设置为零的张量。此操作返回一个 dtype 具有形状 shape 和所有元素设置为零的类型的张量;tf.zeros_like(tensor,dtype=None, name=None)
:给 tensor 定单张量(),此操作返回 tensor 与所有元素设置为零相同的类型和形状的张量;tf.ones(shape, dtype=tf.float32, name=None)
:创建一个所有元素设置为1的张量。此操作返回一个类型的张量,dtype 形状 shape 和所有元素设置为 1;tf.ones_like(tensor, dtype=None, name=None)
:给 tensor 定单张量(),此操作返回 tensor 与所有元素设置为 1 相同的类型和形状的张量;tf.fill(dims, value, name=None)
:创建一个填充了标量值的张量。此操作创建一个张量的形状 dims 并填充它 value;tf.constant(value, dtype=None,shape=None, name=‘Const’)
:创建一个常数张量;tf.random.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32,seed=None,name=None)
:从截断的正态分布中输出随机值,和 tf.random_normal(0) 一样,但是所有数字都不超过两个标准差;(1.x 为 tf.truncated_normal()
)tf.random.normal(shape, mean=0.0,stddev=1.0, dtype=tf.float32, seed=None, name=None)
:从正态分布中输出随机值,由随机正态分布的数字组成的矩阵;(1.x 为 tf.random_normal()
)tf.random.uniform()
:创建一个均匀分布张量;tf.random.shuffle(a)
:随机打乱数组 a;tf.string_to_number(string_tensor, out_type=None, name=None)
:;tf.to_double(x, name=‘ToDouble’)
:;tf.to_float(x, name=‘ToFloat’)
:;tf.to_bfloat16(x, name=“ToBFloat16”)
:;tf.to_int32(x, name=‘Tolnt32’)
:;tf.to_int64(x, name=‘Tolnt64’)
:;tf.cast(x, dtype, name=None)
:通用类型转换;tf.reshape(tensor,shape)
:动态创建新张量,当原形状固定的时候,动态改变张量的时候,张量的元素个数必须一致。如 shape(2,3) 元素个数为 6,则动态改变张量的时候,也要确保元素的个数为 6;tensor.set_shape(shape)
:改变静态形状。只有原形状没有固定时才能更新静态形状。返回的是一个新的张量;详情请见:https://tensorflow.google.cn/versions/r2.3/api_docs/python/tf?hl=zh-cn
tf.add()
:;tf.matmul()
:;tf.reduce_sum()
:;tf.reduce_mean()
:;tf.reduce_all()
:;详情请见 tf.data 模块;
Tensor.numpy()
:转成 ndarray 数组;init = tf.global_variables_initializer()
;sess.run(init)
;tf.Variable(initia_value=None, trainable=True, collections=None, name=None)
;
def variable_demo():
my_tensor = tf.constant([[1.0, 2.0], [3.0, 4.0]])
my_variable = tf.Variable(my_tensor)
bool_varible = tf.Variable([False, False, False, True])
complex_varible = tf.Variable([5 + 4j, 6 + 1j])
print("my_variable:\n", my_variable)
print("bool_varible:\n", bool_varible)
print("complex_varible:\n", complex_varible)
print("Shape:", my_variable.shape)
print("DType:", my_variable.dtype)
print("As numpty:", my_variable.numpy)
# 生命周期、命名
a = tf.Variable(my_tensor, name="Mark")
b = tf.Variable(my_tensor + 1, name="Mark")
print(a == b)
return None
tf.SparseTensor
:稀疏张量。有效地表示主要包含零的张量。tf.sparse 程序包包含稀疏张量的tf.TensorArray
:张量数组。张量的列表。默认情况下,它们的大小是固定的,但可以选择动tf.RaggedTensor
:不规则张量。表示张量列表的静态列表,其中每个张量具有相同的形状和数据tf.string类
:字符串张量。表示字节字符串,。tf.strings包(带有s)包含用于字节字符串和 Unicode 字符串的操作(并将它们转换为另一个)。tf.string 是原子级的;tf.app
:这个模块相当于为 TensorFlow 进行的脚本提供一个main函数入口,可以定义脚本运行的 flags;tf.image
:TensorFlow 的图像处理操作。主要是一些颜色变换、变形和图像的编码和解码;tf.gfile
:这个模块提供了一组文件操作函数;tf.summary
:用来生成 TensorBoard 可用的统计日志,目前 Summary 主要提供了 4 种类型:audio、image、histogram、scalar;tf.python_io
:用来读写 TFRecords 文件;tf.train
:这个模块提供了一些训练器,与 tf.nn 结合起来,实现一些网络的优化计算;tf.nn
:这个模块提供了一些构建神经网络的底层函数。TensorFlow 构建网络的核心模块,其中包含了添加各种层的函数,比如添加卷积层、池化层等;tf.keras
:Kears 本来是一个独立的深度学习库,tensorflow 将其学习过来,增加这部分模块在于快速构建模型;tf.layers
:高级 API,以便高级的概念层来定义一个模型。类似 tf.kears;tf.contrib
:tf.contrib.layers 提供够将计算图中的网络层、正则化、摘要操作,是构建计算图的高级操作,但是 tf.contrib 包含不稳定和实验代码,有可能以后 API 会改变;tf.estimator
:一个 estimator 相当于 model + training + evaluate 的合体。在模块中,已经实现了几种简单的分类器和回归其,包括:Baseline,learning 和 DNN。这里的 DNN 的网络,只是全连接网络,没有提供卷积之类的;tf.keras.optimizers.SGD(learning_rate=0.01)
tf.reduce_mean( tf.square(y_predict - y_ture) )
;tape.gradient(y, x)
;tf.matul(x, weights)
:矩阵运算;tf.square(y_predict - y_ture)
:平方;tf.reduce_mean( x )
:均值;tf.keras.optimizers.SGD(learning_rate)
:梯度下降优化;(1.x 为 tf.train.GrandientDescentOptimizer(learning_rate)
apply_gradients(grads_and_vars=zip(grads, variables))
:取某个特定的损失的最小值;zip(a, b)
:如果 a = [1,2,3],b = [4,5,6],则 zip(a, b) = [(1, 4), (2, 5), (3, 6)]。返回对象,想要返回数组需要 list(zip());def linear_refression():
# 1.准备数据
X = tf.random.normal(shape=[100, 1]) # 特征值 100行1列
y_true = tf.matmul(X, [[0.8]]) + 0.7 # 真实值 y_true = 0.8x + 0.7
# 2.定义变量
weights = tf.Variable(initial_value=tf.random.normal(shape=[1, 1])) # 权重
bias = tf.Variable(initial_value=tf.random.normal(shape=[1, 1])) # 偏置
variables = [weights, bias]
# 3.声明梯度下降优化算法
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)
# 查看初始化模型参数之后的值
print("训练前模型参数为:权重%f,偏置%f" % (weights.numpy(), bias.numpy()))
# 4.开始训练
# 声明循环迭代次数
num = 1000
for s in range(num):
with tf.GradientTape() as tape:
# 预测值
y_predict = tf.matmul(X, weights) + bias # 预测值
# 损失函数(均方误差)
loss = tf.reduce_mean(tf.square(y_predict - y_true))
# 计算梯度
grads = tape.gradient(loss, variables)
# 更新参数(最小化某个特定的损失函数)
optimizer.apply_gradients(grads_and_vars=zip(grads, variables))
# 每10次打印一次结果
if s % 10 == 0:
print("第%f次训练后模型参数为:权重%f,偏置%f,损失为%f" % (s, weights.numpy(), bias.numpy(), loss))
# 查看初始化模型参数之后的值
print("训练后模型参数为:权重%f,偏置 %f" % (weights.numpy(), bias.numpy()))
return None