Tensorflow Es PDF
Tensorflow Es PDF
#tensorflow
Tabla de contenido
Acerca de 1
Observaciones 2
Examples 2
Instalación o configuración 2
Ejemplo básico 2
Regresión lineal 2
Fundamentos de Tensorflow 4
Contando hasta 10 6
Observaciones 8
Examples 8
Introducción 11
Examples 11
Examples 13
Introducción 15
Observaciones 15
Examples 15
Examples 18
Parámetros 19
Examples 19
Ejemplo basico 19
Introducción 21
Parámetros 21
Observaciones 21
Examples 22
Rutina principal 23
Rutina de normalización 23
Introducción 25
Observaciones 25
Examples 25
Introducción 27
Observaciones 27
Examples 28
Salvando el modelo 28
Restaurando el modelo 29
Examples 31
Examples 37
Introducción 42
Examples 42
Examples 46
Multiplicación elemental 46
Producto de punto 47
Examples 49
Parámetros 51
Examples 51
Examples 54
Ejemplo mínimo 54
Examples 59
Examples 60
Capítulo 20: Usando la condición if dentro del gráfico TensorFlow con tf.cond 62
Parámetros 62
Observaciones 62
Examples 62
Ejemplo basico 62
Examples 64
Ejemplo basico 64
Parámetros 67
Observaciones 67
Examples 68
Un ejemplo de trabajo completo de una red neuronal de 2 capas con normalización de lotes ( 68
Construir grafico 70
Examples 72
Introducción 74
Examples 74
Creditos 76
Acerca de
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version
from: tensorflow
It is an unofficial and free tensorflow ebook created for educational purposes. All the content is
extracted from Stack Overflow Documentation, which is written by many hardworking individuals at
Stack Overflow. It is neither affiliated with Stack Overflow nor official tensorflow.
The content is released under Creative Commons BY-SA, and the list of contributors to each
chapter are provided in the credits section at the end of this book. Images may be copyright of
their respective owners unless otherwise specified. All trademarks and registered trademarks are
the property of their respective company owners.
Use the content presented in this book at your own risk; it is not guaranteed to be correct nor
accurate, please send your feedback and corrections to [email protected]
https://riptutorial.com/es/home 1
Capítulo 1: Empezando con tensorflow
Observaciones
Esta sección proporciona una descripción general de qué es tensorflow y por qué un desarrollador
puede querer usarlo.
También debe mencionar cualquier tema grande dentro de tensorflow, y vincular a los temas
relacionados. Dado que la Documentación para tensorflow es nueva, es posible que deba crear
versiones iniciales de los temas relacionados.
Examples
Instalación o configuración
A partir de la versión 1.0 de Tensorflow, la instalación se ha vuelto mucho más fácil de realizar.
Como mínimo para instalar TensorFlow, es necesario instalar un pip en su máquina con una
versión de python de al menos 2.7 o 3.3+.
Para tensorflow en una máquina GPU (a partir de 1.0 requiere CUDA 8.0 y cudnn 5.1, no se
admite la GPU AMD)
import tensorflow
Si eso tuvo éxito sin error, entonces tiene tensorflow instalado en su máquina.
* Tenga en cuenta que esta referencia a la rama maestra puede cambiar esto en el enlace
anterior para hacer referencia a la versión estable actual.)
Ejemplo básico
Tensorflow es más que un marco de aprendizaje profundo. Es un marco de cálculo general para
realizar operaciones matemáticas generales de manera paralela y distribuida. Un ejemplo de esto
se describe a continuación.
https://riptutorial.com/es/home 2
Regresión lineal
Un ejemplo estadístico básico que se utiliza comúnmente y es bastante simple de calcular es
ajustar una línea a un conjunto de datos. El método para hacerlo en tensorflow se describe a
continuación en el código y los comentarios.
La construcción del gráfico se realiza utilizando la API de Python TensorFlow (también se podría
hacer utilizando la API de C ++ TensorFlow). Ejecutar el gráfico llamará rutinas de C ++ de bajo
nivel.
'''
function: create a linear model which try to fit the line
y = x + 2 using SGD optimizer to minimize
root-mean-square(RMS) loss function
'''
import tensorflow as tf
import numpy as np
# number of epoch
num_epoch = 100
# This part of the script builds the TensorFlow graph using the Python API
https://riptutorial.com/es/home 3
# is run
# Declare weight variable initialized using a truncated_normal law
W = tf.Variable(tf.truncated_normal([1, 1], stddev=0.1))
# Declare bias variable initialized to a constant 0.1
b = tf.Variable(tf.constant(0.1, shape=[1]))
# loss function
loss = tf.mul(tf.reduce_mean(tf.square(tf.sub(y_pred, y_ph))), 1. / 2)
# create training graph
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
# This part of the script runs the TensorFlow graph (variables and operations
# operators) just built.
with tf.Session() as sess:
# initialize all the variables by running the initializer operator
sess.run(init)
for epoch in xrange(num_epoch):
# Run sequentially the train_op and loss operators with
# x_ph and y_ph placeholders fed by variables x and y
_, loss_val = sess.run([train_op, loss], feed_dict={x_ph: x, y_ph: y})
print('epoch %d: loss is %.4f' % (epoch, loss_val))
Fundamentos de Tensorflow
Tensorflow funciona en principio de gráficos de flujo de datos. Para realizar algún cálculo hay dos
pasos:
Representación: como cualquier gráfico dirigido, un gráfico Tensorflow consta de nodos y bordes
direccionales.
Nodo: Un nodo también se denomina Op (significa operación). Un nodo puede tener varios
bordes entrantes pero un solo borde saliente.
Borde: indica los datos entrantes o salientes de un nodo. En este caso, entrada (s) y salida de
algunos Nodos (Op).
Cuando decimos datos nos referimos a un vector n-dimensional conocido como Tensor. Un tensor
tiene tres propiedades: rango, forma y tipo
https://riptutorial.com/es/home 4
• Rango significa el número de dimensiones del Tensor (un cubo o caja tiene rango 3).
• Forma significa valores de esas dimensiones (el cuadro puede tener forma 1x1x1 o 2x5x7).
• Tipo significa tipo de datos en cada coordenada de Tensor.
Ejecución: a pesar de que se construye un gráfico, sigue siendo una entidad abstracta. Ningún
cálculo realmente ocurre hasta que lo ejecutamos. Para ejecutar un gráfico, necesitamos asignar
recursos de CPU a Operaciones dentro del gráfico. Esto se hace utilizando sesiones de
Tensorflow. Los pasos son:
Una ventaja entrante en una Op es como una dependencia de datos en otra Op. Por lo tanto,
cuando ejecutamos cualquier Op, todos los bordes entrantes se trazan y las operaciones en el
otro lado también se ejecutan.
Nota: También son posibles los nodos especiales llamados rol de juego de origen de datos o
sumidero. Por ejemplo, puede tener una Op que da un valor constante, por lo tanto no hay bordes
entrantes (consulte el valor 'matrix1' en el ejemplo a continuación) y de manera similar, Op sin
bordes salientes donde se recopilan los resultados (consulte el 'producto' en el ejemplo a
continuación).
Ejemplo:
import tensorflow as tf
https://riptutorial.com/es/home 5
# multiplication.
product = tf.matmul(matrix1, matrix2)
# To run the matmul op we call the session 'run()' method, passing 'product'
# which represents the output of the matmul op. This indicates to the call
# that we want to get the output of the matmul op back.
#
# All inputs needed by the op are run automatically by the session. They
# typically are run in parallel.
#
# The call 'run(product)' thus causes the execution of three ops in the
# graph: the two constants and matmul.
#
# The output of the op is returned in 'result' as a numpy `ndarray` object.
result = sess.run(product)
print(result)
# ==> [[ 12.]]
Contando hasta 10
En este ejemplo, usamos Tensorflow para contar hasta 10. Sí, esto es una exageración total, pero
es un buen ejemplo para mostrar una configuración mínima absoluta necesaria para usar
Tensorflow
import tensorflow as tf
# update phase adds state and one and then assigns to state
addition = tf.add(state, one)
update = tf.assign(state, addition )
# create a session
with tf.Session() as sess:
# initialize session variables
sess.run( tf.global_variables_initializer() )
https://riptutorial.com/es/home 6
contienen valores. En su lugar, son referencias a objetos Tensorflow. El resultado final no es el
estado , sino que se recupera utilizando un Tensorflow para evaluarlo utilizando sess.run
(estado)
https://riptutorial.com/es/home 7
Capítulo 2: ¿Cómo usar TensorFlow Graph
Collections?
Observaciones
Cuando tiene un modelo enorme, es útil formar algunos grupos de tensores en su gráfico
computacional, que están conectados entre sí. Por ejemplo, la clase tf.GraphKeys contiene
colecciones estándar tales como:
tf.GraphKeys.VARIABLES
tf.GraphKeys.TRAINABLE_VARIABLES
tf.GraphKeys.SUMMARIES
Examples
Crea tu propia colección y úsala para recoger todas tus pérdidas.
Aquí crearemos una colección para las pérdidas del gráfico computacional de la red neuronal.
with tf.variable_scope("Layer"):
W = tf.get_variable("weights", [m, k],
initializer=tf.zeros_initializer([m, k], dtype=tf.float32))
b1 = tf.get_variable("bias", [k],
initializer = tf.zeros_initializer([k], dtype=tf.float32))
z = tf.sigmoid((tf.matmul(input, W) + b1))
with tf.variable_scope("Softmax"):
U = tf.get_variable("weights", [k, r],
initializer=tf.zeros_initializer([k,r], dtype=tf.float32))
b2 = tf.get_variable("bias", [r],
initializer=tf.zeros_initializer([r], dtype=tf.float32))
out = tf.matmul(z, U) + b2
cross_entropy = tf.reduce_mean(
tf.nn.sparse_softmax_cross_entropy_with_logits(out, labels))
Para crear una nueva colección, simplemente puede comenzar a llamar a tf.add_to_collection() :
la primera llamada creará la colección.
tf.add_to_collection("my_losses",
self.config.l2 * (tf.add_n([tf.reduce_sum(U ** 2), tf.reduce_sum(W ** 2)])))
tf.add_to_collection("my_losses", cross_entropy)
loss = sum(tf.get_collection("my_losses"))
https://riptutorial.com/es/home 8
Tenga en cuenta que tf.get_collection() devuelve una copia de la colección o una lista vacía si
la colección no existe. Además, NO crea la colección si no existe. Para hacerlo, puedes usar
tf.get_collection_ref() que devuelve una referencia a la colección y crea una vacía si aún no
existe.
A continuación se muestra una capa oculta de múltiples capas de Perceptrón (MLP) que utiliza el
alcance anidado de las variables.
def weight_variable(shape):
return tf.get_variable(name="weights", shape=shape,
initializer=tf.zeros_initializer(dtype=tf.float32))
def bias_variable(shape):
return tf.get_variable(name="biases", shape=shape,
initializer=tf.zeros_initializer(dtype=tf.float32))
with tf.variable_scope("MLP"):
x = tf.placeholder(dtype=tf.float32, shape=[None, 1], name="x")
y = tf.placeholder(dtype=tf.float32, shape=[None, 1], name="y")
fc1 = fc_layer(x, 1, 8, "fc1")
fc2 = fc_layer(fc1, 8, 1, "fc2")
MLP utiliza el nombre de ámbito de nivel superior MLP y tiene dos capas con sus respectivos
nombres de alcance fc1 y fc2 . Cada capa también tiene sus propias variables de weights y biases
.
trainable_var_key = tf.GraphKeys.TRAINABLE_VARIABLES
all_vars = tf.get_collection(key=trainable_var_key, scope="MLP")
fc1_vars = tf.get_collection(key=trainable_var_key, scope="MLP/fc1")
fc2_vars = tf.get_collection(key=trainable_var_key, scope="MLP/fc2")
fc1_weight_vars = tf.get_collection(key=trainable_var_key, scope="MLP/fc1/weights")
fc1_bias_vars = tf.get_collection(key=trainable_var_key, scope="MLP/fc1/biases")
Los valores de las variables se pueden recopilar utilizando el sess.run() . Por ejemplo, si nos
gustaría recopilar los valores de fc1_weight_vars después del entrenamiento, podríamos hacer lo
siguiente:
sess = tf.Session()
# add code to initialize variables
# add code to train the network
# add code to create test data x_test and y_test
https://riptutorial.com/es/home 9
fc1_weight_vals = sess.run(fc1, feed_dict={x: x_test, y: y_test})
print(fc1_weight_vals) # This should be an ndarray with ndim=2 and shape=[1, 8]
https://riptutorial.com/es/home 10
Capítulo 3: Código de ejemplo minimalista
para Tensorflow distribuido.
Introducción
Este documento muestra cómo crear un clúster de servidores TensorFlow y cómo distribuir un
gráfico de cómputo en ese clúster.
Examples
Ejemplo de entrenamiento distribuido.
import tensorflow as tf
FLAGS = None
def main(_):
ps_hosts = FLAGS.ps_hosts.split(",")
worker_hosts = FLAGS.worker_hosts.split(",")
if FLAGS.job_name == "ps":
server.join()
elif FLAGS.job_name == "worker":
# Build model...
loss = ...
global_step = tf.contrib.framework.get_or_create_global_step()
https://riptutorial.com/es/home 11
perform *synchronous* training.
# mon_sess.run handles AbortedError in case of preempted PS.
mon_sess.run(train_op)
https://riptutorial.com/es/home 12
Capítulo 4: Cómo depurar una pérdida de
memoria en TensorFlow
Examples
Use Graph.finalize () para capturar los nodos que se agregan al gráfico
El modo más común de usar TensorFlow implica primero construir un gráfico de flujo de datos de
operadores TensorFlow (como tf.constant() y tf.matmul() , luego ejecutar pasos llamando al
método tf.Session.run() en un bucle (por ejemplo, un bucle de entrenamiento).
Una fuente común de fugas de memoria es donde el ciclo de entrenamiento contiene llamadas
que agregan nodos al gráfico, y se ejecutan en cada iteración, lo que hace que el gráfico crezca.
Esto puede ser obvio (por ejemplo, una llamada a un operador TensorFlow como tf.square() ),
implícito (por ejemplo, una llamada a una función de biblioteca TensorFlow que crea operadores
como tf.train.Saver() ), o sutil (por ejemplo, una llamada a un operador sobrecargado en un
tf.Tensor y una matriz NumPy, que implícitamente llama tf.convert_to_tensor() y agrega un
nuevo tf.constant() al gráfico).
El método tf.Graph.finalize() puede ayudar a detectar fugas de esta manera: marca un gráfico
como de solo lectura y genera una excepción si se agrega algo al gráfico. Por ejemplo:
loss = ...
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
init = tf.initialize_all_variables()
for _ in range(1000000):
sess.run(train_op)
loss_sq = tf.square(loss) # Exception will be thrown here.
sess.run(loss_sq)
loss = ...
# ...
with tf.Session() as sess:
# ...
sess.graph.finalize() # Graph is read-only after this statement.
# ...
dbl_loss = loss * 2.0 # Exception will be thrown here.
https://riptutorial.com/es/home 13
menudo usan tcmalloc lugar de la implementación malloc() predeterminada, ya que tcmalloc sufre
menos fragmentación al asignar y desasignar objetos grandes (como muchos tensores). Se sabe
que algunos programas TensorFlow que utilizan mucha memoria pierden espacio de
direcciones del montón (mientras liberan todos los objetos individuales que usan) con el
malloc() predeterminado, pero se ejecutaron bien después de cambiar a tcmalloc . Además,
tcmalloc incluye un generador de perfiles de pila , lo que hace posible rastrear dónde podrían
haber ocurrido las fugas restantes.
Como se mencionó anteriormente, simplemente cambiar a tcmalloc puede arreglar muchas fugas
aparentes. Sin embargo, si el uso de la memoria sigue creciendo, puede usar el generador de
perfiles de la siguiente manera:
• /tmp/profile.0000.heap
• /tmp/profile.0001.heap
• /tmp/profile.0002.heap
• ...
Puede leer los perfiles utilizando la herramienta google-pprof , que (por ejemplo, en Ubuntu 14.04)
puede instalarse como parte del paquete google-perftools . Por ejemplo, para ver la tercera
instantánea recopilada arriba:
Al ejecutar el comando anterior se abrirá una ventana de GraphViz, que muestra la información
del perfil como un gráfico dirigido.
https://riptutorial.com/es/home 14
Capítulo 5: Configuración de la GPU
TensorFlow
Introducción
Este tema trata sobre la configuración y administración de GPU en TensorFlow.
Observaciones
Fuentes principales:
• https://www.tensorflow.org
• https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/protobuf/config.proto
• https://stackoverflow.com/a/37901914
• https://github.com/tensorflow/tensorflow/issues/152
• https://github.com/tensorflow/tensorflow/issue/9201
Examples
Ejecute TensorFlow solo en la CPU, utilizando la variable de entorno
`CUDA_VISIBLE_DEVICES`.
Para asegurarse de que el proceso TensorFlow de una versión de GPU solo se ejecute en la
CPU:
import os
os.environ["CUDA_VISIBLE_DEVICES"]="-1"
import tensorflow as tf
import tensorflow as tf
sess = tf.Session(config=tf.ConfigProto(device_count={'GPU': 0}))
Tenga en cuenta que este método evita que el gráfico TensorFlow use la GPU, pero TensorFlow
https://riptutorial.com/es/home 15
sigue bloqueando el dispositivo de la GPU como se describe en este tema . El uso de
CUDA_VISIBLE_DEVICES parece ser la mejor manera de asegurarse de que TensorFlow se mantenga
alejado de la tarjeta GPU (consulte esta respuesta ).
import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID" # see issue #152
os.environ["CUDA_VISIBLE_DEVICES"]="0" # Will use only the first GPU device
os.environ["CUDA_VISIBLE_DEVICES"]="0,3" # Will use only the first and the fourth GPU devices
(Citado en esta respuesta ; más información sobre las variables de entorno de CUDA aquí .)
De forma predeterminada, TensorFlow preasigna toda la memoria de la tarjeta GPU (lo que
puede provocar la advertencia CUDA_OUT_OF_MEMORY ).
Por ejemplo:
config = tf.ConfigProto()
https://riptutorial.com/es/home 16
config.gpu_options.per_process_gpu_memory_fraction = 0.4
sess = tf.Session(config=config) as sess:
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
sess= tf.Session(config=config):
https://riptutorial.com/es/home 17
Capítulo 6: Creación de RNN, LSTM y RNN /
LSTM bidireccionales con TensorFlow
Examples
Creando un LSTM bidireccional
import tensorflow as tf
Parámetros
Notas
Lea Creación de RNN, LSTM y RNN / LSTM bidireccionales con TensorFlow en línea:
https://riptutorial.com/es/tensorflow/topic/4827/creacion-de-rnn--lstm-y-rnn---lstm-bidireccionales-
con-tensorflow
https://riptutorial.com/es/home 18
Capítulo 7: Creación de una operación
personalizada con tf.py_func (solo CPU)
Parámetros
Parámetro Detalles
función python, que toma matrices numpy como sus entradas y devuelve
función
matrices numpy como sus salidas
Examples
Ejemplo basico
El tf.py_func(func, inp, Tout) crea una operación TensorFlow que llama a una función de
Python, func en una lista de tensores inp .
def func(x):
return 2*x
x = tf.constant(1.)
res = tf.py_func(func, [x], [tf.float32])
# res is a list of length 1
https://riptutorial.com/es/home 19
# Get the numpy array and apply func
val = sess.run(inputs) # get the value of inputs
output_val = func(val) # numpy array
# call to tf.py_func
output = tf.py_func(func, [inputs], [tf.float32])[0]
Lea Creación de una operación personalizada con tf.py_func (solo CPU) en línea:
https://riptutorial.com/es/tensorflow/topic/3856/creacion-de-una-operacion-personalizada-con-tf-
py-func--solo-cpu-
https://riptutorial.com/es/home 20
Capítulo 8: Estructura de regresión lineal
simple en TensorFlow con Python
Introducción
Un modelo ampliamente utilizado en las estadísticas tradicionales es el modelo de regresión
lineal. En este artículo, el objetivo es seguir la implementación paso a paso de este tipo de
modelos. Vamos a representar una estructura de regresión lineal simple.
Para nuestro estudio, analizaremos la edad de los niños en el eje x y la altura de los niños en el
eje y . Intentaremos predecir la altura de los niños, utilizando su edad, aplicando una regresión
lineal simple [en TF, encontrando la mejor W y b]
Parámetros
Parámetro Descripción
Observaciones
Utilicé la sintaxis TensorBoard para rastrear el comportamiento de algunas partes del modelo, el
costo, el tren y los elementos de activación.
Importaciones utilizadas:
import numpy as np
import tensorflow as tf
1.0.1
https://riptutorial.com/es/home 21
Ejemplo / referencia académica conceptual extraída de aquí :
Examples
Función de regresión simple estructura de código
Definición de la función:
Variables de entrada:
Modelo Lineal:
Costo:
Formación:
Sesión TensorFlow:
https://riptutorial.com/es/home 22
init = tf.global_variables_initializer()
sess.run(init)
Rutina principal
def main():
train_X, train_Y = read_data()
train_X = feature_normalize(train_X)
run_training(train_X, train_Y)
Rutina de normalización
def feature_normalize(train_X):
global mean, std
mean = np.mean(train_X, axis=0)
std = np.std(train_X, axis=0)
def read_data():
global m, n
https://riptutorial.com/es/home 23
m = 50
n = 1
train_X = np.array(
).astype('float32')
train_Y = np.array(
).astype('float32')
https://riptutorial.com/es/home 24
Capítulo 9: Guarda el modelo Tensorflow en
Python y carga con Java
Introducción
Construir y especialmente entrenar un modelo puede ser más fácil de hacer en Python. ¿Cómo
cargar y usar el modelo entrenado en Java?
Observaciones
El modelo puede aceptar cualquier número de entradas, así que cambie las NUM_PREDICTIONS
si desea ejecutar más predicciones que una. Tenga en cuenta que Java está utilizando JNI para
llamar al modelo de flujo tensor de C ++, por lo que verá algunos mensajes de información
provenientes del modelo cuando ejecute este.
Examples
Crea y guarda un modelo con Python
import tensorflow as tf
# good idea
tf.reset_default_graph()
# DO MODEL STUFF
# Pretrained weighting of 2.0
W = tf.get_variable('w', shape=[], initializer=tf.constant(2.0), dtype=tf.float32)
# Model input x
x = tf.placeholder(tf.float32, name='x')
# Model output y = W*x
y = tf.multiply(W, x, name='y')
# DO SESSION STUFF
sess = tf.Session()
sess.run(tf.global_variables_initializer())
https://riptutorial.com/es/home 25
System.out.println(TensorFlow.version());
final int NUM_PREDICTIONS = 1;
https://riptutorial.com/es/home 26
Capítulo 10: Guardar y restaurar un modelo
en TensorFlow
Introducción
Tensorflow distingue entre guardar / restaurar los valores actuales de todas las variables en un
gráfico y guardar / restaurar la estructura del gráfico real. Para restaurar el gráfico, puede utilizar
cualquiera de las funciones de Tensorflow o simplemente volver a llamar a su parte del código,
que creó el gráfico en primer lugar. Al definir el gráfico, también debe pensar en cuáles y cómo
deben recuperarse las variables / operaciones una vez que el gráfico se haya guardado y
restaurado.
Observaciones
En la sección de modelo de restauración anterior, si entiendo correctamente, usted construye el
modelo y luego restaura las variables. Creo que no es necesario reconstruir el modelo siempre
que agregue los tensores / marcadores de posición relevantes al guardar utilizando
tf.add_to_collection() . Por ejemplo:
tf.add_to_collection('cost_op', cost_op)
Luego, más tarde, puede restaurar el gráfico guardado y obtener acceso a cost_op usando
...
with tf.variable_scope("inputs"):
y=tf.convert_to_tensor([[0,1],[1,0]])
split_labels=tf.split(1,0,x,name='lab_split')
split_labels=[tf.squeeze(i,name='lab_squeeze') for i in split_labels]
...
with tf.Session().as_default() as sess:
saver=tf.train.Saver(sess,split_labels)
saver.save("./checkpoint.chk")
https://riptutorial.com/es/home 27
Podemos recordarlos más adelante de la siguiente manera:
split_label_0=g.get_tensor_by_name('inputs/lab_squeeze:0')
split_label_1=g.get_tensor_by_name("inputs/lab_squeeze_1:0")
sess=tf.Session()
g=tf.get_default_graph()
...
x=g.get_collection_keys()
[i.name for j in x for i in g.get_collection(j)] # will list out most, if not all, tensors on
the graph
Examples
Salvando el modelo
Digamos que tiene un modelo lineal con entrada x y desea predecir una salida y . La pérdida aquí
es el error cuadrático medio (MSE). El tamaño del lote es de 16.
res = tf.matmul(x, w)
loss = tf.reduce_sum(tf.square(res - y))
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
Aquí viene el objeto Saver, que puede tener múltiples parámetros (cf. doc ).
Finalmente entrenamos el modelo en una tf.Session() , para 1000 iteraciones. Aquí solo
guardamos el modelo cada 100 iteraciones.
https://riptutorial.com/es/home 28
# Start a session
max_steps = 1000
with tf.Session() as sess:
# initialize the variables
sess.run(tf.initialize_all_variables())
Después de ejecutar este código, debería ver los últimos 5 puntos de control en su directorio:
• model-500 y model-500.meta
• model-600 y model-600.meta
• model-700 y model-700.meta
• model-800 y model-800.meta
• model-900 y model-900.meta
Tenga en cuenta que en este ejemplo, mientras que el saver realmente ahorra tanto los valores
actuales de las variables como un puesto de control y la estructura de la gráfica ( *.meta ), ningún
cuidado específico fue tomada WRT cómo recuperar por ejemplo, los marcadores de posición x e
y una vez que el El modelo fue restaurado. Por ejemplo, si la restauración se realiza en otro lugar
que no sea este script de capacitación, puede ser complicado recuperar x e y del gráfico
restaurado (especialmente en modelos más complicados). Para evitar eso, siempre dé nombres a
sus variables / marcadores de posición / operaciones o piense en usar las tf.collections como se
muestra en una de las observaciones.
Restaurando el modelo
checkpoint_dir = chkpt_dir
if not os.path.exists(checkpoint_dir):
try:
print("making checkpoint_dir")
os.makedirs(checkpoint_dir)
return False
except OSError:
raise
path = tf.train.get_checkpoint_state(checkpoint_dir)
https://riptutorial.com/es/home 29
print("path = ",path)
if path is None:
return False
else:
saver.restore(sess, path.model_checkpoint_path)
return True
Código principal:
path_to_saved_model = './'
max_steps = 1
# Start a session
with tf.Session() as sess:
https://riptutorial.com/es/home 30
Capítulo 11: Indexación tensorial
Introducción
Varios ejemplos que muestran cómo Tensorflow admite la indexación en tensores, destacando las
diferencias y similitudes con la indexación tipo numpy siempre que sea posible.
Examples
Extraer una rebanada de un tensor
Argumentos:
• input : tensor
• begin : ubicación inicial para cada dimensión de input
• size : número de elementos para cada dimensión de input , utilizando -1 incluye todos los
elementos restantes
tf.gather argumentos:
• params
https://riptutorial.com/es/home 31
: Un tensor del que desea extraer valores.
• indices : un tensor que especifica los índices que apuntan a params
[[ 0 1 2 3 4 5]
[18 19 20 21 22 23]]
indicestambién pueden ser solo escalares (pero no pueden contener índices negativos). Por
ejemplo, en el ejemplo anterior:
tf.gather(params, tf.constant(3))
imprimiría
[18 19 20 21 22 23]
Tenga en cuenta que los indices pueden tener cualquier forma, pero los elementos almacenados
en los indices siempre se refieren a la primera dimensión de los params . Por ejemplo, si desea
recuperar la primera y la tercera fila y la segunda y la cuarta fila al mismo tiempo, puede hacer
esto:
[[[ 0 1 2 3 4 5]
[12 13 14 15 16 17]]
[[ 6 7 8 9 10 11]
[18 19 20 21 22 23]]]
Puedes usar tf.gather para calcular una permutación. Por ejemplo, lo siguiente invierte todas las
https://riptutorial.com/es/home 32
filas de params :
selected es ahora
[[24 25 26 27 28 29]
[18 19 20 21 22 23]
[12 13 14 15 16 17]
[ 6 7 8 9 10 11]
[ 0 1 2 3 4 5]]
Si necesita acceder a cualquier otro que no sea la primera dimensión, puede tf.transpose
utilizando tf.transpose : Por ejemplo, para reunir columnas en lugar de filas en nuestro ejemplo,
puede hacer esto:
[[ 0 2]
[ 6 8]
[12 14]
[18 20]
[24 26]]
Sin embargo, tf.transpose es bastante caro, por lo que podría ser mejor usar tf.gather_nd para
este caso de uso.
Este ejemplo se basa en esta publicación: TensorFlow : indexación de tensor similar a un número
.
En Numpy puede usar matrices para indexar en una matriz. Por ejemplo, para seleccionar los
elementos en (1, 2) y (3, 2) en una matriz bidimensional, puede hacer esto:
https://riptutorial.com/es/home 33
Esto imprimirá:
[ 8 20]
Para obtener el mismo comportamiento en Tensorflow, puedes usar tf.gather_nd , que es una
extensión de tf.gather . El ejemplo anterior se puede escribir así:
x = tf.constant(data)
idx1 = tf.constant(a)
idx2 = tf.constant(b)
result = tf.gather_nd(x, tf.stack((idx1, idx2), -1))
Esto imprimirá:
[ 8 20]
tf.stack es el equivalente de np.asarray y en este caso apila los dos vectores de índice a lo largo
de la última dimensión (que en este caso es la primera) para producir:
[[1 2]
[3 2]]
Argumentos:
La salida de la función depende de la forma de los indices . Si la dimensión más interna de los
indices tiene la longitud P , estamos recolectando elementos individuales de los params . Si es
menor que P , estamos recolectando segmentos, al igual que con tf.gather pero sin la restricción
de que solo podemos acceder a la primera dimensión.
https://riptutorial.com/es/home 34
data = np.reshape(np.arange(30), [5, 6])
x = tf.constant(data)
result = tf.gather_nd(x, [1, 2])
donde el result será 8 como se esperaba. Observe en qué se diferencia esto de tf.gather : los
mismos índices pasados a tf.gather(x, [1, 2]) se habrían dado como la segunda y tercera fila de
los data .
Si desea recuperar más de un elemento al mismo tiempo, simplemente pase una lista de pares de
índices:
Si en el ejemplo anterior desea recopilar filas (es decir, segmentos) en lugar de elementos, ajuste
el parámetro de indices siguiente manera:
[[ 6 7 8 9 10 11]
[18 19 20 21 22 23]]
# data is [[[ 0 1]
# [ 2 3]
# [ 4 5]]
#
# [[ 6 7]
# [ 8 9]
# [10 11]]]
data = np.reshape(np.arange(12), [2, 3, 2])
x = tf.constant(data)
result = tf.gather_nd(x, [[0, 0, 0], [1, 2, 1]])
https://riptutorial.com/es/home 35
Pensemos en un tensor de rango 3 como un lote de matrices con forma (batch_size, m, n) . Si
desea recopilar la primera y la segunda fila para cada elemento del lote, puede usar esto:
# data is [[[ 0 1]
# [ 2 3]
# [ 4 5]]
#
# [[ 6 7]
# [ 8 9]
# [10 11]]]
data = np.reshape(np.arange(12), [2, 3, 2])
x = tf.constant(data)
result = tf.gather_nd(x, [[[0, 0], [0, 1]], [[1, 0], [1, 1]]])
[[[0 1]
[2 3]]
[[6 7]
[8 9]]]
Observe cómo la forma de los indices influye en la forma del tensor de salida. Si hubiéramos
usado un tensor de rango 2 para el argumento de los indices :
result = tf.gather_nd(x, [[0, 0], [0, 1], [1, 0], [1, 1]])
[[0 1]
[2 3]
[6 7]
[8 9]]
https://riptutorial.com/es/home 36
Capítulo 12: Leyendo los datos
Examples
Contar ejemplos en archivo CSV
import tensorflow as tf
filename_queue = tf.train.string_input_producer(["file.csv"], num_epochs=1)
reader = tf.TextLineReader()
key, value = reader.read(filename_queue)
col1, col2 = tf.decode_csv(value, record_defaults=[[0], [0]])
num_epochs=1 hace que la cola string_input_producer cierre una vez que se haya procesado cada
archivo en la lista. Esto lleva a que se OutOfRangeError que se OutOfRangeError en try: Por defecto,
string_input_producer produce los nombres de archivo infinitamente.
tf.train.start_queue_runners() inicia pasos adicionales que manejan agregar datos a las colas de
forma asíncrona.
Los archivos TFRecord son el formato binario tensorflow nativo para almacenar datos (tensores).
Para leer el archivo puede usar un código similar al del ejemplo CSV:
import tensorflow as tf
filename_queue = tf.train.string_input_producer(["file.tfrecord"], num_epochs=1)
reader = tf.TFRecordReader()
key, serialized_example = reader.read(filename_queue)
Luego, debe analizar los ejemplos de la cola serialized_example . Puede hacerlo usando
tf.parse_example , que requiere lotes previos, pero es más rápido o tf.parse_single_example :
https://riptutorial.com/es/home 37
})
parsed_example = tf.parse_single_example(serialized_example, {
"feature_name_1": tf.FixedLenFeature(shape=[1], tf.int64),
"feature_name_2": tf.FixedLenFeature(shape=[1], tf.float32)
})
Para los ejemplos por lotes que vienen de parse_single_example , debe extraer los tensores del dict
y usar tf.train.batch como antes:
parsed_batch = dict(zip(parsed_example.keys(),
tf.train.batch(parsed_example.values(), batch_size=100)
Leyó los datos como antes, pasando la lista de todos los tensores para evaluar a sess.run :
Para mezclar aleatoriamente los ejemplos, puede usar la función tf.train.shuffle_batch lugar de
tf.train.batch , de la siguiente manera:
parsed_batch = tf.train.shuffle_batch([serialized_example],
batch_size=100, capacity=1000,
min_after_dequeue=200)
capacitymide cuántos elementos se pueden almacenar en la cola de una vez. Una mayor
capacidad lleva a un mayor uso de la memoria, pero una menor latencia causada por
subprocesos que esperan llenarlo.
https://riptutorial.com/es/home 38
perfectamente uniforme, sino que está diseñada teniendo en cuenta una gran cantidad de datos,
que no encajan en la memoria. En su lugar, lee entre los elementos min_after_dequeue y capacity ,
los almacena en la memoria y elige aleatoriamente un lote de ellos. Después de eso, pone en
cola algunos elementos más, para mantener su número entre min_after_dequeue y capacity . Por lo
tanto, cuanto mayor sea el valor de min_after_dequeue , más elementos aleatorios se garantiza que
la elección de los elementos batch_size se tomará de al menos min_after_dequeue elementos
consecutivos, pero la mayor capacity debe ser y cuanto más tiempo se tarda en llenar la cola
inicialmente.
Supongamos que sus ejemplos de datos ya están leídos en una variable de python y desea
leerlos n veces, en lotes de un tamaño determinado:
import numpy as np
import tensorflow as tf
data = np.array([1, 2, 3, 4, 5])
n = 4
Para combinar datos en lotes, posiblemente con barajado aleatorio, puede usar tf.train.batch o
tf.train.batch_shuffle , pero necesita pasarle el tensor que produciría datos completos n veces:
limited_tensor = tf.train.limit_epochs(data, n)
batch = tf.train.shuffle_batch([limited_tensor], batch_size=3, enqueue_many=True, capacity=4)
El limit_epochs convierte la matriz numpy a tensor debajo del capó y devuelve un tensor
produciéndolo n veces y lanzando un OutOfRangeError después. El enqueue_many=True argumento
enqueue_many=True pasado a shuffle_batch denota que cada tensor en la lista de tensor
[limited_tensor] debe interpretarse como que contiene una cantidad de ejemplos. Tenga en
cuenta que la capacidad de la cola de procesamiento por lotes puede ser menor que la cantidad
de ejemplos en el tensor.
https://riptutorial.com/es/home 39
adicionales.
Por ejemplo, estoy cargando las etiquetas en un solo valor entero {0,1}, mientras que la
documentación utiliza un vector de un solo calor [0,1].
#Importing Libraries
import os
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.python.framework import ops
from tensorflow.python.framework import dtypes
#File containing the path to images and the labels [path/to/images label]
filename = '/path/to/List.txt'
NumFiles = len(filenames)
#Creating a queue which contains the list of files to read and the value of the labels
filename_queue = tf.train.slice_input_producer([tfilenames, tlabels], num_epochs=10,
shuffle=True, capacity=NumFiles)
https://riptutorial.com/es/home 40
with sess.as_default():
sess.run(init_op)
print image.shape
print nm
print lb
coord.request_stop()
coord.join(threads)
https://riptutorial.com/es/home 41
Capítulo 13: Matemáticas detrás de la
convolución 2D con ejemplos avanzados en
TF
Introducción
La convolución 2D se calcula de una manera similar a la que se calcularía la convolución 1D :
desliza el núcleo sobre la entrada, calcula las multiplicaciones de elementos y las suma. Pero en
lugar de que su núcleo / entrada sea una matriz, aquí están las matrices.
Examples
Sin relleno, zancadas = 1
Este es el ejemplo más básico, con los cálculos más fáciles. Supongamos que su input y el kernel
son:
• 14 = 4 * 1 + 3 * 0 + 1 * 1 + 2 * 2 + 1 * 1 + 0 * 0 + 1 * 0 + 2 * 0 + 4 * 1
• 6=3*1+1*0+0*1+1*2+0*1+1*0+2*0+4*0+1*1
• 6=2*1+1*0+0*1+1*2+2*1+4*0+3*0+1*0+0*1
• 12 = 1 * 1 + 0 * 0 + 1 * 1 + 2 * 2 + 4 * 1 + 1 * 0 + 1 * 0 + 0 * 0 + 2 * 1
import tensorflow as tf
k = tf.constant([
[1, 0, 1],
[2, 1, 0],
[0, 0, 1]
], dtype=tf.float32, name='k')
i = tf.constant([
[4, 3, 1, 0],
[2, 1, 0, 1],
[1, 2, 4, 1],
https://riptutorial.com/es/home 42
[3, 1, 0, 2]
], dtype=tf.float32, name='i')
kernel = tf.reshape(k, [3, 3, 1, 1], name='kernel')
image = tf.reshape(i, [1, 4, 4, 1], name='image')
El relleno es solo un nombre elegante de narración: rodee su matriz de entrada con alguna
constante. En la mayoría de los casos, la constante es cero y esta es la razón por la que las
personas lo llaman "cero relleno". Entonces, si desea usar un relleno de 1 en nuestra entrada
original (verifique el primer ejemplo con padding=0, strides=1 ), la matriz se verá así:
Para calcular los valores de la convolución se hace el mismo deslizamiento. Tenga en cuenta
que, en nuestro caso, no es necesario volver a calcular muchos valores en el medio (serán los
mismos que en el ejemplo anterior. Tampoco mostraré todos los cálculos aquí, porque la idea es
sencilla. El resultado es:
dónde
• 5=0*1+0*0+0*1+0*2+4*1+3*0+0*0+0*1+1*1
• ...
• 6=4*1+1*0+0*1+0*2+2*1+0*0+0*0+0*0+0*1
https://riptutorial.com/es/home 43
res = tf.squeeze(tf.nn.conv2d(image, kernel, [1, 1, 1, 1], "SAME"))
# 'SAME' makes sure that our output has the same size as input and
# uses appropriate padding. In our case it is 1.
with tf.Session() as sess:
print sess.run(res)
Ahora aplicaremos una convolución de pasos a nuestro ejemplo rellenado descrito anteriormente
y calcularemos la convolución donde p = 1, s = 2
en caso de s = 2 será:
Verifique las posiciones de los valores 14, 2, 12, 6 en la matriz anterior. El único cambio que
debemos realizar en nuestro código es cambiar los pasos de 1 a 2 para las dimensiones de ancho
y alto (2-en, 3-en).
Por cierto, no hay nada que nos impida utilizar diferentes zancadas para diferentes dimensiones.
https://riptutorial.com/es/home 44
https://riptutorial.com/es/tensorflow/topic/10015/matematicas-detras-de-la-convolucion-2d-con-
ejemplos-avanzados-en-tf
https://riptutorial.com/es/home 45
Capítulo 14: Matriz y aritmética de vectores
Examples
Multiplicación elemental
Para realizar la multiplicación elementwise en los tensores, puede utilizar cualquiera de los
siguientes:
• a*b
• tf.multiply(a, b)
import tensorflow as tf
import numpy as np
# Build a graph
graph = tf.Graph()
with graph.as_default():
# A 2x3 matrix
a = tf.constant(np.array([[ 1, 2, 3],
[10,20,30]]),
dtype=tf.float32)
# Another 2x3 matrix
b = tf.constant(np.array([[2, 2, 2],
[3, 3, 3]]),
dtype=tf.float32)
# Elementwise multiplication
c = a * b
d = tf.multiply(a, b)
# Run a Session
with tf.Session(graph=graph) as session:
(output_c, output_d) = session.run([c, d])
print("output_c")
print(output_c)
print("\noutput_d")
print(output_d)
Imprime lo siguiente:
output_c
[[ 2. 4. 6.]
[ 30. 60. 90.]]
output_d
[[ 2. 4. 6.]
[ 30. 60. 90.]]
https://riptutorial.com/es/home 46
En el siguiente ejemplo, un tensor de 2 por 3 se multiplica por un valor escalar (2).
# Build a graph
graph = tf.Graph()
with graph.as_default():
# A 2x3 matrix
a = tf.constant(np.array([[ 1, 2, 3],
[10,20,30]]),
dtype=tf.float32)
# Run a Session
with tf.Session(graph=graph) as session:
output = session.run(c)
print(output)
Esto imprime
[[ 2. 4. 6.]
[ 20. 40. 60.]]
Producto de punto
tf.matmul(a, b)
# Build a graph
graph = tf.Graph()
with graph.as_default():
# A 2x3 matrix
a = tf.constant(np.array([[1, 2, 3],
[2, 4, 6]]),
dtype=tf.float32)
# A 3x2 matrix
b = tf.constant(np.array([[1, 10],
[2, 20],
[3, 30]]),
dtype=tf.float32)
# Run a Session
with tf.Session(graph=graph) as session:
output = session.run(c)
print(output)
imprime
https://riptutorial.com/es/home 47
[[ 14. 140.]
[ 28. 280.]]
https://riptutorial.com/es/home 48
Capítulo 15: Medir el tiempo de ejecución de
las operaciones individuales.
Examples
Ejemplo básico con el objeto Timeline de TensorFlow
El objeto Timeline permite obtener el tiempo de ejecución para cada nodo en el gráfico:
• utiliza un sess.run() clásico sess.run() pero también especifica las options argumentos
options y run_metadata
• A continuación, crea un objeto de Timeline con los datos run_metadata.step_stats .
Aquí hay un programa de ejemplo que mide el rendimiento de una multiplicación de matrices:
import tensorflow as tf
from tensorflow.python.client import timeline
x = tf.random_normal([1000, 1000])
y = tf.random_normal([1000, 1000])
res = tf.matmul(x, y)
https://riptutorial.com/es/home 49
Lea Medir el tiempo de ejecución de las operaciones individuales. en línea:
https://riptutorial.com/es/tensorflow/topic/3850/medir-el-tiempo-de-ejecucion-de-las-operaciones-
individuales-
https://riptutorial.com/es/home 50
Capítulo 16: Placeholders
Parámetros
Parámetro Detalles
tipo de datos específicamente uno de los tipos de datos proporcionados por el paquete
(dtype) tensorflow. Por ejemplo, tensorflow.float32
Dimensiones del marcador de posición como lista o tupla. None puede ser
forma de
usado para dimensiones que son desconocidas. Por ejemplo, (Ninguno, 30)
datos (forma)
definiría un marcador de posición de dimensión (? X 30)
nombre
Un nombre para la operación (opcional).
nombre)
Examples
Fundamentos de los marcadores de posición
El siguiente ejemplo declara un marcador de posición para un tensor de 3 por 4 con elementos
que son (o pueden tipificarse como) flotadores de 32 bits.
Los marcadores de posición no contendrán ningún valor por sí mismos, por lo que es importante
proporcionarles valores al ejecutar una sesión, de lo contrario, aparecerá un mensaje de error.
Esto se puede hacer usando el argumento feed_dict al llamar a session.run() , por ejemplo:
# run the graph up to node b, feeding the placeholder `a` with values in my_array
session.run(b, feed_dict={a: my_array})
Aquí hay un ejemplo simple que muestra el proceso completo de declarar y alimentar a un
tapicero.
import tensorflow as tf
import numpy as np
# Build a graph
graph = tf.Graph()
with graph.as_default():
https://riptutorial.com/es/home 51
# declare a placeholder that is 3 by 4 of type float32
a = tf.placeholder(tf.float32, shape=(3, 4), name='a')
El marcador de posición toma una matriz de 3 por 4, y ese tensor se multiplica por 2 en el nodo b,
que luego devuelve e imprime lo siguiente:
[[ 2. 2. 2. 2.]
[ 2. 2. 2. 2.]
[ 2. 2. 2. 2.]]
A menudo, uno quiere ejecutar intermitentemente uno o más lotes de validación durante el curso
de entrenamiento de una red profunda. Típicamente los datos de entrenamiento son alimentados
por una cola, mientras que los datos de validación pueden ser pasados a través de la feed_dict
parámetro en sess.run() . tf.placeholder_with_default() está diseñado para funcionar bien en esta
situación:
import numpy as np
import tensorflow as tf
IMG_SIZE = [3, 3]
BATCH_SIZE_TRAIN = 2
BATCH_SIZE_VAL = 1
def get_training_batch(batch_size):
''' training data pipeline '''
image = tf.random_uniform(shape=IMG_SIZE)
label = tf.random_uniform(shape=[])
min_after_dequeue = 100
capacity = min_after_dequeue + 3 * batch_size
images, labels = tf.train.shuffle_batch(
[image, label], batch_size=batch_size, capacity=capacity,
min_after_dequeue=min_after_dequeue)
return images, labels
# start a session
https://riptutorial.com/es/home 52
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
# typical training step where batch data are drawn from the training queue
py_images, py_labels = sess.run([new_images, new_labels])
print('Data from queue:')
print('Images: ', py_images) # returned values in range [-1.0, 0.0]
print('\nLabels: ', py_labels) # returned values [-1, 0.0]
# typical validation step where batch data are supplied through feed_dict
images_val = np.random.randint(0, 100, size=np.hstack((BATCH_SIZE_VAL, IMG_SIZE)))
labels_val = np.ones(BATCH_SIZE_VAL)
py_images, py_labels = sess.run([new_images, new_labels],
feed_dict={image_batch:images_val, label_batch:labels_val})
print('\n\nData from feed_dict:')
print('Images: ', py_images) # returned values are integers in range [-100.0, 0.0]
print('\nLabels: ', py_labels) # returned values are -1.0
coord.request_stop()
coord.join(threads)
En este ejemplo, image_batch y label_batch son generados por get_training_batch() menos que los
valores correspondientes se pasen como el parámetro feed_dict durante una llamada a sess.run()
.
https://riptutorial.com/es/home 53
Capítulo 17: Q-learning
Examples
Ejemplo mínimo
Q-learning es una variante del aprendizaje de refuerzo sin modelo. En Q-learning queremos que
el agente estime qué tan bueno es un par (estado, acción) para que pueda elegir buenas
acciones en cada estado. Esto se hace aproximando una función de acción-valor (Q) que se
ajusta en la siguiente ecuación:
A medida que el agente interactúa con el entorno, ve un estado en el que se encuentra, realiza
una acción, obtiene la recompensa y observa el nuevo estado al que se ha movido. Este ciclo
continúa hasta que el agente alcanza un estado de terminación. Dado que Q-learning es un
método fuera de política, podemos guardar cada (estado, acción, recompensa, estado siguiente)
como una experiencia en un búfer de reproducción. Estas experiencias se muestrean en cada
iteración de entrenamiento y se utilizan para mejorar nuestra estimación de Q. A continuación se
muestra cómo:
1. Desde next_state calcule el valor Q para el siguiente paso suponiendo que el agente elige
con avidez una acción en ese estado, por lo tanto, el np.max(next_state_value) en el código a
continuación.
2. El valor Q del siguiente paso se descuenta y se agrega a la recompensa inmediata
observada por el agente: (estado, acción, recompensa , estado)
3. Si un estado-acción resulta en la terminación del episodio, usamos Q = reward lugar de los
pasos 1 y 2 anteriores (aprendizaje episódico). Por lo tanto, también tenemos que agregar
un indicador de terminación a cada experiencia que se agrega al búfer: (estado, acción,
recompensa, estado siguiente, terminado)
4. En este punto, tenemos un valor de Q calculado a partir de la reward y el next_state y
también tenemos otro valor de Q que es el resultado del aproximador de la función de red q.
Al cambiar los parámetros del aproximador de la función de la red q utilizando el gradiente
descendente y minimizar la diferencia entre estos dos valores de acción, el aproximador de
la función Q converge hacia los valores de la acción real.
import tensorflow as tf
import gym
import numpy as np
https://riptutorial.com/es/home 54
Adds a fully connected layer after the `input_layer`. `output_dim` is
the size of next layer. `activation` is the optional activation
function for the next layer.
"""
initializer = tf.random_uniform_initializer(minval=-.003, maxval=.003)
input_dims = input_layer.get_shape().as_list()[1:]
weight = tf.get_variable(name + "_w", shape=[*input_dims, output_dim],
dtype=tf.float32, initializer=initializer)
bias = tf.get_variable(name + "_b", shape=output_dim, dtype=tf.float32,
initializer=initializer)
next_layer = tf.matmul(input_layer, weight) + bias
if activation:
next_layer = activation(next_layer, name=name + "_activated")
return next_layer
class Memory(object):
"""
Saves experiences as (state, action, reward, next_action,
termination). It only supports discrete action spaces.
"""
self.pointer = 0
self.count = 0
class DQN(object):
"""
Deep Q network agent.
"""
https://riptutorial.com/es/home 55
optimizer):
self.action_dim = action_dim
self.state = tf.placeholder(
tf.float32, [None, state_dim], "states")
self.action_ph = tf.placeholder(tf.int32, [None], "actions")
self.action_value_ph = tf.placeholder(
tf.float32, [None], "action_values")
self.memory = Memory(memory_size, state_dim)
def _make():
flow = self.state
for i, size in enumerate(layer_dims):
flow = fullyConnected(
"layer%i" % i, flow, size, tf.nn.relu)
return fullyConnected(
"output_layer", flow, self.action_dim)
self.train_op = optimizer.minimize(self._loss)
https://riptutorial.com/es/home 56
self.state: states, self.action_ph: actions,
self.action_value_ph: observed_value[:, 0]})
return batch_loss
En la red Q profunda , se utilizan pocos mecanismos para mejorar la convergencia del agente.
Uno es el énfasis en el muestreo aleatorio de las experiencias del búfer de reproducción para
evitar cualquier relación temporal entre las experiencias muestreadas. Otro mecanismo es utilizar
la red de destino en la evaluación del valor Q para next_state . La red de destino es similar a la
red de aprendizaje, pero sus parámetros se modifican con mucha menos frecuencia. Además, el
descenso del degradado no actualiza la red de destino, sino que, de vez en cuando, sus
parámetros se copian de la red de aprendizaje.
optimizer = tf.train.AdamOptimizer(LEARNING_RATE)
agent = DQN(state_dim, action_dim, MEMORY_SIZE,
NETWORK_ARCHITECTURE, optimizer)
eps = [EPSILON]
https://riptutorial.com/es/home 57
next_state, reward, terminated, _ = env.step(action)
if terminated:
reward = -1
total_reward += reward
if terminated:
break
eps[0] *= EPXILON_DECAY
i += 1
session = tf.InteractiveSession()
session.run(tf.global_variables_initializer())
https://riptutorial.com/es/home 58
Capítulo 18: Softmax multidimensional
Examples
Creando una capa de salida de Softmax
Cuando state_below es un tensor 2D, U es una matriz de pesos 2D, b es un vector class_size :
logits = tf.matmul(state_below, U) + b
return tf.nn.softmax(logits)
def softmax_fn(current_input):
logits = tf.matmul(current_input, U) + b
return tf.nn.softmax(logits)
logits = tf.matmul(state_below, U) + b
cost = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, labels)
En este caso: state_below y U deben ser matrices 2D, b debe ser un vector de un tamaño igual al
número de clases, y las labels deben ser una matriz 2D de int32 o int64 . Esta función también
soporta tensores de activación con más de dos dimensiones.
https://riptutorial.com/es/home 59
Capítulo 19: Usando capas de convolución
transpuestas
Examples
Uso de tf.nn.conv2d_transpose para tamaños de lotes arbitrarios y con
cálculo automático de la forma de salida.
#creating weights:
https://riptutorial.com/es/home 60
shape = [filter_size_h, filter_size_w,
output_channel_size, input_channel_size]
W_upconv = tf.get_variable("w", shape=shape, dtype=dtype,
initializer=init_w)
shape=[output_channel_size]
b_upconv = tf.get_variable("b", shape=shape, dtype=dtype,
initializer=init_b)
return output
https://riptutorial.com/es/home 61
Capítulo 20: Usando la condición if dentro del
gráfico TensorFlow con tf.cond
Parámetros
Parámetro Detalles
Observaciones
• pred no puede ser solo True o False , necesita ser un Tensor
• La función fn1 y fn2 deben devolver el mismo número de salidas, con los mismos tipos.
Examples
Ejemplo basico
x = tf.constant(1.)
bool = tf.constant(True)
Las dos funciones fn1 y fn2 pueden devolver varios tensores, pero tienen que devolver el mismo
número y tipo exacto de salidas.
x = tf.constant(1.)
bool = tf.constant(True)
def fn1():
return tf.add(x, 1.), x
def fn2():
return tf.add(x, 10.), x
https://riptutorial.com/es/home 62
# sess.run([res1, res2]) will return [2., 1.]
Puede pasar parámetros a las funciones en tf.cond () usando lambda y el código es el siguiente.
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
z = tf.placeholder(tf.float32)
pred = tf.placeholder(tf.bool)
result = tf.cond(pred, lambda: fn1(x, y), lambda: fn2(y, z))
Lea Usando la condición if dentro del gráfico TensorFlow con tf.cond en línea:
https://riptutorial.com/es/tensorflow/topic/2628/usando-la-condicion-if-dentro-del-grafico-
tensorflow-con-tf-cond
https://riptutorial.com/es/home 63
Capítulo 21: Usando la convolución 1D
Examples
Ejemplo basico
Considere un ejemplo básico con una entrada de longitud 10 y dimensión 16 . El tamaño del lote
es de 32 . Por lo tanto, tenemos un marcador de posición con forma de entrada [batch_size, 10,
16] .
batch_size = 32
x = tf.placeholder(tf.float32, [batch_size, 10, 16])
Luego creamos un filtro con ancho 3, tomamos 16 canales como entrada y también emitimos 16
canales.
• zancada : entero s
• Relleno : esto funciona como en 2D, puede elegir entre SAME y VALID . SAME emitirá la misma
longitud de entrada, mientras que VALID no agregará relleno de cero.
`Para calcular la convolución 1D a mano, desliza tu kernel sobre la entrada, calcula las
multiplicaciones de elementos y las resume.
https://riptutorial.com/es/home 64
La forma más fácil es para el relleno = 0,
zancada = 1
Entonces, si su input = [1, 0, 2, 3, 0, 1, 1] y kernel = [2, 1, 3] el resultado de la convolución
es [8, 11, 7, 9, 4] , que es Calculado de la siguiente manera:
• 8=1*2+0*1+2*3
• 11 = 0 * 2 + 2 * 1 + 3 * 3
• 7=2*2+3*1+0*3
• 9=3*2+0*1+1*3
• 4=0*2+1*1+1*3
La función conv1d de TF calcula las convoluciones en lotes, por lo que para hacer esto en TF,
debemos proporcionar los datos en el formato correcto (el documento explica que la entrada debe
estar en [batch, in_width, in_channels] , también explica cómo debe verse el kernel me gusta).
Asi que
import tensorflow as tf
i = tf.constant([1, 0, 2, 3, 0, 1, 1], dtype=tf.float32, name='i')
k = tf.constant([2, 1, 3], dtype=tf.float32, name='k')
Aquí puede observar que no necesita volver a calcular todo: todos los elementos permanecen
iguales, excepto el primero / el último, que son:
https://riptutorial.com/es/home 65
• 1=0*2+1*1+0*3
• 3=1*2+1*1+0*3
Entonces el resultado es [1, 8, 11, 7, 9, 4, 3] que es el mismo que se calcula con TF:
https://riptutorial.com/es/home 66
Capítulo 22: Usando la normalización de
lotes
Parámetros
contrib.layers.batch_norm
Observaciones
params
------ ------
------ ------
------ ------
Observaciones
Aquí hay una captura de pantalla del resultado del ejemplo de trabajo anterior.
https://riptutorial.com/es/home 67
El código y una versión de cuaderno de Jupyter de este ejemplo de trabajo se pueden encontrar
en el repositorio del autor.
Examples
Un ejemplo de trabajo completo de una red neuronal de 2 capas con
normalización de lotes (conjunto de datos MNIST)
https://riptutorial.com/es/home 68
print mnist.data.dtype
print mnist.target.dtype
mnist_X = mnist.data.astype(np.float32)
mnist_y = mnist.target.astype(np.float32)
print mnist_X.dtype
print mnist_y.dtype
One-Hot-Encode y
num_classes = 10
mnist_y = np.arange(num_classes)==mnist_y[:, None]
mnist_y = mnist_y.astype(np.float32)
print mnist_y.shape
https://riptutorial.com/es/home 69
initializer=tf.constant_initializer(0.0))
if scale:
gamma = tf.get_variable("gamma", shape[-1],
initializer=tf.constant_initializer(1.0))
moving_avg = tf.get_variable("moving_mean", shape[-1],
initializer=tf.constant_initializer(0.0), \
trainable=False)
moving_var = tf.get_variable("moving_variance", shape[-1],
initializer=tf.constant_initializer(1.0), \
trainable=False)
sp.reuse_variables()
Construir grafico
init_lr = 0.001
graph = tf.Graph()
with graph.as_default():
# prepare input tensor
tf_train_X = tf.placeholder(tf.float32, shape=[batch_size, num_features])
tf_train_y = tf.placeholder(tf.float32, shape=[batch_size, num_classes])
tf_valid_X, tf_valid_y = tf.constant(valid_X), tf.constant(valid_y)
tf_test_X, tf_test_y = tf.constant(test_X), tf.constant(test_y)
# setup layers
layers = [{'scope':'hidden_layer', 'shape':[num_features, hidden_layer_size],
'initializer':tf.truncated_normal_initializer(stddev=0.01)},
{'scope':'output_layer', 'shape':[hidden_layer_size, num_classes],
'initializer':tf.truncated_normal_initializer(stddev=0.01)}]
# initialize layers
for layer in layers:
initialize(layer['scope'], layer['shape'], layer['initializer'])
# build model - for each layer: -> X -> X*wt+bi -> batch_norm -> activation -> dropout (if
not output layer) ->
layer_scopes = [layer['scope'] for layer in layers]
def model(X, layer_scopes, is_training, keep_prob, decay=0.9):
output_X = X
for scope in layer_scopes:
# X*wt+bi
with tf.variable_scope(scope, reuse=True):
wt = tf.get_variable("weights")
bi = tf.get_variable("biases")
output_X = tf.matmul(output_X, wt) + bi
# Insert Batch Normalization
# set `updates_collections=None` to force updates in place however it comes with
speed penalty
output_X = tf.contrib.layers.batch_norm(output_X, decay=decay,
is_training=is_training,
updates_collections=ops.GraphKeys.UPDATE_OPS,
scope=scope, reuse=True)
# ReLu activation
output_X = tf.nn.relu(output_X)
# Dropout for all non-output layers
if scope!=layer_scopes[-1]:
output_X = tf.nn.dropout(output_X, keep_prob)
return output_X
# setup keep_prob
https://riptutorial.com/es/home 70
keep_prob = tf.placeholder(tf.float32)
# compute accuracy
def compute_accuracy(predictions, labels):
correct_predictions = tf.equal(tf.argmax(predictions, 1), tf.argmax(labels, 1))
accuracy = tf.reduce_mean(tf.cast(correct_predictions, tf.float32))
return accuracy
https://riptutorial.com/es/home 71
Capítulo 23: Variables
Examples
Declarar e inicializar tensores variables
Los tensores variables se utilizan cuando los valores requieren una actualización dentro de una
sesión. Es el tipo de tensor que se usaría para la matriz de ponderaciones al crear redes
neuronales, ya que estos valores se actualizarán a medida que se entrena el modelo.
• tf.global_variables_initializer().run()
• session.run(tf.global_variables_initializer())
# Build a graph
graph = tf.Graph()
with graph.as_default():
a = tf.get_variable('a', shape=[2,3], initializer=tf.constant_initializer(1),
dtype=tf.float32)) # Create a variable tensor
[[ 1. 1. 1.]
[ 1. 1. 1.]]
A veces necesitamos obtener e imprimir el valor de una variable TensorFlow para garantizar que
nuestro programa sea correcto.
https://riptutorial.com/es/home 72
Por ejemplo, si tenemos el siguiente programa:
import tensorflow as tf
import numpy as np
a = tf.Variable(tf.random_normal([2,3])) # declare a tensorflow variable
b = tf.random_normal([2,2]) #declare a tensorflow tensor
init = tf.initialize_all_variables()
https://riptutorial.com/es/home 73
Capítulo 24: Visualizando la salida de una
capa convolucional.
Introducción
Hay muchas formas de visualizar las capas convolucionales, pero comparten los mismos
componentes: obtener los valores de una parte de las redes neuronales convolucionales y
visualizar esos valores. Tenga en cuenta que esas visualizaciones no deben y no pueden
mostrarse en el TensorBoard.
Examples
Un ejemplo básico de 2 pasos.
El ejemplo asume que ha ejecutado con éxito y que comprende completamente el tutorial de
MNIST ( Deep MNIST for expert ).
%matplotlib inline
import matplotlib.pyplot as plt
# con_val is a 4-d array, the first indicates the index of image, the last indicates the index
of kernel
def display(con_val, kernel):
plt.axis('off')
plt.imshow(np.sum(con_val[:, :, :, kernel], axis=0), cmap=plt.get_cmap('gray'))
plt.show()
La función anterior visualiza una matriz (con_val) que contiene los valores de una capa
convolucional dada el kernel. La función resume los valores de todos los ejemplos y los
representa en escala de grises.
Los siguientes códigos obtienen los valores de la primera capa convolucional y llaman a la función
anterior para mostrarlos.
Los códigos solo trazan las visualizaciones correspondientes a las etiquetas de 0 y 1. Podrás ver
los resultados como estos.
https://riptutorial.com/es/home 74
Lea Visualizando la salida de una capa convolucional. en línea:
https://riptutorial.com/es/tensorflow/topic/9346/visualizando-la-salida-de-una-capa-convolucional-
https://riptutorial.com/es/home 75
Creditos
S.
Capítulos Contributors
No
¿Cómo usar
Augustin, Conchylicultor, kaufmanu, NCC, Nitred, Sultan
2 TensorFlow Graph
Kenjeyev, Андрей Задаянчук
Collections?
Código de ejemplo
minimalista para
3 Ishant Mrinal
Tensorflow
distribuido.
Configuración de la
5 Nicolas
GPU TensorFlow
Creación de RNN,
LSTM y RNN / LSTM
6 RamenChef, struct
bidireccionales con
TensorFlow
Creación de una
operación
7 personalizada con mrry, Olivier Moindrot, SherylHohman
tf.py_func (solo
CPU)
Estructura de
regresión lineal
8 simple en ml4294, Nicolas Bortolotti
TensorFlow con
Python
Guarda el modelo
Tensorflow en
9 Ishant Mrinal, Karl Nicholas
Python y carga con
Java
https://riptutorial.com/es/home 76
Guardar y restaurar AryanJ-NYC, BarzinM, black_puppydog, danijar, Hara Hara
10 un modelo en Mahadevaki, kaufmanu, Olivier Moindrot, Rajarshee Mitra,
TensorFlow Steven, Steven Hutt, Tom
Matemáticas detrás
de la convolución 2D
13 Salvador Dali
con ejemplos
avanzados en TF
Matriz y aritmética
14 Ishant Mrinal, ronrest
de vectores
Medir el tiempo de
ejecución de las
15 mrry, Olivier Moindrot
operaciones
individuales.
17 Q-learning BarzinM
Softmax
18 struct
multidimensional
Usando capas de
19 convolución BlueSun
transpuestas
Usando la condición
if dentro del gráfico
20 Kongsea, Olivier Moindrot, Paulo Alves
TensorFlow con
tf.cond
Usando la
21 Olivier Moindrot, Salvador Dali
convolución 1D
Usando la
22 normalización de Zhongyu Kuang
lotes
Visualizando la
24 salida de una capa Tengerye
convolucional.
https://riptutorial.com/es/home 77