Errores Comunes en la Comunicación con el Cliente: Cómo no Frustrar a tu Cliente

Cuando alguien solicita un proyecto, debemos asumir que es muy importante y que se preocupan profundamente por el producto en el que trabajará. Por lo tanto, es seguro suponer que un cliente está obligado a construir una gran expectativa sobre el producto final y, por eso puede llegar a ser emocional cuando se trata de la entrega.
A lo largo del proyecto, un cliente puede sentirse muy emocionado por una función entregada y amarte, y al día siguiente puede descubrir que algo no funciona y el afecto desaparecerá. La mayoría de las veces, es solo una cuestión de comunicación con el cliente que salió mal.
Aunque no hay recetas para el éxito cuando se trata de desarrollo de software remoto, creo que hay algunas cosas que se deben evitar para mantener una relación productiva y saludable con clientes que pusieron su confianza en tus manos.

No Falles en la Comunicación Básica con los Clientes

Imagínese la comunicación con los clientes como lo haría con la comunicación diaria con compañeros de trabajo, amigos o cualquier otra persona a quien extienda su cortesía.
Si un viejo amigo visita su casa y tú aceptas disfrutar de un manjar local “en su hogar” al mediodía, unas semanas más tarde, ¿tan sólo te presentarías allí? ¿Podrían mantenerse en contacto mientras tanto, llamar para confirmar unos días antes? ¿O tal vez asumirías que está demasiado ocupado y no querrías molestarlo sin una buena razón? ¿Esperarías que te avise cuando lleguen?
No es probable que sigas chateando todos los días a menos que tenga un montón de información, pero mantendrás algún tipo de comunicación, por cortesía y practicidad: no quieres que la otra persona piense que te olvidaste de ellos, pero definitivamente no quieres conducir a mitad de camino por la ciudad sin una buena razón.
Ilustración de comunicación con el cliente: falta de comunicación efectiva con los clientes
En algún momento, probablemente hayas experimentado situaciones similares en tu comunicación profesional también, incluso con socios y compañeros de trabajo de larga data. Algunos proyectos se ejecutan con la mínima comunicación, al igual que decir “lo habitual, al mediodía, nos vemos allí” para confirmar un almuerzo ligero. Incluso si surge algo, la otra parte seguramente le informará y aceptará reprogramarlo.
Sin embargo, las cosas no son tan simples o lineales en el mundo del desarrollo de software.
Si comienzas a trabajar en un proyecto, especialmente cuando estás tratando con un nuevo cliente, si nunca escuchan de ti, comenzarán a tener dudas sobre tu trabajo y compromiso. Incluso si aparece con un producto impecable después de unas semanas, los clientes pueden tener una percepción menos que ideal de usted.
Aunque a veces se sienta incómodo, no hace daño hablar con el cliente, incluso si no tienes nada fuera de lo común para informar. ¿Tienes alguna duda sobre un pequeño punto de la historia de un usuario? Si crees que es importante, házselo saber. ¿Estás llegando un poco tarde y no estás seguro si podrás cumplir esa fecha estimada en la que estuviste de acuerdo? ¡Llama al cliente lo antes posible! Es mejor que lo escuchen de inmediato.
¿No tienes dudas y el proyecto se ajusta a la perfección, pero el cliente no habla mucho? ¿Por qué no simplemente enviar un correo electrónico describiendo tu progreso cada pocos días? No hará ningún daño porque los correos electrónicos no serán una molestia para nadie, además documentarán tu progreso y mantendrán una comunicación regular con el cliente.

La Comunicación Defectuosa del Cliente Fomenta las Expectativas Poco Realistas

Al principio mencioné que el cliente seguramente tendrá muchas expectativas sobre el proyecto ¿verdad? Las tendrás. punto.
El cliente ya espera mucho del producto. Si no sale como lo imaginaron, los clientes inevitablemente se sentirán frustrados. Entonces, ¿por qué alguien podría prometer más de lo que puede ofrecer, creando así expectativas aún más irreales?
Aquí hay un paralelo rápido: Compraste una tableta en línea y nos prometieron una entrega de 10 días. El octavo día, la tienda le informa que hay un problema y demora la entrega por una semana. Para compensar los inconvenientes, las promesas del minorista le otorgan un crédito de $ 75 en la tienda.
Probablemente no necesites esa tableta en los próximos días, ¡así que crees que es un buen negocio! Ahora puedes disfrutar de la tableta, además de usar el crédito de la tienda para comprar algo lindo a tus hijos. Pero la tienda llama al día siguiente, diciendo que todo se solucionó de la noche a la mañana.
Obtendrás la tableta al día siguiente. Sin extras, sin crédito en la tienda. ¡Ahora estás frustrado!
“¿Qué? ¡Solo ayer me dijiste que obtendría un mejor trato! ¡No es justo! Ya se lo dije a los niños …”
Rebobina un par de días y todo lo que esperabas era la tableta de todos modos. Si nadie te hubiera prometido un mejor trato, habrías estado satisfecho con tu tableta cuando llegó al día siguiente. Pero ahora, sientes que te estás perdiendo de algo más por una buena razón, aparte de la decisión de la tienda de hacerte saber.
Ilustración de comunicación con el cliente: las habilidades de comunicación profesional evitan las expectativas poco realistas
¿Cómo pueden los desarrolladores, especialmente los profesionales independientes, evitar situaciones similares en su comunicación con los clientes?
Al no enloquecer y decir todo lo que viene a su mente en primer lugar. Las sugerencias no están prohibidas; en realidad, son muy bienvenidos si crees que una característica solicitada en particular no es una muy buena opción para resolver el problema en cuestión. Pero la clave es: “Piensa primero”.
  • Escucha al cliente.
  • Analiza su problema.
  • Analiza la solución propuesta.
  • Asegúrate de que esté dentro del presupuesto/cronograma.
  • Finalmente, sigue y presenta tu sugerencia.
Esta es la razón por la que las habilidades de comunicación con los clientes pueden ser complicadas, ya que fallar en solo uno de los primeros cuatro pasos significa que podrías terminar perdiendo el tiempo y, lo que es peor, el tiempo de tu cliente.

No Asumas que Sabes lo que el Cliente Necesita

Parafraseando a Mary Schmich, Señoras y señores de la clase del ‘17: Escuchen al cliente. Si pudiera ofrecerle solo un consejo para el futuro, escuchar al cliente sería eso.
Si te llamaron para un proyecto es porque alguien necesita algo. ¿Y quién sabría mejor sobre esa necesidad que tu cliente? Puede parecer obvio, pero a veces, en el mundo real, la gente lo olvida.
Dejame darte un ejemplo. Un minorista solicita un “sistema de software” para su negocio. Tan pronto como lo veas, llegas a la conclusión de que lo que quieren es registrar todos los productos disponibles, registrar cada compra realizada, generar recibos para los clientes e informar sobre lo que se vendió periódicamente y sobre qué artículos se están acabando. valores.
Por lo tanto en su primera reunión, deseas mostrar que es eficiente y presentarles lo que ha preparado, las características propuestas, un diseño básico para ir con la identidad visual de la tienda y todo. Pero luego el desconcertado cliente dice que, en realidad, lo que necesita es un algoritmo para calcular cómo mostrar mejor los productos en los estantes, con el objetivo de aumentar los ingresos de marcas y productos específicos.
El error aquí fue simplemente no identificar qué problema se suponía que debías resolver. Por supuesto en este caso, ya que era muy temprano en el proyecto, habría mucho tiempo para hacerlo bien, pero a veces, este tipo de error ocurre más adelante. Incluso aunque no sea tan drástico como el ejemplo anterior, puede dañar el proyecto y/o su relación con el cliente.
Mi sugerencia es la siguiente: habla con sus futuros usuarios, mucho si es posible, y consulte a varias partes interesadas en el proyecto. Ellos son los que tienen una buena visión general de la situación y saben lo que necesitan. Trata de descubrir qué hacen actualmente, en cada paso del camino, y explica cómo el software sería útil. Me gusta decir que, cuando intento entender lo que desea un cliente, mi objetivo es casi poder realizar su trabajo yo mismo. Si te acercas a este punto entonces realmente has descubierto cuáles son sus necesidades.

No se Entiende lo que el Cliente está Pidiendo

No es raro recibir algún tipo de documentación sobre el problema en cuestión. Algunas veces es solo una descripción de alto nivel, mientras que otras veces es un documento detallado con casos de uso y reglas comerciales. En cualquier caso, no importa cuán claros sean los registros, lo único que no se puede hacer es simplemente asumir que todo lo escrito allí es la verdad absoluta.
¿¿¿Qué???
Exactamente. Primero, algo puede significar una cosa para alguien, en un cierto contexto, y una cosa completamente diferente para las personas que no pertenecen a esa realidad. Y si hay algo que tú y el cliente no tienen en común, ¡es el contexto!
Ejemplo de comunicación con el cliente: falta de comprensión de la tarea en cuestión
Segundo, no todos son escritores muy hábiles; intentan decir A pero terminan describiendo a B.
Entonces, después de leer todo lo que te han enviado, ¿cómo estarás seguro de que lo que lees es realmente lo que querían decir? Bueno, podrás digerir todo, tomar notas, analizar todo y … llamar a una reunión. (¿Lo ves? ¡Todo se trata de comunicación!) En la reunión, hablarás sobre el problema y describirás lo que has entendido con tus propias palabras. En esta etapa, probablemente podrá identificar cualquier malentendido.
“Oh, pero en mi caso, no recibí ningún documento. Simplemente me senté con el cliente y me explicaron todo mientras tomaba algunas notas”.
Bueno, todavía no hay garantía de que hayas entendido lo que significan y mi sugerencia sigue en pie: tómate un tiempo con tus notas, piensa en todo el problema, organiza todo, preferiblemente en algún tipo de línea de tiempo de eventos, y luego llama / vuelve a reunirte con el cliente para presentar lo que has entendido. Puede sonar repetitivo para ti, pero a veces incluso el cliente no tiene una visión completa de todos los procesos involucrados para realizar una tarea específica y verás cuán complejo tendrá que ser el software.
Al final, debes estar seguro de que no hay ambigüedad ni malentendidos.

Porqué no Debes Entregar Todo lo que el Cliente Pide sin Pensar

Bien, ahora que sabes que debes escuchar al cliente y confirmar lo que has entendido, puedes seguir adelante y hacer todo lo que te pidieron, ¿no?
¡Incorrecto!
Ahora es el momento en que finalmente puedes usar toda la experiencia que tienes y preguntarte: ¿Es lo que el cliente te pidió que resolvieras? ¿Es lo que te preguntaron realmente lo que necesitan?
Te sorprendería ver cuántas veces la respuesta es “no”.
Antes de solo entregar lo que el cliente solicitó, necesitamos analizar el problema y, si no estás de acuerdo con lo que el empleador propuso, entonces es tu trabajo y responsabilidad profesional dejar esto en claro. Por supuesto, deberías explicar por qué crees que su propuesta no es buena y cuál será tu enfoque alternativo para abordar estas deficiencias. Una vez más, la comunicación es la clave.
Si tú y el cliente son razonables, entonces procede con tu solución o ten una sesión de lluvia de ideas para encontrar una mejor (en caso de que tu idea no sea aceptable para el cliente por algún motivo).

Prototipo — No Escribas una Gran Cantidad de Documentación

Ya dije que tú y tu cliente generalmente no tienen la misma perspectiva, ¿verdad? Por lo tanto, así como afecta tu comprensión de su documentación, afectará su comprensión de lo que tú entregarás por escrito. Es una cuestión de contexto.
Por lo tanto, estoy de acuerdo en que de alguna manera (en un nivel superior o inferior), tenemos que documentar lo que estamos a punto de desarrollar. Pero entregar varias páginas de texto sin elementos visuales no te servirá de mucho. El cliente se aburrirá de leerlo, dejará de prestarle atención y probablemente no podrá entender lo que quiere decir con esas complejas reglas comerciales, o interpretarán algo completamente diferente de lo que había imaginado.
Ten en cuenta que estos malentendidos pueden ser aún peores si el cliente no tiene formación técnica.
Ilustración de comunicación con el cliente: importancia de documentar la comunicación con los clientes
Todos estos factores pueden dar como resultado el mismo resultado problemático: los clientes se quejarán cuando entregue el producto porque es probable que no sea lo que tenían en mente.
Esto es lo que sugiero: Siempre prototipo, incluso si es solo un boceto para dibujar cuál es tu plan. Y cualquiera que sea la definición que tenga que hacer, comienza desde allí. Haz referencias y trate de mantenerlo simple.

Deja de Perder el Tiempo Intentando Convencer al Cliente de que Tienes la Razón

Casi puedo estar seguro de que cada desarrollador ha pasado por la siguiente situación: al comienzo del proyecto, el cliente dice “Necesito que el color de fondo del software sea amarillo. Ya ha sido acordado por la junta”. Luego, cuando se entrega el software, dicen: “Ah, pero el color de fondo no puede ser amarillo. ¡Te dije que tenía que ser verde!”. Ahora, ¿cómo debes lidiar con esto?
De hecho de nada servirá, en cualquier caso, insistir en que tenías razón y estaban equivocados. En todo caso, solo les dará a ti y al cliente un momento difícil.
Siempre es bueno tener un buen registro de comunicación con el cliente, solo para asegurarse de estar en la misma página y dejar un rastro escrito. La mayoría de las veces, si es algo simple, puede enviar un correo electrónico al cliente diciendo: “Como acordamos en esa reunión, el fondo del sistema será amarillo”. Y si, en el futuro, el cliente cambia su tenga en cuenta que puede argumentar que lo hizo por esa reunión mencionada en el correo electrónico, pero si realmente necesita hacerse esa modificación, puedes ejecutarla, por un extra de x horas (y en ocasiones, x dólares extra).
Pero si no hay nada que demuestre que tú tenías razón, entonces probablemente tengas que tomar una decisión (además de aprender una lección): ¿El cambio es tan grande que requerirá un cambio en la arquitectura actual o afectará otras características? De lo contrario, probablemente sea mejor seguir adelante, hacerlo y tener al cliente a tu lado (pero con los ojos bien abiertos para que no vuelva a suceder). Si lo hace, una conversación con el cliente será la mejor solución; no uno que se centre en “cómo estaba en lo cierto”, sino en “cómo podemos solucionar el problema actual”.
En cualquier caso, la mejor manera de evitar tener que hacer grandes modificaciones es entregar nuevas breves características en cortos períodos de tiempo. Por lo tanto, si algo tiene que cambiarse, probablemente no será una transformación importante de lo que ya existe.

Aprender a Cuándo Comprometerte con los Plazos de Entrega

Por último, pero no menos importante, uno de los mayores errores que puedes cometer es darle a tu cliente una fecha límite para que termine el proyecto. ¡Y te suplicarán que cometas ese error!
Por supuesto, como cliente, quieres saber cuándo podrás usar todas esas características interesantes que has estado discutiendo en las últimas semanas (¿meses?). Pero dado que un proyecto no es un producto definido, pueden pasar muchas cosas desde que comienza el desarrollo hasta que el software está listo para usar.
En primer lugar, no se puede predecir lo impredecible. Es muy probable que tengas que lidiar con algo que no estabas esperando. Podría ser una licencia que el cliente prometió que no se compró a tiempo, o algún otro software interno que necesites usar, pero que no fue lanzado cuando debería haber sido, o el entorno fue diferente al acordado al principio, o el cliente cambió de opinión sobre unas (pocas) características y tuvo que volver a hacer algunas cosas.
Nada de eso es realmente culpa de un desarrollador y puede afectar profundamente el plazo del proyecto. Pero si tú, dispuesto a complacer al cliente, le prometiste que entregarías todo para una fecha determinada y terminarías no pudiendo por la razón que sea, una cosa que puedo garantizar es que el cliente estará al menos un poco frustrado. Si eres un profesional independiente, debes administrar su tiempo de manera eficiente, como lo explica el artículo del Blog de Desarrollo de Toptal. No olvides que la gestión de relaciones con el cliente también es tu trabajo.
Por lo tanto, hazte a tí y a quien depende del proyecto un favor, y al menos bríndales una estimación de cuánto tiempo llevará desarrollarlo todo, pero siempre deja en claro que sólo es una estimación y no una fecha límite.
Además, sugiero fuertemente (especialmente si ya has dado una estimación) que siempre le digas al cliente cuando algo tardará más de lo esperado para que puedan actuar para ayudarte.
Fuente:
BY ANDREZA CRISTINA DA SILVA - FREELANCE SOFTWARE ENGINEER @ TOPTAL (TRANSLATED BY YESICA DANDERFER)

De Resolver Ecuaciones a Aprendizaje Profundo: Un Tutorial de TensorFlow Python

Han habido algunos desarrollos notables últimamente en el mundo de la inteligencia artificial, desde el progreso muy publicitado con los autos sin conductor hasta las máquinas que ahora componen imitaciones Chopin o solo ser muy bueno en los videojuegos.
Para estos avances, son fundamentales algunas herramientas que ayudan a derivar el aprendizaje profundo y otros modelos de aprendizaje automático, entre los que destacan Torch, Caffe y Theano. Sin embargo, desde que Google Brain fue fuente abierta en noviembre de 2015 con su propio framework, TensorFlow, hemos visto que la popularidad de esta biblioteca de software se dispara para ser el framework de aprendizaje profundo más popular.
TensorFlow
¿Por qué ha sucedido esto? Las razones incluyen la gran cantidad de soporte y documentación disponible, su preparación para la producción, la facilidad de distribución de cálculos en una variedad de dispositivos y una excelente herramienta de visualización: TensorBoard.
En última instancia, TensorFlow logra combinar un conjunto completo y flexible de características técnicas con gran facilidad de uso.
En este artículo, obtendrás una comprensión de la mecánica de esta herramienta al usarla para resolver un problema numérico general bastante fuera de lo que normalmente implica el aprendizaje automático antes de introducir sus usos en el aprendizaje profundo con una simple implementación de red neuronal.

Antes de que Empieces

Se asume un conocimiento básico de los métodos de aprendizaje automático. Si necesitas ponerte al día, consulta esta publicación.
Como vamos a demostrar la API de Python, una comprensión de Numpy también es beneficiosa.
Para configurar TensorFlow, sigue las instrucciones que se encuentran aquí.
Si usas Windows, debes tener en cuenta que en el momento de redactar este documento, debes usar Python 3.4+, no 2.7.
Luego, cuando estés listo, deberías poder importar la biblioteca con:
import tensorflow as tf

Paso 1 de 2 a una solución TensorFlow: crea una gráfica

La construcción de los programas de TensorFlow generalmente consta de dos pasos principales, el primero de los cuales es construir una gráfica computacional que describirá los cálculos que deseas llevar a cabo, pero en realidad no los llevarás a cabo ni tendrán ningún valor.
Como con cualquier gráfica, tenemos nodos y bordes. Los bordes representan tensores, un tensor que representa una matriz n-dimensional. Por ejemplo, un tensor con dimensión (o rango en TensorFlow speak) 0 es un escalar, rango 1 un vector, rango 2 una matriz y así sucesivamente.
Los nodos representan operaciones que producen tensores de salida y toman tensores como entradas si es necesario. Tales operaciones incluyen adiciones (tf.add), multiplicaciones de matriz (tf.matmul), al igual que la creación de constantes (tf.constant).
Así que combinemos algunos de estos para nuestra primera gráfica.
a = tf.constant([2.5, 2])
b = tf.constant([3, 6], dtype=tf.float32)
total = tf.add(a, b)
Aquí hemos creado tres operaciones, dos de éstas para crear matrices de constante 1-d.
Los tipos de data se deducen del argumento de valores que se pasó o puedes denotarlos con el argumento dtype. Si yo no hubiese hecho esto con b, entonces un int32 hubiese sido inferido y un error dado como tf.add hubiese tratado de definir una adición en dos tipos diferentes.

Paso 2 de 2 para una Solución TensorFlow: Ejecuta las Operaciones

La gráfica está definida, pero para poder hacer los cálculos en ella (o cualquier parte de ella) debemos instalar una Sesión TensorFlow.
sess = tf.Session()
De manera alternativa, si estamos ejecutando una sesión en una consola interactiva, como IPython, luego utilizamos:
sess = tf.InteractiveSession()
El método run en el objeto de sesión es una forma de evaluar un Tensor.
Por ende, para evaluar el cálculo de adición definido arriba, pasamos ‘total’, el Tensor para retirar, el cual representa la salida de la op tf.add.
print(sess.run(total)) # [ 5.5  8. ]
En este punto introducimos la Variable TensorFlow. Donde las constantes son una parte fija de la definición de la gráfica, las variables pueden ser actualizadas. El constructor de la clase requiere un valor inicial, aun así, las variables necesitan una operación para inicializarlas explícitamente antes de que se lleven a cabo otras operaciones en ellas.
Las variables mantienen el estado de la gráfica en una sesión particular por lo que debemos observar lo que ocurre con las sesiones múltiples usando la misma gráfica para comprender mejor las variables.
# Crea una variable con un valor inicial de 1
some_var = tf.Variable(1)

# Crea una op para ejecutar inicializadores de variables
init_op = tf.global_variables_initializer()
# Crea una op para reemplazar el valor mantenido por some_var a 3
assign_op = some_var.assign(3)
# Instala dos instancias de una sesión
sess1 = tf.Session()
sess2 = tf.Session()

# Inicializa variables en ambas sesiones
sess1.run(init_op)
sess2.run(init_op)
print(sess1.run(some_var)) # Salidas 1

# Cambia some_var en sesión1
sess1.run(assign_op)
print(sess1.run(some_var)) # Salidas 3
print(sess2.run(some_var)) # Salidas 1

# Cierra Sesiones
sess1.close()
sess2.close()
Hemos instalado la gráfica y dos sesiones.
Después de ejecutar la inicialización en ambas sesiones (si no ejecutamos esto y luego evaluamos la variable, llegamos a un error) solo ejecutamos la op de asignación en una sesión. Como se puede ver, el valor de la variable persiste, pero no en todas las sesiones.

Alimentando la Gráfica para Abordar los Problemas Numéricos

Otro concepto importante de TensorFlow es el marcador de posición. Mientras que las variables mantienen el estado, los marcadores de posición se usan para definir qué entradas puede esperar la gráfica y su tipo de datos (y opcionalmente su forma). Luego podemos alimentar datos en la gráfica a través de estos marcadores de posición cuando ejecutamos el cálculo.
La gráfica TensorFlow está comenzando a parecerse a las redes neuronales que queremos entrenar pero antes de eso, usemos los conceptos para resolver un problema numérico común del mundo financiero.
Supongamos que queremos encontrar y en una ecuación como esta:
v = Ce-0.5y+ Ce-y+Ce-1.5y+(C+P)e-2y
para un v dado (con la constante C y P).
Esta es una fórmula para calcular el rendimiento hasta el vencimiento (y) en un bono con valor de mercado v, principal P, y cupón C pagado semestralmente, pero con los flujos de efectivo descontados de en composición continua.
Básicamente, tenemos que resolver una ecuación como ésta con prueba y error y elegiremos el método de bisección para concentrarnos en nuestro valor final para y.
Primero, modelaremos este problema como una gráfica de TensorFlow.
C y P son constantes fijas y forman parte de la definición de nuestra gráfica. Queremos tener un proceso que refine los límites inferior y superior de y. Por lo tanto, estos límites (denotados como “a” y “b”) son buenos candidatos para las variables que deben modificarse después de cada conjetura de “y” (que se toma como el punto medio de “a” y “b”).
# Especifica los valores que generarán nuestras operaciones constantes
C = tf.constant(5.0)
P = tf.constant(100.0)

# Especificamos los valores iniciales que serán nuestros límites inferior y superior cuando se inicialicen.
# Obviamente, el éxito final de este algoritmo depende de puntos de partida decentes
a = tf.Variable(-10.0)
b = tf.Variable(10.0)
# Esperamos que se inserte un número flotante en la gráfica
v_target = tf.placeholder("float")
# Recuerda que las siguientes operaciones son definiciones,
# ninguna se lleva a cabo hasta que se evalúa una operación en una sesión!
y = (a+b)/2
v_guess = C*tf.exp(-0.5*y) + C*tf.exp(-y) + C*tf.exp(-1.5*y) + (C + P)*tf.exp(-2*y)
# Operaciones para establecer valores temporales (a_ y b_) destinado a ser los próximos valores de a y b.
# ej. si la conjetura resulta en una v mayor que la v objetivo,
# estableceremos a_ como el valor actual de y
a_ = tf.where(v_guess > v_target, y, a)
b_ = tf.where(v_guess < v_target, y, b)
# La última etapa de nuestra gráfica es asignar los dos valores temporales a nuestras variables
step = tf.group( a.assign(a_), b.assign(b_) )
Entonces ahora tenemos una lista de operaciones y variables, cualquiera de las cuales puede ser evaluada contra una sesión en particular. Algunas de estas operaciones dependen de que se ejecuten otras operaciones, por lo que ejecutar, por ejemplo, v_guess activará una reacción en cadena para que otros tensores, como C y P, se evalúen primero.
Algunas de estas operaciones dependen de un marcador de posición para el cual se debe especificar un valor entonces, ¿cómo alimentamos realmente ese valor?
Esto se hace mediante el argumento feed_dict en la función run.
Si quieres evaluar a_, conectamos el valor de nuestro marcador de posición v_target, así:
sess.run(a_, feed_dict={v_target: 100})
Dando como resultado 0.0.
Conecta un v_target de 130 y obtenemos -10.0.
Es nuestra operación de “paso” que realmente requiere que todas las demás operaciones se realicen como un requisito previo y, de hecho, ejecuta toda la gráfica. También es una operación que realmente cambia el estado real en nuestra sesión. Por lo tanto, cuanto más ejecutamos el paso, más empujamos incrementalmente nuestras variables a y b hacia el valor real de y.
Entonces, digamos que nuestro valor para v en nuestra ecuación es igual a 95. Establezcamos una sesión y ejecutemos nuestra gráfica en ella 100 veces.
# Configurar una sesión e inicializar variables
sess = tf.Session()
tf.global_variables_initializer().run()
# Ejecuta la operación de paso (y, por lo tanto, toda la gráfica) 100 veces
para i en el rango (100):
 sess.run(step, feed_dict={v_target:95})
Si evaluamos el tensor y ahora, obtenemos algo parecido a una respuesta deseable
print(sess.run(y)) # 0.125163

Redes Neuronales

Ahora que tenemos una comprensión de la mecánica de TensorFlow, podemos combinar esto con algunas operaciones adicionales de aprendizaje automático integradas en TensorFlow para entrenar una red neuronal simple.
Aquí nos gustaría clasificar puntos de data en un sistema coordinado 2d, dependiendo de si caen en una región en particular en un círculo de radio 0.5 centrado en el origen.
Por supuesto, esto se puede verificar de manera concreta simplemente buscando un punto dado (a,b)si a^2 + b^2 <0.5, pero a los efectos de este experimento de aprendizaje automático, nos gustaría en su lugar pasar un conjunto de entrenamiento: una serie de puntos aleatorios y si caen o no en nuestra región prevista. Aquí hay una forma de crear esto:
import numpy as np
NO_OF_RANDOM_POINTS = 100
CIRCLE_RADIUS = 0.5
random_spots = np.random.rand(NO_OF_RANDOM_POINTS, 2) * 2 - 1
is_inside_circle = (np.power(random_spots[:,0],2) + np.power(random_spots[:,1],2) < CIRCLE_RADIUS).astype(int)
Crearemos una red neuronal con las siguientes características:
  1. Consiste en una capa de entrada con dos nodos, en la que alimentamos nuestra serie de vectores bidimensionales contenidos en “random_spots”. Esto estará representado por un marcador de posición que espera los datos de entrenamiento.
  2. La capa de salida también tendrá dos nodos, por lo que necesitamos alimentar nuestra serie de etiquetas de capacitación (“is_inside_circle”) en un marcador de posición para un escalar y luego convertir esos valores en un vector caliente de dos dimensiones.
  3. Tendremos una capa oculta que consta de tres nodos, por lo que necesitaremos usar variables para nuestras matrices de ponderaciones y vectores de sesgo ya que estos son los valores que deben ser refinados al realizar la capacitación.
INPUT_LAYER_SIZE = 2
HIDDEN_LAYER_SIZE = 3
OUTPUT_LAYER_SIZE = 2

# Los valores iniciales para los pesos y los sesgos se dibujan aleatoria y uniformemente a partir de [-1, 1]
# Por ejemplo, W1 es una matriz de forma 2x3
W1 = tf.Variable(tf.random_uniform([INPUT_LAYER_SIZE, HIDDEN_LAYER_SIZE], -1, 1))
b1 = tf.Variable(tf.random_uniform([HIDDEN_LAYER_SIZE], -1, 1))
W2 = tf.Variable(tf.random_uniform([HIDDEN_LAYER_SIZE, OUTPUT_LAYER_SIZE], -1, 1))
b2 = tf.Variable(tf.random_uniform([OUTPUT_LAYER_SIZE], -1, 1))
# Especificando que el marcador de posición X puede esperar una matriz de 2 columnas (pero cualquier cantidad de filas)
# representando lugares aleatorios
X = tf.placeholder(tf.float32, [None, INPUT_LAYER_SIZE])
# El marcador de posición Y puede esperar números enteros que representen si el punto correspondiente está en el círculo
# o no (sin forma específica)
Y = tf.placeholder(tf.uint8)
# Una op para convertir a un único vector caliente
onehot_output = tf.one_hot(Y, OUTPUT_LAYER_SIZE)
Para completar la definición de nuestra gráfica, definimos algunas operaciones que nos ayudarán a entrenar las variables para llegar a un mejor clasificador. Estos incluyen los cálculos de la matriz, las funciones de activación y el optimizador.
LEARNING_RATE = 0.01
# Op para ejecutar un cálculo de matriz X*W1 + b1
hidden_layer = tf.add(tf.matmul(X, W1), b1)
# Utiliza la función de activación sigmoidea en el resultado
activated_hidden_layer = tf.sigmoid(hidden_layer)
# Aplica los siguientes pesos y sesgo (W2, b2) a la capa oculta y luego aplica la función softmax
# para obtener nuestra capa de salida (cada vector sumando 1)
output_layer = tf.nn.softmax(tf.add(tf.matmul(activated_hidden_layer, W2), b2))
# Calcula la entropía cruzada para nuestra función de pérdida
loss = -tf.reduce_sum(onehot_output * tf.log(output_layer))
# Utiliza el optimizador de descenso de gradiente a la velocidad de aprendizaje especificada para minimizar el valor dado por el tensor de pérdida
train_step = tf.train.GradientDescentOptimizer(LEARNING_RATE).minimize(loss)
Después de configurar nuestra gráfica, es hora de configurar una sesión y ejecutar el “paso de tren” (que también ejecuta las operaciones de requisitos previos). Algunas de estas op usan marcadores de posición, por lo que se deben proporcionar los valores. Este paso de entrenamiento representa una época en nuestro algoritmo de aprendizaje y, como tal, se enlaza a la cantidad de épocas que deseamos ejecutar. Podemos ejecutar otras partes de la gráfica, como el tensor de “pérdida” para fines informativos.
EPOCH_COUNT = 1000
sess = tf.Session()
tf.global_variables_initializer().run()
para i en rango(EPOCH_COUNT):
   if i%100 == 0:
    print('Loss after %d runs: %f' % (i, sess.run(loss, feed_dict={X: random_spots, Y: is_inside_circle})))
 sess.run(train_step, feed_dict={X: random_spots, Y: is_inside_circle})
print('Final loss after %d runs: %f' % (i, sess.run(loss, feed_dict={X: random_spots, Y: is_inside_circle})))
Una vez que hemos entrenado el algoritmo, podemos alimentar en un punto y obtener la salida de la red neuronal así:
sess.run(output_layer, feed_dict={X: [[1, 1]]}) # Hopefully something close to [1, 0]
sess.run(output_layer, feed_dict={X: [[0, 0]]}) # Hopefully something close to [0, 1]
Podemos clasificar el punto como fuera del círculo si el primer miembro del vector de salida es mayor que 0.5, dentro de lo contrario. Al ejecutar el tensor output_layer para muchos puntos, podemos tener una idea de cómo el aprendiz visualiza la región que contiene los puntos clasificados positivamente. Vale la pena jugar con el tamaño del conjunto de entrenamiento, la tasa de aprendizaje y otros parámetros para ver qué tan cerca podemos llegar al círculo que pretendíamos.

Almost triangle
Conjunto de entrenamiento: 100 puntos
Tasa de aprendizaje: 0.01
Épocas: 1000
Small triangle
Conjunto de entrenamiento: 1000 puntos 
Tasa de aprendizaje: 0.01
Épocas: 1000
Large triangle
Conjunto de entrenamiento: 1000 puntos 
Tasa de aprendizaje: 0.01
Épocas: 10000
Almost circle
Conjunto de entrenamiento: 1000 puntos 
Tasa de aprendizaje: 0.0001
Épocas: 10000

Para Terminar

Esta es una buena lección de que un aumento en el conjunto de entrenamiento, o la cantidad de época no es garantía para un buen alumno, la tasa de aprendizaje debe ajustarse de manera apropiada.
Afortunadamente, estas demostraciones le han brindado una buena idea de los principios básicos de TensorFlow y proporcionan una base sólida para implementar técnicas más complejas.
No hemos cubierto conceptos como el Tensorboard o la capacitación de nuestros modelos en GPU, pero estos están bien cubiertos en la documentación de TensorFlow. Se pueden encontrar varias recetas en la documentación que pueden ayudarte a ponerte al día con las emocionantes tareas de aprendizaje profundo utilizando este poderoso framework.
Fuente:

BY OLIVER HOLLOWAY - FREELANCE SOFTWARE ENGINEER @ TOPTAL (TRANSLATED BY MARISELA ORDAZ)

Seguidores