notas de estudio TensorFlow (seis) - MNIST - Introducción

portal de aprendizaje automático MNIST

Destinatarios Este tutorial es para el aprendizaje automático principiante y TensorFlow no son conscientes de. Si ya conoce MNIST y el retorno softmax (regresión softmax) del conocimiento relevante, se puede leer este tutorial de inicio rápido .

Cuando empezamos a aprender programación, a menudo lo primero es aprender a imprimir "Hello World". No es como Hello World, máquina de portal de aprendizaje tiene MNIST que la programación de entrada.

MNIST es un conjunto de datos de la visión por ordenador de nivel de entrada que contiene todo tipo de imágenes digitales escritas a mano:

También contiene una imagen de cada etiqueta correspondiente, nos dicen que esto es un par de números. Por ejemplo, las cuatro imágenes de arriba de esta etiqueta son 5,0,4,1.

En este tutorial, vamos a entrenar a una máquina modelos utilizados para predecir la imagen dentro de los números de aprendizaje. Nuestro propósito no es diseñar un modelo de complejos de clase mundial - aunque más tarde le daremos el código fuente para lograr modelos de predicción de primera clase - pero para introducir cómo utilizar TensorFlow. Así pues, aquí vamos a empezar con una muy simple modelo matemático, que se llama Softmax regresión.

Este tutorial corresponde a la realización del código es muy corta, y el contenido realmente interesante contiene sólo tres líneas de código en el interior. El concepto TensorFlow flujo de trabajo y la máquina de aprendizaje básico: sin embargo, estas ideas de diseño contenida en el código que es muy importante entender. Por lo tanto, este tutorial se describe la implementación de estos principios del código con gran detalle.

conjunto de datos MNIST

conjunto de datos de sitio web oficial es MNIST Yann LeCun - que está página web . A continuación, ofrecemos un código fuente de Python para descargar e instalar automáticamente este conjunto de datos. Puede descargar este código , y luego usar el siguiente código en su interior proyecto, puede copiar y pegar directamente en su código dentro del archivo.

import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

conjunto de datos descargados se divide en dos partes: 60000 línea de formación de datos ( mnist.train) y 000 filas de conjunto de datos de prueba ( mnist.test). Esta segmentación es importante y debe tener en modelos diseñados con un conjunto independiente de datos de prueba de aprendizaje máquina no se utiliza para la formación sino para evaluar el rendimiento del modelo, por lo que es más fácil diseñar el modelo se extiende a otros conjuntos de datos (generalización ).

Como se mencionó anteriormente, cada unidad de datos MNIST dos partes: una imagen digital que comprende escrito a mano y una etiqueta correspondiente. Ponemos estas fotos a "x", estas etiquetas se ajusta a "ys". El entrenamiento conjunto de datos y el conjunto de datos de prueba contiene xs e ys, como el conjunto de entrenamiento es la imagen  mnist.train.images , la etiqueta de entrenamiento conjunto de datos es  mnist.train.labels.

Cada píxel de la imagen X28 contiene 28 píxeles. Podemos utilizar una matriz numérica para representar esta imagen:

Llamamos a este conjunto desplegado en un vector de longitud es 28x28 = 784. La forma de ampliar la matriz (la secuencia entre los números) no es importante, siempre y cuando cada imagen se desarrollan de la misma manera. Desde esta perspectiva, MNIST imagen conjunto de datos 784 está en un punto en el interior de espacio vectorial dimensional, y tiene una relativamente compleja estructura  (nota: la visualización de estos datos es computacionalmente intensivo).

Acoplar una serie de imágenes digitales pierde información estructural bidimensional de la imagen. Esto obviamente no es perfecto, los mejores métodos de visión por ordenador excavará y utilizar esta información estructural, vamos a introducir en los siguientes tutoriales. Pero en este tutorial no hacemos caso de estas estructuras, un simple modelo matemático descrito, el retorno softmax (regresión softmax), estas estructuras no usarán la información.

Por lo tanto, en el conjunto de datos de entrenamiento MNIST, mnist.train.images está conformado como un  [60000, 784] tensor, una dimensión de la primera imagen digital para el índice, el segundo número de índice dimensión para cada píxel en la imagen. Cada elemento en esta dentro de tensor, han dicho que una intensidad de la imagen de un valor de píxel en un valor entre 0 y 1.

etiqueta MNIST conjunto de datos correspondiente es un número de 0 a 9, se utiliza para describir una imagen dada en una representación digital. Para que este tutorial, hacemos los datos de etiqueta es "vectores de una sola calientes". Además de un vector de una sola caliente digital es una una dimensión de la cantidad restante que no sea 1 es 0. Por lo tanto, en este tutorial, ser representado como un número n solamente en la dimensión n-ésimo número (cero) es un vector de 10 dimensiones 1. Por ejemplo, la etiqueta se expresa como 0 ([1,0,0,0,0,0,0,0,0,0,0]). Por lo tanto,  mnist.train.labels una  [60000, 10] matriz digital.

Ahora, estamos listos para empezar a construir nuestro modelo de él!

Softmax retorno Introducción

Sabemos MNIST de cada imagen representa un número 0-9. Esperamos recibir una determinada imagen es representativa de la probabilidad de cada número. Por ejemplo, nuestro modelo puede contener una imagen probabilidad especulativa es representativa del número 9 de 9 fue 80%, pero es el juicio de 8 5% de probabilidad (porque 8 y 9 son parte superior del pequeño círculo), luego darle representantes de otros probabilidad digital de un valor más pequeño.

Este es un caso clásico de la utilización de retorno softmax (regresión softmax) modelo. softmax modelo se puede utilizar para asignar probabilidades a diferentes objetos. Incluso después, cuando entrenamos modelo más sofisticado, el paso final es también necesaria para asignar probabilidades con softmax.

retorno softmax (regresión softmax) en dos pasos: el primer paso

Con el fin de obtener una evidencia fotográfica dada de una clase particular de digital (pruebas) pertenecen, que suma ponderada de los valores de píxeles de la imagen. Si los píxeles tienen una fuerte evidencia de que esta imagen no pertenece a la clase, a continuación, el valor del peso correspondiente es negativo, por el contrario, si los píxeles tienen una fuerte evidencia para apoyar esta imagen pertenecen a esta categoría, a continuación, los pesos son números positivos.

A continuación se muestra el modelo de imagen en una imagen para aprender el valor de cada píxel por el derecho a un número determinado de clases. El rojo representa pesos negativos, azul para los pesos positivos.

También tenemos que añadir una desviación adicional (sesgo), debido a que la cantidad de interferencia con la entrada menudo no relacionados. Así, para una imagen de entrada dada  x  representa digitales  i  pruebas se puede expresar como

En el que   el peso representante  representa un número  i  OFFSET clase, J  nombre de una imagen dada  x  índice de píxel para sumar el píxel. A continuación, puede convertir en evidencia por la función de probabilidad softmax  la y- :

softmax en el presente documento puede ser visto como una función de incentivo (activación) o función de enlace (link), una función lineal de convertir la salida en un formato que definimos que queremos, es decir, 10 números en una distribución de probabilidad de las clases. Así, dada una imagen, que puede ser convertido a una bondad digital del ajuste de cada función softmax como un valor de probabilidad. función softmax se puede definir como:

Expandir el lado derecho de la sub-tipo, se puede obtener:

Pero más a menudo función del modelo softmax se define como una forma de la primera: el valor de entrada se evalúa como el exponente, entonces los valores positivos de estos resultados. Esto representa exponenciación, correspondiente a un valor de peso pesos mayor evidencia multiplicadores mayor hipotético modelo (hipótesis) en el interior. Por el contrario, la evidencia tiene menos medios que tienen una más pequeña coeficientes multiplicadores en el interior supuestos del modelo. modelo hipotético de que los pesos no puede ser una o un valor 0 negativo. N Softmax entonces estos pesos se basan, de modo que su suma es igual a 1, a fin de construir una distribución de probabilidad válida. (Más información sobre la función Softmax, que puede referirse al libro de Michael Nieslen parte , que puede ser la interpretación visual interactiva de la softmax).

Para el modelo de regresión softmax puede explicarse por el siguiente diagrama, la entrada de la xssuma ponderada, a continuación, la adición de un respectivo desplazamiento, y finalmente introduce en la función softmax:

Si lo pones en una ecuación, se obtiene:

También podemos utilizar representación vectorial de este cálculo: la adición de vectores y la multiplicación de matrices. Esto ayuda a mejorar la eficiencia computacional. (También una manera más eficiente de pensar)

Por otra parte, se puede escribir de una forma más compacta:

Lograr modelo de regresión

Para el cálculo numérico eficiente implementado en Python, a menudo utilizamos la biblioteca, tales como NumPy, se multiplicación de matrices igualmente compleja usando un uno de los idiomas diferentes. Por desgracia, cada operación de conmutación de vuelta a Python desde un informático externo sigue siendo un montón de gastos generales. Si se calcula para uso externo de la GPU, por lo que el costo será aún mayor. Con el modo de computar distribuido, que invertirá más recursos que se utilizan para transmitir datos.

TensorFlow también coloca fuera de la cálculos complejos pitón completado, pero con el fin de evitar la sobrecarga de los que dijo anteriormente, se hizo una mejora adicional. Tensorflow no funcionar de forma individual una sola cálculos complejos, pero debemos primero representa gráficamente una serie de operaciones de computación interactiva, entonces todo correr juntos fuera de Python. (Un modo similar tal de la operación, se puede ver en muchos biblioteca de aprendizaje de máquina.)

Antes de utilizar TensorFlow, primero importarlo:

import tensorflow as tf

Describimos estos unidad de operación interactiva operando el símbolo de la variable, para crear una manera siguiente:

x = tf.placeholder("float", [None, 784])

xNo es un valor específico, pero un marcador de posición placeholder, que entran en este valor cuando TensorFlow cálculos ejecutar. Queremos introducir cualquier número MNIST imágenes, cada una aplanada en un mapa del vector de 784 dimensiones. Utilizamos un flotador tensor de dos dimensiones para representar estas cifras, la forma del tensor [None,784 ]. (En la presente memoria Noneindica una dimensión tensor puede ser de cualquier longitud.)

Nuestro modelo también requiere pesos y valores de desplazamiento, por supuesto, se puede utilizar como una entrada adicional (marcadores de posición), pero hay una mejor manera de TensorFlow representarlos: Variable . Un Variablerepresentante de un tensor se puede modificar, está presente en la figura TensorFlow para describir la operación interactiva. Pueden ser utilizados para calcular el valor de entrada también pueden ser modificados en el cálculo. Para una variedad de aplicaciones de aprendizaje automático, por lo general no son parámetros del modelo pueden ser Variableexpresadas.

W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))

Damos a tf.Variablediferentes valores iniciales para crear diferentes Variable: Aquí, nosotros usamos tensor son todos cero para inicializar Wy b. Debido a que queremos aprender Wy bvalor de su valor inicial se puede ajustar libremente.

Tenga en cuenta que Wlas dimensiones son [784,10], porque queremos que multiplicarlo con un vector de dimensiones 784 para obtener una imagen de valor de 10 dimensiones del vector de las pruebas, todas las clases correspondientes a diferentes números. bLa forma [10], por lo que puede directamente salida a la parte superior.

Ahora, podemos darnos cuenta de nuestros amigos modelo. Sólo una línea de código!

y = tf.nn.softmax(tf.matmul(x,W) + b)

En primer lugar, tf.matmul(​​X,W)expresamos xmultiplican W, dentro de la ecuación anterior correspondiente , aquí xes un tensor de 2 dimensiones tiene una pluralidad de entradas. Entonces combinada b, y la entrada a la tf.nn.softmaxinterior de función.

En este punto, vamos a comenzar con unas pocas líneas de código a variables establecidas, y luego una línea de código para definir nuestro modelo. TensorFlow no sólo puede hacer el cálculo modelo de regresión softmax se hace particularmente sencilla, sino que también se utiliza para describir una variedad de otros cálculos numéricos de esta manera muy flexible, a partir de modelos para el modelo de simulación de la física de aprendizaje de máquina. Una vez que se definen, nuestro modelo puede ejecutarse en diferentes dispositivos: CPU de la computadora, la GPU, o incluso un teléfono celular!

entrenador

Con el fin de capacitar a nuestro modelo, en primer lugar hay que definir un indicador para evaluar el modelo es bueno. De hecho, en el aprendizaje de máquina, por lo general definen los indicadores para representar un modelo es malo, este indicador conocido como el costo (costo) o pérdida (pérdida), y luego tratar de minimizar este indicador. Sin embargo, estos dos métodos son los mismos.

Una función de coste muy común, muy agradable es una "entropía cruzada" (entropía cruzada). La información sobre la entropía cruzada produjo teoría de la información dentro de la tecnología de compresión, pero más tarde se convirtió en un importante medio técnico de la teoría de juegos a otros campos, como el interior de la máquina de aprendizaje. Se define como sigue:

y  es la distribución de probabilidad de nuestra predicción,  y '  es la distribución real de la (uno en caliente nuestro vector de entrada). conocimiento aproximado es que la adhesión a la entropía es una medida de la ineficiencia de nuestro pronóstico se utiliza para describir la verdad. Una explicación más detallada de la entropía cruzada está más allá del alcance de este tutorial, pero se necesita muy buena comprensión de la misma .

Para el cálculo de la entropía cruzada, en primer lugar hay que añadir un nuevo marcador de posición para entrar en el valor correcto:

y_ = tf.placeholder("float", [None,10])

Entonces podemos   calcular la entropía cruzada:

cross_entropy = -tf.reduce_sum(y_*tf.log(y))

En primer lugar,  tf.log calcular  y el logaritmo de cada elemento. A continuación, se puso  y_ cada elemento y  tf.log(y_) se multiplican los elementos correspondientes. Por último,  tf.reduce_sum la suma de todos los elementos tensores calculados. (Tenga en cuenta que la entropía cruzada aquí no sólo se utiliza para medir una sola predicción y el valor verdadero, pero la suma de la entropía cruzada de las 100 imágenes de 100 puntos de datos para predecir el rendimiento mejor que el rendimiento de un solo punto de datos describir el comportamiento de nuestro modelo.

Ahora sabemos lo que tenemos que hacer en nuestro modelo, con TensorFlow para entrenar es muy fácil. Debido TensorFlow tienes un mapa que describe diversos unidad de cálculo, que se puede utilizar automáticamente el algoritmo de retropropagación (backpropagation algoritmo) para determinar efectivamente las variables que afectan a la forma en que desea reducir al mínimo el valor de costo de. Entonces, TensorFlow utilizará algoritmos de optimización decide continuar para modificar las variables con el fin de reducir los costos.

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

Aquí, reivindicamos TensorFlow descenso algoritmo (pendiente de descenso algoritmo) tasa de aprendizaje con un gradiente de 0,01 para minimizar la entropía cruzada. Pendiente de descenso algoritmo (algoritmo de pendiente de descenso) es un proceso de aprendizaje simple, TensorFlow sólo un poco de cada variable costos continúan disminuyendo a una dirección de movimiento. TensorFlow del curso también proporciona una serie de otros algoritmos de optimización : basta con ajustar la línea de código que puede utilizar otros algoritmos.

TensorFlow en el presente documento en realidad lo que hace es que va a la descripción de la figura en el interior de sus cálculos y algoritmos aumentar pendiente de descenso algoritmo calcula un nuevo conjunto de medios para la consecución de retropropagación en el fondo operativo. Luego, vuelve al que acaba de una sola operación, cuando se ejecuta esta operación, se utiliza un algoritmo de descenso de gradiente entrenamiento de su modelo, ajustar las variables, los costos decrecientes.

Ahora, hemos puesto en marcha nuestro modelo. Antes de ejecutar los cálculos, tenemos que añadir una acción para inicializar la variable que hemos creado:

init = tf.initialize_all_variables()

Ahora podemos ser una Sessioncomenzando con detalle el modelo y las variables de inicialización:

sess = tf.Session()
sess.run(init)

A continuación, iniciar la formación de modelo, donde hacemos circuito de modelo de formación 1000!

for i in range(1000):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

Cada etapa del ciclo, que será al azar por lotes recoger 100 puntos de datos en los datos de entrenamiento, y luego utilizar estos puntos de datos para funcionar como antes los marcadores de posición de sustitución train_step.

El uso de una fracción de los datos aleatorios para la formación se llama formación al azar (formación estocástico) - más precisamente donde una formación de descenso de gradiente estocástico. En un mundo ideal, queremos utilizar todos nuestros datos para cada etapa de la formación, porque esto nos dará una mejor los resultados del entrenamiento, pero es evidente que esto requiere una gran cantidad de sobrecarga de cálculo. Así, todo el entrenamiento que puede utilizar diferentes subconjuntos de datos, esto sólo puede reducir la sobrecarga de cálculo, pueden aprender a maximizar las características generales del conjunto de datos.

Evaluar nuestro modelo

Entonces, ¿cómo vamos a modelar el desempeño de la misma?

En primer lugar, vamos a averiguar que predicen la etiqueta correcta. tf.argmax Es una función muy útil, se le da un valor máximo de la tensor índice de objeto que los datos residen en una dimensión. Puesto que la etiqueta es un vector que consiste en 0, por lo que el valor máximo de la posición de índice se encuentra una etiqueta de categoría, como tf.argmax(y,1)el retorno de la predicción del modelo para cualquier entrada x al valor de la etiqueta, y  tf.argmax(y_,1) el representante de la etiqueta correcta, se puede utilizar  tf.equal para probar nuestra la predicción es cierto fósforo de etiqueta (posición de índice en la expresión de juego).

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

Esta línea nos dará un conjunto de valores booleanos. Con el fin de determinar la proporción correcta del predictor, podemos convertir los valores booleanos para punto flotante, y luego promediado. Por ejemplo, [True, False, True, True] se convertirá  [1,0,1,1] , después de obtener un promedio  0.75.

accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

Por último, calculamos la precisión del conjunto de datos de prueba modelo aprendido anteriormente.

print sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})

El valor del resultado final debe ser de alrededor del 91%.

Este resultado está bien? Ah, no tan bueno. De hecho, este resultado es muy pobre. Esto se debe a que sólo utilizamos un modelo muy simple. Sin embargo, hacer algunas pequeñas mejoras, podemos obtener la velocidad correcta del 97%. Los mejores modelos pueden incluso conseguir más del 99,7% de precisión! (Para más información, se puede ver en esto durante varios modelos comparan el rendimiento de la lista .)

Más importante que el resultado es que se aprende a diseñar ideas de este modelo. Sin embargo, si usted todavía está un poco decepcionado con los resultados aquí, se puede ver el siguiente tutorial , donde se puede aprender a construir modelos más complejos con FensorFlow para un mejor rendimiento!

 

programa 

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

import tensorflow as tf

x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x, W) + b)
y_ = tf.placeholder("float", [None, 10])
cross_entropy = -tf.reduce_mean(y_ * tf.log(y))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)

for i in range(1000):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
    correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
    print(i, sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

sess.close()

 

Publicado 47 artículos originales · ganado elogios 121 · vistas 680 000 +

Supongo que te gusta

Origin blog.csdn.net/guoyunfei123/article/details/82852786
Recomendado
Clasificación