深度学习框架TensorFlow2初步入门学习

从TensorFlow到DL4J——主流深度学习框架对比分析 从TensorFlow到DL4J——主流深度学习框架对比分析 2022年2月22日 极链AI云 官网地址 点击注册 更多AI小知识,关注《极链AI云》公众号 文章目录从TensorFlow到DL4J——主流深度学习框架对比分析一、深度学习框架概述与深度学习技术的四大阵营二、主流开源深度学习框架的来龙去脉2.1 TensorFlow2.2 Keras2.3 Pytorch2.4 Theano2.4 Caffe2.5 Caffe22.6 Torch2.7 FastAI2.8 MXNet2.9 Gluon 阅读详情

TensorFlow2入门学习

TensorFlow 2 新增变化特性

TensorFlow 2 安装

2019 年初,TensorFlow 官方推出了 2.0 预览版本,也意味着 TensorFlow 即将从 1.x 过度到 2.x 时代。

在这里插入图片描述

根据 TensorFlow 官方介绍内容 显示,2.0 版本将专注于简洁性和易用性的改善,主要升级方向包括:

  • 使用 Keras 和 Eager Execution 轻松构建模型。
  • 在任意平台上实现稳健的生产环境模型部署。
  • 为研究提供强大的实验工具。
  • 通过清理废弃的 API 和减少重复来简化 API。

接下来,加载 TensorFlow 并查看版本号,看是否已经为 2.x。

In [ ]:

import tensorflow as tf

tf.__version__

在这里插入图片描述

Eager Execution

TensorFlow 2 带来的最大改变之一是将 1.x 的 Graph Execution(图与会话机制)更改为 Eager Execution(动态图机制)。在 1.x 版本中,低级别 TensorFlow API 首先需要定义数据流图,然后再创建 TensorFlow 会话,这一点在 2.0 中被完全舍弃。

TensorFlow 2 中的 Eager Execution 是一种命令式编程环境,可立即评估操作,无需构建图:操作会返回具体的值,而不是构建以后再运行的计算图。实际上,Eager Execution 在 1.x 的后期版本中也存在,但需要单独执行 tf.enable_eager_execution() 进行手动启用。不过,2.0 版本的 TensorFlow 默认采用了 Eager Execution,无法关闭并回到 1.x 的 Graph Execution 模式中。

下面,我们来演示 Eager Execution 带来的变化。

1.x 版本中,如果我们新建一个张量 tf.Variable([[1, 2], [3, 4]]) 并执行输出,那么只能看到这个张量的形状和属性,并不能直接输出其数值。结果如下:

<tf.Variable 'Variable:0' shape=(2, 2) dtype=int32_ref>

如今,Eager Execution 模式下则可以直接输出张量的数值了,并以 NumPy 数组方式呈现。

c = tf.Variable([[1, 2], [3, 4]])
c

在这里插入图片描述

你还可以直接通过 .numpy() 输出张量的 NumPy 数组。Eager Execution 适合与 NumPy 一起使用。NumPy 操作接受 tf.Tensor 参数。TensorFlow 数学运算将 Python 对象和 NumPy 数组转换为 tf.Tensor 对象。tf.Tensor.numpy 方法返回对象的值作为 NumPy ndarray。

c.numpy()

Eager Execution 带来的好处是不再需要手动管理图和会话。例如,现在使用示例张量进行数学计算,可以像 Python 一样直接相加。

c + c  # 加法计算

而在 1.x 版本中,我们需要初始化全局变量 → 建立会话 → 执行计算,最终才能打印出张量的运算结果。

init_op = tf.global_variables_initializer()  # 初始化全局变量
with tf.Session() as sess:  # 启动会话
    sess.run(init_op)
    print(sess.run(c + c))  # 执行计算

Eager Execution 带来的好处显而易见,其进一步降低了 TensorFlow 的入门门槛。之前,因为图与会话的模式,让很多人在入门时都很纳闷。除此之外,得益于自动微分的使用,在 Eager Execution 期间,可以使用 tf.GradientTape 这类跟踪操作以便稍后计算梯度。

In [1]:

w = tf.Variable([[1.0]])  # 新建张量

with tf.GradientTape() as tape:  # 追踪梯度
    loss = w * w

grad = tape.gradient(loss, w)  # 计算梯度
grad
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-1-1e9ac7891209> in <module>
----> 1 w = tf.Variable([[1.0]])  # 新建张量
      2 
      3 with tf.GradientTape() as tape:  # 追踪梯度
      4     loss = w * w
      5 

NameError: name 'tf' is not defined
`tf.GradientTape` 会像磁带一样记录下计算图中的梯度信息,然后使用 `.gradient` 即可回溯计算出任意梯度,这对于使用 TensorFlow 低阶 API 构建神经网络时更新参数非常重要。

在这里插入图片描述

Markdown Code

`tf.GradientTape` 会像磁带一样记录下计算图中的梯度信息,然后使用 `.gradient` 即可回溯计算出任意梯度,这对于使用 TensorFlow 低阶 API 构建神经网络时更新参数非常重要。

Eager Execution 的好处很多,但带来的问题也是很明显的,尤其是对于已经熟练使用 TensorFlow 的工程师而言简直是噩梦。

如今,TensorFlow 的默认执行模式为 Eager Execution,这就意味着之前基于 Graph Execution 构建的代码将完全无法使用,因为 2.0 中已经没有了相应的 API。例如,先前构建神经网络计算图时,都习惯于使用 tf.placeholder 占位符张量,等最终执行时再传入数据。Eager Execution 模式下,tf.placeholder 已无存在必要,所以此 API 已被移除。

所以,随着 TensorFlow 2 默认引入 Eager Execution 机制,也就意味着原 1.x 低阶 API 构建图的方法后续已无法使用。

TensorFlow Keras

TensorFlow 1.x 中,我们可以通过 tf.layers 高阶层封装开快速搭建神经网络。如果,2.0 已完全移除了 tf.layers 模块,转而引入了 tf.keras。

如果你熟悉 Keras 的使用,那么 tf.keras 用起来就得心应手了,因为其基本和单独发行版本一致,子模块结构也几乎完全一样。除此之外,原 tf.contrib 也已经在 2.0 版本中被移除。

TensorFlow2实现线性回归

低阶 API 实现

低阶 API 实现,实际上就是利用 Eager Execution 机制来完成。实验首先初始化一组随机数据样本,并添加噪声,然后将其可视化出来。

低阶 API 实现,实际上就是利用 Eager Execution 机制来完成。实验首先初始化一组随机数据样本,并添加噪声,然后将其可视化出来。
import matplotlib.pyplot as plt
import tensorflow as tf
%matplotlib inline

TRUE_W = 3.0
TRUE_b = 2.0
NUM_SAMPLES = 100

# 初始化随机数据
X = tf.random.normal(shape=[NUM_SAMPLES, 1]).numpy()
noise = tf.random.normal(shape=[NUM_SAMPLES, 1]).numpy()
y = X * TRUE_W + TRUE_b + noise  # 添加噪声

plt.scatter(X, y)

在这里插入图片描述

接下来,我们定义一元线性回归模型。

f𝑤,𝑏,𝑥)=𝑤∗𝑥+𝑏f(w,b,x)=w∗x+b

这里我们构建自定义模型类,并使用 TensorFlow 提供的 tf.Variable 随机初始化参数 𝑤w 和截距项 𝑏b。

class Model(object):
    def __init__(self):
        self.W = tf.Variable(tf.random.uniform([1]))  # 随机初始化参数
        self.b = tf.Variable(tf.random.uniform([1]))

    def __call__(self, x):
        return self.W * x + self.b  # w*x + b

对于随机初始化的 𝑤w 和 𝑏b,我们可以将其拟合直线绘制到样本散点图中。

model = Model()  # 实例化模型

plt.scatter(X, y)
plt.plot(X, model(X), c='r')

在这里插入图片描述

可以明显看出,直线并没有很好地拟合样本。当然,由于是随机初始化,也有极小概率一开始拟合效果非常好,那么重新执行一次上面的单元格另外随机初始化一组数据即可。

然后,我们定义线性回归使用到的损失函数。这里使用线性回归问题中常用的平方损失函数。对于线性回归问题中与数学相关的知识点,本次实验不再推动和讲解。

Loss(𝑤,𝑏,𝑥,𝑦)=∑𝑖=1𝑁(𝑓(𝑤,𝑏,𝑥𝑖)−𝑦𝑖)2Loss(w,b,x,y)=∑i=1N(f(w,b,xi)−yi)2

根据公式实现损失计算函数。

In [ ]:

def loss_fn(model, x, y):
    y_ = model(x)
    return tf.reduce_mean(tf.square(y_ - y))

接下来,就可以开始迭代过程了,这也是最关键的一步。使用迭代方法求解线性回归的问题中,我们首先需要计算参数的梯度,然后使用梯度下降法来更新参数。

𝑤 𝑏←𝑤−𝑙𝑟∗∂loss(𝑤,𝑏)∂𝑤←𝑏−𝑙𝑟∗∂loss(𝑤,𝑏)∂𝑏w←w−lr∗∂loss(w,b)∂w b←b−lr∗∂loss(w,b)∂b

公式中,𝑙𝑟lr 指代学习率。

TensorFlow 2 中的 Eager Execution 提供了 tf.GradientTape 用于追踪梯度。所以,下面我们就实现梯度下降法的迭代更新过程。

In [ ]:

EPOCHS = 10
LEARNING_RATE = 0.1

for epoch in range(EPOCHS):  # 迭代次数
    with tf.GradientTape() as tape:  # 追踪梯度
        loss = loss_fn(model, X, y)  # 计算损失
    dW, db = tape.gradient(loss, [model.W, model.b])  # 计算梯度
    model.W.assign_sub(LEARNING_RATE * dW)  # 更新梯度
    model.b.assign_sub(LEARNING_RATE * db)
    # 输出计算过程
    print('Epoch [{}/{}], loss [{:.3f}], W/b [{:.3f}/{:.3f}]'.format(epoch, EPOCHS, loss,
                                                                     float(model.W.numpy()),
                                                                     float(model.b.numpy())))

上面的代码中,我们初始化 tf.GradientTape() 以追踪梯度,然后使用 tape.gradient 方法就可以计算梯度了。值得注意的是,tape.gradient() 第二个参数支持以列表形式传入多个参数同时计算梯度。紧接着,使用 .assign_sub 即可完成公式中的减法操作用以更新梯度。

在这里插入图片描述

最终,我们绘制参数学习完成之后,模型的拟合结果。

In [ ]:

plt.scatter(X, y)
plt.plot(X, model(X), c='r')

如无意外,你将得到一个比随机参数好很多的拟合直线。

在这里插入图片描述

提示:由于是随机初始化参数,如果迭代后拟合效果仍然不好,一般是迭代次数太少的原因。你可以重复执行上面的迭代单元格多次,增加参数更新迭代次数,即可改善拟合效果。此提示对后面的内容同样有效。

高阶 API 实现

TensorFlow 2 中提供了大量的高阶 API 帮助我们快速构建所需模型,接下来,我们使用一些新的 API 来完成线性回归模型的构建。这里还是沿用上面提供的示例数据。

tf.keras 模块下提供的 tf.keras.layers.Dense 全连接层(线性层)实际上就是一个线性计算过程。所以,模型的定义部分我们就可以直接实例化一个全连接层即可。

In [ ]:

model = tf.keras.layers.Dense(units=1)  # 实例化线性层
model

其中,units 为输出空间维度。此时,参数已经被初始化了,所以我们可以绘制出拟合直线。

In [ ]:

plt.scatter(X, y)
plt.plot(X, model(X), c='r')

结果显示:

在这里插入图片描述

你可以使用 model.variables 打印出模型初始化的随机参数。

In [ ]:

model.variables

在这里插入图片描述

接下来就可以直接构建模型迭代过程了。

这里同样使用 tf.GradientTape() 来追踪梯度,我们简化损失计算和更新的过程。首先,损失可以使用现有 API tf.keras.losses.mean_squared_error 计算,最终使用 tf.reduce_sum 求得全部样本的平均损失。

In [ ]:

EPOCHS = 10
LEARNING_RATE = 0.002
for epoch in range(EPOCHS):  # 迭代次数
    with tf.GradientTape() as tape:  # 追踪梯度
        y_ = model(X)
        loss = tf.reduce_sum(tf.keras.losses.mean_squared_error(y, y_))  # 计算损失

    grads = tape.gradient(loss, model.variables)  # 计算梯度
    optimizer = tf.keras.optimizers.SGD(LEARNING_RATE)  # 随机梯度下降
    optimizer.apply_gradients(zip(grads, model.variables))  # 更新梯度

    print('Epoch [{}/{}], loss [{:.3f}]'.format(epoch, EPOCHS, loss))

其次,使用 model.variables 即可读取可参数的列表,无需像上面那样手动传入。这里不再按公式手动更新梯度,而是使用现有的随机梯度下降函数 tf.keras.optimizers.SGD,然后使用 apply_gradients 即可更新梯度。

在这里插入图片描述

最终,同样将迭代完成的参数绘制拟合直线到原图中。

In [ ]:

plt.scatter(X, y)
plt.plot(X, model(X), c='r')

在这里插入图片描述

如果拟合效果不好,请参考上文提示。

Keras 方式实现

上面的高阶 API 实现过程实际上还不够精简,我们可以完全使用 TensorFlow Keras API 来实现线性回归。

我们这里使用 Keras 提供的 Sequential 序贯模型结构。和上面的例子相似,向其中添加一个线性层。不同的地方在于,Keras 序贯模型第一层为线性层时,规定需指定输入维度,这里为 input_dim=1。

In [ ]:

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(units=1, input_dim=1))
model.summary()  # 查看模型结构

在这里插入图片描述

接下来,直接使用 .compile 编译模型,指定损失函数为 MSE 平方损失,优化器选择 SGD 随机梯度下降。然后,就可以使用 .fit 传入数据开始迭代了。

In [ ]:

model.compile(optimizer='sgd', loss='mse')
model.fit(X, y, steps_per_epoch=100)

在这里插入图片描述

steps_per_epoch 只的是在默认小批量为 32 的条件下,传入相应次数的小批量样本。最终绘制出迭代完成的拟合图像。

In [ ]:

plt.scatter(X, y)
plt.plot(X, model(X), c='r')

在这里插入图片描述

如果拟合效果不好,请参考上文提示。

如上所示,完全使用 Keras 高阶 API 实际上只需要 4 行核心代码即可完成。相比于最开始的低阶 API 简化了很多。

TensorFlow 1.x 实现

为了与 TensorFlow 2 线性回归实现过程进行对比。最终,我们给出 TensorFlow 1.x 线性回归实现代码。这里,我们需要实验 TensorFlow 2 中 tensorflow.compat.v1 模块下提供的兼容性代码。

In [ ]:

import tensorflow.compat.v1 as tf

tf.disable_v2_behavior() # 关闭 Eager Execution 特性

在这里插入图片描述

接下来,就可以使用 TensorFlow 1.x 中提供的图与会话方式来实现线性回归过程了。

In [ ]:

X_train = tf.placeholder(tf.float32)  # 定义占位符张量
y_train = tf.placeholder(tf.float32)
W = tf.Variable(tf.random.normal([1]))  # 初始化参数
b = tf.Variable(tf.random.normal([1]))

LEARNING_RATE = 0.001  # 学习率

y_train_ = W*X_train + b  # 线性函数
loss = tf.reduce_mean(tf.square(y_train_ - y_train))  # 平方损失函数
optimizer = tf.train.GradientDescentOptimizer(
    LEARNING_RATE).minimize(loss)  # 梯度下降优化损失函数

EPOCHS = 1000  # 迭代次数
with tf.Session() as sess: # 启动会话
    tf.global_variables_initializer().run()  # 初始化全局变量
    for epoch in range(EPOCHS):  # 迭代优化
        sess.run(optimizer, feed_dict={X_train:X, y_train:y})
    final_weight = sess.run(W)  # 最终参数
    final_bias = sess.run(b)

print(final_weight, final_bias)

在这里插入图片描述

最后,我们依据迭代更新的参数,将拟合直线绘制到原图中。

In [ ]:

preds = final_weight * X + final_bias  # 计算预测值
plt.scatter(X, y)
plt.plot(X, preds, c='r')

在这里插入图片描述

实验总结

本次实验中,我们利用 TensorFlow 2 提供的 Eager Execution 实现了线性回归的经典过程。同时,利用 TensorFlow Keras 高阶 API 简化了实现步骤。实验的最后,使用 TensorFlow 1.x API 进行了对比示例,希望你能够准确把握 TensorFlow 2 和 1.0 之间的区别。

TensorFlow2构建前馈神经网络

低阶 API 构建

学习完线性回归中的低阶 API 实现方法,那么使用 TensorFlow 2 低阶 API 构建神经网络实际上就比较简单了。这里,我们先加载一组数据,DIGITS 数据集是 scikit-learn 提供的简单手写字符识别数据集。

我们读取数据集并进行简单切分,这里对字符标签进行了独热编码方便后面计算损失值。

In [1]:

import numpy as np
import tensorflow as tf
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split

digits = load_digits()
digits_y = np.eye(10)[digits.target.reshape(-1)]  # 标签独热编码
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits_y,
                                                    test_size=0.2, random_state=1)

X_train.shape, X_test.shape, y_train.shape, y_test.shape

Out[1]:

((1437, 64), (360, 64), (1437, 10), (360, 10))

下面,使用 TensorFlow 2 低阶 API 构建一个包含 1 个隐含层的简单神经网络结构。神经网络的输入是单个手写字符样本的向量长度 64,隐含层输入为 30,最终的输出层为 10。

在这里插入图片描述

特别地,我们对隐含层进行 RELU 激活,输出层不激活。输出层的单样本长度为 10,这样正好就和上方独热编码后的值对应上了。

In [ ]:

class Model(object):
    def __init__(self):
        self.W1 = tf.Variable(tf.random.normal([64, 30]))  # 随机初始化张量参数
        self.b1 = tf.Variable(tf.random.normal([30]))

        self.W2 = tf.Variable(tf.random.normal([30, 10]))
        self.b2 = tf.Variable(tf.random.normal([10]))

    def __call__(self, x):
        x = tf.cast(x, tf.float32)  # 转换输入数据类型
        # 线性计算 + RELU 激活
        fc1 = tf.nn.relu(tf.add(tf.matmul(x, self.W1), self.b1))
        fc2 = tf.add(tf.matmul(fc1, self.W2), self.b2)
        return fc2

下面,我们开始构建损失函数。损失函数使用 TensorFlow 提供的 tf.nn.softmax_cross_entropy_with_logits,这是一个自带 Softmax 的交叉熵损失函数。最终通过 reduce_mean 求得全局平均损失。

In [ ]:

def loss_fn(model, x, y):
    preds = model(x)
    return tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=preds, labels=y))

于此同时,为了方便查看分类准确度,我们需要手动构建一个准确度评估函数。tf.argmax 可以将 Softmax 结果转换为对应的字符值。然后使用 tf.equal 比对各样本的结果是否正确,最终使用 reduce_mean 求得全部样本的分类准确度。

In [ ]:

def accuracy_fn(logits, labels):
    preds = tf.argmax(logits, axis=1)  # 取值最大的索引,正好对应字符标签
    labels = tf.argmax(labels, axis=1)
    return tf.reduce_mean(tf.cast(tf.equal(preds, labels), tf.float32))

下面开始构建最关键的训练迭代过程。实际上,这部分和构建线性回归非常相似,我们的目的是对神经网络参数进行迭代优化。

In [ ]:

EPOCHS = 100  # 迭代此时
LEARNING_RATE = 0.02  # 学习率
model = Model()  # 模型
for epoch in range(EPOCHS):
    with tf.GradientTape() as tape:  # 追踪梯度
        loss = loss_fn(model, X_train, y_train)

    trainable_variables = [model.W1, model.b1, model.W2, model.b2]  # 需优化参数列表
    grads = tape.gradient(loss, trainable_variables)  # 计算梯度

    optimizer = tf.optimizers.Adam(learning_rate=LEARNING_RATE)  # 优化器
    optimizer.apply_gradients(zip(grads, trainable_variables))  # 更新梯度
    accuracy = accuracy_fn(model(X_test), y_test)  # 计算准确度

    # 输出各项指标
    if (epoch + 1) % 10 == 0:
        print('Epoch [{}/{}], Train loss: {:.3f}, Test accuracy: {:.3f}'
              .format(epoch+1, EPOCHS, loss, accuracy))

在这里插入图片描述

Keras 高阶 API 实现

线性回归的实验中,我们使用了 Sequential 序贯模型,实际上 Keras 中更容易理解的是函数式模型。函数式模型最直观的地方在于可以看清楚输入和输出。

函数式模型

例如,下面我们开始定义函数式模型。首先是 Input 层,这在序贯模型中是没有的。然后我们将 inputs 传入 Dense 层,最终再输出。

In [ ]:

# 函数式模型
inputs = tf.keras.Input(shape=(64,))
x = tf.keras.layers.Dense(30, activation='relu')(inputs)
outputs = tf.keras.layers.Dense(10, activation='softmax')(x)

# 指定输入和输出
model = tf.keras.Model(inputs=inputs, outputs=outputs)
model.summary()  # 查看模型结构

在这里插入图片描述

值得注意的是,函数式模型中需要使用 tf.keras.Model 来最终确定输入和输出。

下面,可以开始编译和训练模型。这里使用 tf.optimizers.Adam 作为优化器,tf.losses.categorical_crossentropy 多分类交叉熵作为损失函数。与 tf.nn.softmax_cross_entropy_with_logits 不同的是,tf.losses.categorical_crossentropy 是从 Keras 中演化而来的,其去掉了 Softmax 的过程。而这个过程被我们直接加入到模型的构建中。你可以看到,上面的 model 输出层使用了 softmax 激活。

In [ ]:

# 编译模型
model.compile(optimizer=tf.optimizers.Adam(),
              loss=tf.losses.categorical_crossentropy, metrics=['accuracy'])
# 训练和评估
model.fit(X_train, y_train, batch_size=64, epochs=10,
          validation_data=(X_test, y_test))

在这里插入图片描述

Keras 的训练过程可以采用小批量迭代,直接指定 batch_size 即可。validation_data 可以传入测试数据得到准确度评估结果,非常方便。

序贯模型

当然,上方的函数式模型也可以被写为序贯模型。下面,我们就使用序贯模型进行实现。

In [ ]:

model = tf.keras.Sequential()  # 建立序贯模型
model.add(tf.keras.layers.Dense(units=30, input_dim=64, activation='relu'))  # 隐含层 
model.add(tf.keras.layers.Dense(units=10, activation='softmax'))  # 输出层
model.summary()  # 查看模型结构

在这里插入图片描述

此时,我们使用参数简写来替代函数式模型中复杂的写法。

In [ ]:

model.compile(optimizer='adam', loss='categorical_crossentropy',
              metrics=['accuracy'])
model.fit(X_train, y_train, batch_size=64, epochs=10,
          validation_data=(X_test, y_test))

在这里插入图片描述

自由度更高的模型

TensorFlow 2 中还支持另外一种更为灵活的 Keras 定义模型方法,这种方法和 PyTorch 中继承 torch.nn.Module 来定义模型的思路非常相似。我们可以继承 tf.keras.Model 来构建模型。这种模型的定义方法自由度更高,我们可以添加更多的中间组件,相对灵活。

In [ ]:

class Model(tf.keras.Model):
    def __init__(self):
        super(Model, self).__init__()
        self.dense_1 = tf.keras.layers.Dense(30, activation='relu')  # 初始化
        self.dense_2 = tf.keras.layers.Dense(10, activation='softmax')

    def call(self, inputs):
        x = self.dense_1(inputs)  # 前向传播过程
        return self.dense_2(x)

接下来的过程和上面相似,实例化模型然后训练并评估。

In [ ]:

model = Model()  # 实例化模型
model.compile(optimizer='adam', loss='categorical_crossentropy',
              metrics=['accuracy'])
model.fit(X_train, y_train, batch_size=64, epochs=10,
          validation_data=(X_test, y_test))

在这里插入图片描述

在这里插入图片描述

实验总结

本次实验中,我们实验中 TensorFlow 2 构建了简单的前馈神经网络,并完全手写字符识别分类。特别地,一定要掌握 Eager Execution 的实现过程,而对于 TensorFlow Keras 的使用也应用有充分的理解。

DL-5 深度学习框架的对比 在深度学习领域的五大巨头里,它们都各自力挺一种深度学习框架:像谷歌有自家的TensorFlow、Facebook有Torch、百度有Paddle Paddle、微软有CNTK、而亚马逊的AWS则有MXNet,现在还有支持HADOOP的NL4J深度学习框架。 表1.1 是五大主流深度学习框架概要对比表。每种框架都有其优缺点,选择的时候更加需要根据自身业务的实际需求。例如需要用到对时间序列分析的,那么就会使用循环神经网络RNN,而Caffe、MXNet就是对图像卷积处理非常友善而缺乏循环神经网络,Googl 阅读详情

相关推荐

优化器 - tf.keras.optimizers.SGD()【TensorFlow2入门手册】

函数原型 tf.keras.optimizers.SGD( learning_rate=0.01, momentum=0.0, nesterov=False, name='SGD', **kwargs ) 官网地址:https://tensorflow.google.cn/api_docs/python/tf/keras/optimizers/SGD 作用 优化模型 参数 learning_rate:学习率,默认为0.01 momentum:动量,加速相关方向的梯度下降并抑制振荡,默认为0。 .

“365天深度学习训练营”报名进行中~ 6517

深度学习入门2:自制框架DeZero

【代码】DeZero。

CS蝼蚁的博客 3078

TensorFlow2 入门指南 | 01 浅谈 TensorFLow2 入门

还在学TensorFlow1.x,你out了!大佬们都在用Tensorflow2了!

不积跬步,无以至千里! 7476

如何从零开始构建深度学习项目?这里有一份详细的教程

选自Medium作者:Jonathan Hui机器之心编译在学习了有关深度学习的理论课程之后,很多人都会有兴趣尝试构建一个属于自己的项目。本文将会从第一步开始,告诉你如何...

深度学习世界 3832

新手入门深度学习 | 0-2:深度学习(DL)是什么?

文章目录一、深度学习是什么二、实现过程1. 准备数据导入数据可视化调整图片格式2. 构建神经网络模型3. 编译模型4. 训练模型5. 预测三、总结推荐一些不能错过的练手项目(附代码+讲解) ???? 我的环境: 语言环境:Python3.6.5 编译器:Jupyter Notebook 深度学习环境:TensorFlow2.4.1 ???? 往期内容: 小白入门深度学习 | 第一篇:配置深度学习环境 小白入门深度学习 | 第二篇:编译器的使用-Jupyter Notebook ???? 本文选自专

“365天深度学习训练营”报名进行中~ 5196

深度学习入门 2:自制框架配套代码详解

资源下载链接为: https://pan.quark.cn/s/2a087dfe7ac7 深度学习入门 2:自制框架配套代码详解(最新、最全版本!打开链接下载即可用!)

深度学习框架(转自知乎)

作者:ZOMI链接:https://www.zhihu.com/question/53465308/answer/289859169来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。吃货的我来举个栗子。深度学习就像菜谱,数据就是肉和青菜,深度学习框架就是炒菜的锅和铲。谁说炒一碟红烧土豆一定要用caffe出品的锅,谁说炒一碟香煎莲藕一定要用google出品的铲?我们只要学...

imissucc的博客 4100

PyTorch入门指南:从零开始掌握深度学习框架.pdf

内容概要:本文作为PyTorch的入门指南,首先介绍了PyTorch相较于TensorFlow的优势——动态计算图、自动微分和丰富API。接着讲解了环境搭建、PyTorch核心组件如张量(Tensor)、autograd模块以及神经网络的定义方式(如nn.Module),并且给出了详细的神经网络训练流程,包括前向传播、计算损失值、进行反向传播以计算梯度,最终调整权重参数。此外还简要提及了一些拓展资源以便进一步探索这个深度学习工具。 适用人群:初次接触深度学习技术的新学者和技术爱好者,有一定程序基础并希望通过PyTorch深入理解机器学习算法实现的人。 使用场景及目标:该文档有助于建立使用者对于深度学习及其具体实践有更加直观的理解,在完成本教程之后,读者应当能够在个人设备上正确部署Python环境,并依据指示独立创建自己的简易深度学习项目。 其他说明:文中所提及的所有示例均可被完整重现,同时官方提供的资料链接也可以方便有兴趣的人士对感兴趣之处继续挖掘,这不仅加深了对PyTorch本身的熟悉程度,也为未来的研究或者工程项目打下了良好的理论基础和实践经验。

深度学习 TensorFlow入门

深度学习框架TensorFlow一经发布,就受到了广泛的关注,并在计算机视觉、音频处理、推荐系统和自然语言处理等场景下都被大面积推广使用,接下来我们深入浅出的介绍Tensorflow的相关应用。TensorFlow的依赖视图如下所示:TensorFlow 2.0 将专注于简单性和易用性,工作流程如下所示:1、使用tf.data加载数据。 使用tf.data实例化读取训练数据和测试数据2、模型的建立与调试: 使用动态图模式 Eager Execution 和著名的神经网络高层 API 框架 Keras,结合可

mengxianglong123的博客 5万+

论文精读——A Comprehensive Survey of Continual Learning: Theory, Method and Application

为了应对现实世界的动态性,智能系统需要在其整个生命周期中逐步获取、更新、积累并利用知识。这种能力被称为Continue Learning(持续学习)。从广义上讲,持续学习明显受到catastrophic forgetting(灾难性遗忘)的限制,即学习新任务通常会导致旧任务的性能急剧下降。Continue Learning的核心目的有二,其一为(稳定性与可塑性间的权衡),其二为(足够的任务内/任务间泛化能力)。

xsddys的博客 1241

Supermind量化实战:我如何给双均线策略加上“止损”和“仓位管理”,让回测收益更稳健

本文详细介绍了如何在Supermind平台上为双均线策略添加止损和仓位管理模块,以提升量化交易的稳健性。通过Python实现动态止损和智能仓位管理,策略的年化收益率从12.3%提升至15.8%,最大回撤从58.7%降至22.4%,Sharpe比率显著提高。这些实战技巧适用于量化交易爱好者,帮助他们在黑天鹅行情中保持收益稳定。

weixin_42567752的博客 361

吐血整理深度学习入门路线及导航【教学视频+大神博客+书籍整理】+【资源页】(2019年已经最后一个月了,你还不学深度学习吗???)

声明: 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献。 2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。 3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。 4)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。大家都共享一点点,一起为祖国科研的推进...

种树最好的时间是10年前,其次是现在!!! 5万+

Git Worktree + Claude Code:多终端并发开发完全实战

深入讲解如何使用 Git Worktree 配合多终端 Claude Code 实现并发开发,通过实战案例展示如何在 Android 开发中提升 2-3 倍效率,彻底告别等待 AI 的问题。

Cheson的专栏 1201

DL框架之Tensorflow:深度学习框架Tensorflow的简介、安装、使用方法之详细攻略

​ DL框架之Tensorflow:深度学习框架Tensorflow的简介、安装、使用方法之详细攻略 目录 Tensorflow的简介 1、描述 2、TensorFlow的六大特征 3、了解Tensorflow 4、TensorBoard:可视化学习 Tensorflow的安装 TensorFlow基础知识架构 1、基础知识架构 2、计算图与会话 2、相关概念 TensorFlow的使用方法 1、基础函数 2、输出tensorflow的版本号 案例应用 1、使用常量和占

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 1万+

搞懂 ABAP 里的 Language Settings:登录语言、文本环境语言与 sy-langu 的真实含义

SAP系统中语言设置并非单一字段决定,而是由登录语言(logon language)和文本环境语言(text environment language)共同控制。登录语言在会话期间固定,而文本环境语言可通过SET LOCALE语句修改,影响文本处理、排序、异常显示等行为。开发中需区分两者:使用CL_ABAP_SYST方法获取登录语言,通过sy-langu或GET LOCALE获取当前文本环境语言。语言环境切换应谨慎处理并尽快恢复,避免影响会话中其他程序。在多语言场景下,正确处理语言设置对确保文本相关功能正常

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1306

Authentication Assertion Tickets,SAP 系统到系统单点登录里的短命凭证

SAP 系统间的身份传递机制存在 Authentication Assertion Ticket 和 SAP Logon Ticket 两种易混淆的凭证。前者用于系统间短时身份委托(有效期2分钟,通过HTTP头传输),后者用于浏览器SSO(可配置有效期,通过Cookie传输)。Assertion Ticket依赖签发系统的数字签名和严格的时间同步,适用于ABAP/Java系统间的后台作业调用。现代SAP架构已转向OAuth 2.0等标准协议,但老系统中仍需注意两种票据的关键差异:传输方式、有效期、接收方限制

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 602

12大深度学习开源框架(caffe,tensorflow,pytorch,mxnet等)汇总详解

这是一篇总结文,给大家来捋清楚12大深度学习开源框架的快速入门,这是有三AI的GitHub项目,欢迎大家star/fork。 https://github.com/longpeng2008/yousan.ai 1 概述 1.1 开源框架总览 现如今开源生态非常完善,深度学习相关的开源框架众多,光是为人熟知的就有caffe,tensorflow,pytorch/caffe2,keras,mxnet,paddldpaddle,theano,cntk,deeplearning4j,matconvnet

YBAdiam的博客 3万+

海思Hi3519A开发:DSP开发指南

通过创建DSP项目、实现算法、编译调试等步骤,开发者可以充分利用Hi3519A芯片集成的DSP,实现各种音视频处理功能。通过以上示例,我们可以看到在Hi3519A开发平台上进行DSP开发是一项强大而灵活的任务。在调试过程中,可以使用调试工具提供的功能,如断点设置、变量查看等,以便更好地理解和优化DSP算法的执行过程。在Hi3519A开发平台上,我们可以利用DSP的高性能计算能力来加速这些算法的执行。在实际的DSP开发中,算法的实现可能更加复杂,需要结合具体的项目需求进行。3.2 DSP算法实现。

QoTypescript的博客 1494

各深度学习框架优缺点

TensorFlow 的官网地址为 https://www.tensorflow.org/。TensorFlow 逐渐成为最流行的深度学习框架,目前在 GitHub 中已经有 1500 多个与深度学习相关的包中提到了 TensorFlow,而其中只有 5 个是谷歌公司官方提供的,可想而知它的应用是多么广泛。TensorFlow 在很大程度上推动了深度学习的发展,并成为这个行业的标准,目前可以说是深度学习的代名词了。

图像学习之旅 1208

r3live 使用前提 雷达-相机外参标定 livox_camera_lidar_calibration

港科大livox_camera_calib虽然操作方便,但是使用mid360雷达会有视角问题(投影三维点到相机),尝试了很多场景,标定效果都不理想(推荐场景是楼梯间),看来港大的更适合avia之类窄角度的雷达。如果标定效果不好的话,就使用 getExt2节点,getExt1节点只优化外参,而getExt2节点在计算的时候会将一开始计算的内参作为初值和外参一起优化。一般使用getExt1节点即可,如果在外参初值验证过,并且异常值已经剔除后,优化还是有较大的残差,那么可以使用getExt2试一试。

z1872385的博客 2399

EMC辐射整改常用的4种整改方法

例如,产品设计研发工程师们根据需求,设计出效果良好的滤波电路,置入产品I/O(输入/输出)接口的前级,可使因传导而进入系统的干扰噪声消除在电路系统的入口处;通过选择元器件和合理安排的电路系统,使干扰的影响减少。有些频率点是通过电路板上走线分布参数所决定的,通过前述方法不大有用,此类整改通过在走线中增加小的电感、电容、磁珠来改变电路参数结构,使其移到限值要求较高的频率点上。电线电缆的分类整理在电子设备中,线间耦合是一种重要的途径,也是造成干扰的重要原因,因为频率的因素,可大体分为高频耦合与低频耦合。

学海无涯的专栏 3118

『DL笔记』常见深度学习框架Theano、TensorFlow、Keras、Caffe/Caffe2、MXNet、CNTK、PyTorch对比

目录 1、常见的深度学习框架 2、Theano 3、TensorFlow 2、Keras 3、Caffe/Caffe2 4、MXNet 5、CNTK 6、PyTorch 7、其他框架 1、常见的深度学习框架 常见的深度学习框架有 TensorFlow 、Caffe、Theano、Keras、PyTorch、MXNet等,如下图所示。这些深度学习框架被应用于计算机视觉、语音识别...

AI新视界 8015

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

为什么选择DL on Flink?揭秘Flink与深度学习框架融合的核心优势

DL on Flink是一个将Flink与深度学习框架(如TensorFlow、PyTorch等)深度集成的开源项目,旨在实现在Flink集群上进行分布式深度学习训练和推理。对于希望构建高效、统一数据处理与AI训练平台的企业和开发者来说,DL on Flink提供了前所未有的技术优势。 ## 🌟 统一批流处理,简化深度学习工作流 传统深度学习框架往往需要独立的集群资源和数据预处理流程,而DL

gitblog_01066的博客 879

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

TensorFlow实战指南从入门到精通的深度学习框架解析

TensorFlow是由Google Brain团队开发的一款开源机器学习框架,自2015年发布以来,迅速成为深度学习领域最受欢迎的工具之一。其名称来源于处理数据流图的张量流概念,即数据以多维数组的形式在计算图中流动。TensorFlow的核心优势在于其灵活的计算图结构、强大的分布式计算能力以及跨平台兼容性。该框架支持从简单的线性回归到复杂的神经网络模型构建,使得研究人员和工程师能够高效地实现各种机器学习算法。无论是在学术研究还是工业应用中,TensorFlow都展现出了其卓越的性能和可扩展性。

邋遢大王 1610

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

TensorFlow2 Python深度学习 - TensorFlow2框架入门 - 神经网络基础原理

TensorFlow2 Python深度学习 - TensorFlow2框架入门 - 神经网络基础原理

java1234的博客 1435

DL框架之TensorFlow:深度学习框架TensorFlow Core(低级别TensorFlow API)的简介、安装、使用方法之详细攻略

​ DL框架之TensorFlow:TensorFlow Core(低级别TensorFlow API)的简介、安装、使用方法之详细DL框架之TensorFlow:深度学习框架TensorFlow Core(低级别TensorFlow API)的简介、安装、使用方法之详细攻略 目录 TensorFlow Core的简介 TensorFlow Core的安装 TensorFlow Core的使用方法 图 TensorBoard 会话 (Session) Te

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 1万+
上一篇: 云应用系统开发技术考点(面试题相关)
下一篇: 云计算平台OpenStack安装常见问题
小枫学IT
博客等级 码龄8年 7500粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小枫学IT

如果觉得有用的话,可以支持一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值