No TensorFlow 2.0 e versões posteriores, o método Eager Execution é adotado por padrão, e a Session da versão 1.0 não é mais usada para criar sessões. O Eager Execution usa uma forma mais natural de organizar o código, sem construir um gráfico de cálculo, e pode realizar cálculos matemáticos imediatamente, o que simplifica o processo de depuração do código. Este artigo apresenta principalmente o uso básico do TensorFlow e apresenta o processo do TensorFlow otimizando a função de perda construindo uma função de perda simples.
Índice
O TensorFlow é uma plataforma de ponta a ponta para aprendizado de máquina. Ele suporta o seguinte:
- Cálculos numéricos baseados em matrizes multidimensionais (semelhante ao NumPy)
- GPUs e processamento distribuído
- diferenciação automática
- Construção, treinamento e exportação de modelos
1 tf.Tensor
O TensorFlow usa objetos tf.Tensor para lidar com matrizes multidimensionais (ou tensores). Veja a seguir um exemplo de um tensor 2D:
import tensorflow as tf
x = tf.constant([[1., 2., 3.],
[4., 5., 6.]])
print(x)
tf.Tensor(
[[1. 2. 3.]
[4. 5. 6.]], forma=(2, 3), dtype=float32)
Os atributos mais importantes de um objeto tf.Tensor são shape e dtype:
- Tensor.shape retorna o tamanho de cada dimensão do tensor
- Tensor.dtype retorna o tipo de dados dos elementos no tensor
print(x.shape)
(2, 3)
print(x.dtype)
<dtype: 'float32'>
O TensorFlow implementa operações matemáticas padrão em tensores, mas também inclui operações personalizadas para aprendizado de máquina. aqui estão alguns exemplos:
x + x
5 * x
tf.transpose(x)
tf.nn.softmax(x, axis=-1)
tf.reduce_sum(x)
2 tf. Variável
No TensorFlow, os pesos de um modelo são armazenados com objetos tf.Variable, chamados de variáveis.
import tensorflow as tf
x = tf.Variable([0., 0., 0.])
x.assign([1, 2, 3])
<tf.Variable 'UnreadVariable' shape=(3,) dtype=float32,
numpy=array([1., 2., 3.], dtype=float32)>
O valor do objeto tf.Variable pode ser alterado. No TensorFlow 2.0, a Session não é mais usada para iniciar o cálculo e a variável pode calcular diretamente o resultado.
x.assign_add([1, 1, 1,])
<tf.Variable 'UnreadVariable' shape=(3,) dtype=float32,
numpy=array([2., 3., 4.], dtype=float32)>
x.assign_sub([1, 1, 1])
<tf.Variable 'UnreadVariable' shape=(3,) dtype=float32,
numpy=array([1., 2., 3.], dtype=float32)>
3 tf.GradientTape
O método de descida do gradiente e os algoritmos relacionados são a base do aprendizado de máquina agora. O TensorFLow implementa diferenciação automática para calcular gradientes, normalmente usado para calcular gradientes de funções de perda para modelos de aprendizado de máquina.
O TensorFlow 2.0 fornece o objeto tf.GradientTape, que pode ser entendido como "fluxo de gradiente". Como o nome sugere, tf.GradientTape é usado para calcular o gradiente.
Aqui está um exemplo simples:
import tensorflow as tf
def f(x):
return x**2 + 2*x - 5
x = tf.Variable(1.0)
with tf.GradientTape() as tape:
y = f(x)
g_x = tape.gradient(y, x) # 计算 y 在 x = 1.0 处的梯度
print(g_x)
4.0
Por fim, crie uma função de perda simples e use o TensorFlow para calcular o mínimo.
import tensorflow as tf
def loss(x):
return x**2 - 10*x + 25
x = tf.Variable(1.0) # 随机初始值
losses = [] # 记录损失函数值
for i in range(100):
with tf.GradientTape() as tape:
one_loss = loss(x)
lossed.append(one_loss)
grad = tape.gradient(one_loss, x)
x.assign_sub(0.1 * grad) # 执行一次梯度下降法
print("The mininum of loss function is: ")
tf.print(x)
O mínimo da função de perda é:
4.99999905
# 可视化优化过程
import matplotlib
from matplotlib import pyplot as plt
matplotlib.rcParams['figure.figsize'] = [8, 5]
plt.figure()
plt.plot(losses)
plt.title('Loss vs training iterations')
plt.xlabel('iterations')
plt.ylabel('loss')