{"payload":{"allShortcutsEnabled":false,"fileTree":{"tensorflow_v2/notebooks/3_NeuralNetworks":{"items":[{"name":"autoencoder.ipynb","path":"tensorflow_v2/notebooks/3_NeuralNetworks/autoencoder.ipynb","contentType":"file"},{"name":"bidirectional_rnn.ipynb","path":"tensorflow_v2/notebooks/3_NeuralNetworks/bidirectional_rnn.ipynb","contentType":"file"},{"name":"convolutional_network.ipynb","path":"tensorflow_v2/notebooks/3_NeuralNetworks/convolutional_network.ipynb","contentType":"file"},{"name":"convolutional_network_raw.ipynb","path":"tensorflow_v2/notebooks/3_NeuralNetworks/convolutional_network_raw.ipynb","contentType":"file"},{"name":"dcgan.ipynb","path":"tensorflow_v2/notebooks/3_NeuralNetworks/dcgan.ipynb","contentType":"file"},{"name":"dynamic_rnn.ipynb","path":"tensorflow_v2/notebooks/3_NeuralNetworks/dynamic_rnn.ipynb","contentType":"file"},{"name":"neural_network.ipynb","path":"tensorflow_v2/notebooks/3_NeuralNetworks/neural_network.ipynb","contentType":"file"},{"name":"neural_network_raw.ipynb","path":"tensorflow_v2/notebooks/3_NeuralNetworks/neural_network_raw.ipynb","contentType":"file"},{"name":"recurrent_network.ipynb","path":"tensorflow_v2/notebooks/3_NeuralNetworks/recurrent_network.ipynb","contentType":"file"}],"totalCount":9},"tensorflow_v2/notebooks":{"items":[{"name":"0_Prerequisite","path":"tensorflow_v2/notebooks/0_Prerequisite","contentType":"directory"},{"name":"1_Introduction","path":"tensorflow_v2/notebooks/1_Introduction","contentType":"directory"},{"name":"2_BasicModels","path":"tensorflow_v2/notebooks/2_BasicModels","contentType":"directory"},{"name":"3_NeuralNetworks","path":"tensorflow_v2/notebooks/3_NeuralNetworks","contentType":"directory"},{"name":"4_Utils","path":"tensorflow_v2/notebooks/4_Utils","contentType":"directory"},{"name":"5_DataManagement","path":"tensorflow_v2/notebooks/5_DataManagement","contentType":"directory"},{"name":"6_Hardware","path":"tensorflow_v2/notebooks/6_Hardware","contentType":"directory"}],"totalCount":7},"tensorflow_v2":{"items":[{"name":"notebooks","path":"tensorflow_v2/notebooks","contentType":"directory"},{"name":"README.md","path":"tensorflow_v2/README.md","contentType":"file"}],"totalCount":2},"":{"items":[{"name":"examples","path":"examples","contentType":"directory"},{"name":"notebooks","path":"notebooks","contentType":"directory"},{"name":"resources","path":"resources","contentType":"directory"},{"name":"tensorflow_v1","path":"tensorflow_v1","contentType":"directory"},{"name":"tensorflow_v2","path":"tensorflow_v2","contentType":"directory"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"input_data.py","path":"input_data.py","contentType":"file"}],"totalCount":9}},"fileTreeProcessingTime":7.918408,"foldersToFetch":[],"repo":{"id":45986162,"defaultBranch":"master","name":"TensorFlow-Examples","ownerLogin":"aymericdamien","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2015-11-11T14:21:19.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/10386605?v=4","public":true,"private":false,"isOrgOwned":false},"symbolsExpanded":false,"treeExpanded":true,"refInfo":{"name":"master","listCacheKey":"v0:1600501244.0","canEdit":false,"refType":"branch","currentOid":"6dcbe14649163814e72a22a999f20c5e247ce988"},"path":"tensorflow_v2/notebooks/3_NeuralNetworks/neural_network_raw.ipynb","currentUser":null,"blob":{"rawLines":["{"," \"cells\": ["," {"," \"cell_type\": \"markdown\","," \"metadata\": {},"," \"source\": ["," \"# Neural Network Example\\n\","," \"\\n\","," \"Build a 2-hidden layers fully connected neural network (a.k.a multilayer perceptron) with TensorFlow v2.\\n\","," \"\\n\","," \"This example is using a low-level approach to better understand all mechanics behind building neural networks and the training process.\\n\","," \"\\n\","," \"- Author: Aymeric Damien\\n\","," \"- Project: https://github.com/aymericdamien/TensorFlow-Examples/\""," ]"," },"," {"," \"cell_type\": \"markdown\","," \"metadata\": {},"," \"source\": ["," \"## Neural Network Overview\\n\","," \"\\n\","," \"\\n\","," \"\\n\","," \"## MNIST Dataset Overview\\n\","," \"\\n\","," \"This example is using MNIST handwritten digits. The dataset contains 60,000 examples for training and 10,000 examples for testing. The digits have been size-normalized and centered in a fixed-size image (28x28 pixels) with values from 0 to 255. \\n\","," \"\\n\","," \"In this example, each image will be converted to float32, normalized to [0, 1] and flattened to a 1-D array of 784 features (28*28).\\n\","," \"\\n\","," \"![MNIST Dataset](http://neuralnetworksanddeeplearning.com/images/mnist_100_digits.png)\\n\","," \"\\n\","," \"More info: http://yann.lecun.com/exdb/mnist/\""," ]"," },"," {"," \"cell_type\": \"code\","," \"execution_count\": 1,"," \"metadata\": {},"," \"outputs\": [],"," \"source\": ["," \"from __future__ import absolute_import, division, print_function\\n\","," \"\\n\","," \"import tensorflow as tf\\n\","," \"import numpy as np\""," ]"," },"," {"," \"cell_type\": \"code\","," \"execution_count\": 2,"," \"metadata\": {},"," \"outputs\": [],"," \"source\": ["," \"# MNIST dataset parameters.\\n\","," \"num_classes = 10 # total classes (0-9 digits).\\n\","," \"num_features = 784 # data features (img shape: 28*28).\\n\","," \"\\n\","," \"# Training parameters.\\n\","," \"learning_rate = 0.001\\n\","," \"training_steps = 3000\\n\","," \"batch_size = 256\\n\","," \"display_step = 100\\n\","," \"\\n\","," \"# Network parameters.\\n\","," \"n_hidden_1 = 128 # 1st layer number of neurons.\\n\","," \"n_hidden_2 = 256 # 2nd layer number of neurons.\""," ]"," },"," {"," \"cell_type\": \"code\","," \"execution_count\": 3,"," \"metadata\": {},"," \"outputs\": [],"," \"source\": ["," \"# Prepare MNIST data.\\n\","," \"from tensorflow.keras.datasets import mnist\\n\","," \"(x_train, y_train), (x_test, y_test) = mnist.load_data()\\n\","," \"# Convert to float32.\\n\","," \"x_train, x_test = np.array(x_train, np.float32), np.array(x_test, np.float32)\\n\","," \"# Flatten images to 1-D vector of 784 features (28*28).\\n\","," \"x_train, x_test = x_train.reshape([-1, num_features]), x_test.reshape([-1, num_features])\\n\","," \"# Normalize images value from [0, 255] to [0, 1].\\n\","," \"x_train, x_test = x_train / 255., x_test / 255.\""," ]"," },"," {"," \"cell_type\": \"code\","," \"execution_count\": 4,"," \"metadata\": {},"," \"outputs\": [],"," \"source\": ["," \"# Use tf.data API to shuffle and batch data.\\n\","," \"train_data = tf.data.Dataset.from_tensor_slices((x_train, y_train))\\n\","," \"train_data = train_data.repeat().shuffle(5000).batch(batch_size).prefetch(1)\""," ]"," },"," {"," \"cell_type\": \"code\","," \"execution_count\": 5,"," \"metadata\": {},"," \"outputs\": [],"," \"source\": ["," \"# Store layers weight & bias\\n\","," \"\\n\","," \"# A random value generator to initialize weights.\\n\","," \"random_normal = tf.initializers.RandomNormal()\\n\","," \"\\n\","," \"weights = {\\n\","," \" 'h1': tf.Variable(random_normal([num_features, n_hidden_1])),\\n\","," \" 'h2': tf.Variable(random_normal([n_hidden_1, n_hidden_2])),\\n\","," \" 'out': tf.Variable(random_normal([n_hidden_2, num_classes]))\\n\","," \"}\\n\","," \"biases = {\\n\","," \" 'b1': tf.Variable(tf.zeros([n_hidden_1])),\\n\","," \" 'b2': tf.Variable(tf.zeros([n_hidden_2])),\\n\","," \" 'out': tf.Variable(tf.zeros([num_classes]))\\n\","," \"}\""," ]"," },"," {"," \"cell_type\": \"code\","," \"execution_count\": 6,"," \"metadata\": {},"," \"outputs\": [],"," \"source\": ["," \"# Create model.\\n\","," \"def neural_net(x):\\n\","," \" # Hidden fully connected layer with 128 neurons.\\n\","," \" layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1'])\\n\","," \" # Apply sigmoid to layer_1 output for non-linearity.\\n\","," \" layer_1 = tf.nn.sigmoid(layer_1)\\n\","," \" \\n\","," \" # Hidden fully connected layer with 256 neurons.\\n\","," \" layer_2 = tf.add(tf.matmul(layer_1, weights['h2']), biases['b2'])\\n\","," \" # Apply sigmoid to layer_2 output for non-linearity.\\n\","," \" layer_2 = tf.nn.sigmoid(layer_2)\\n\","," \" \\n\","," \" # Output fully connected layer with a neuron for each class.\\n\","," \" out_layer = tf.matmul(layer_2, weights['out']) + biases['out']\\n\","," \" # Apply softmax to normalize the logits to a probability distribution.\\n\","," \" return tf.nn.softmax(out_layer)\""," ]"," },"," {"," \"cell_type\": \"code\","," \"execution_count\": 7,"," \"metadata\": {},"," \"outputs\": [],"," \"source\": ["," \"# Cross-Entropy loss function.\\n\","," \"def cross_entropy(y_pred, y_true):\\n\","," \" # Encode label to a one hot vector.\\n\","," \" y_true = tf.one_hot(y_true, depth=num_classes)\\n\","," \" # Clip prediction values to avoid log(0) error.\\n\","," \" y_pred = tf.clip_by_value(y_pred, 1e-9, 1.)\\n\","," \" # Compute cross-entropy.\\n\","," \" return tf.reduce_mean(-tf.reduce_sum(y_true * tf.math.log(y_pred)))\\n\","," \"\\n\","," \"# Accuracy metric.\\n\","," \"def accuracy(y_pred, y_true):\\n\","," \" # Predicted class is the index of highest score in prediction vector (i.e. argmax).\\n\","," \" correct_prediction = tf.equal(tf.argmax(y_pred, 1), tf.cast(y_true, tf.int64))\\n\","," \" return tf.reduce_mean(tf.cast(correct_prediction, tf.float32), axis=-1)\\n\","," \"\\n\","," \"# Stochastic gradient descent optimizer.\\n\","," \"optimizer = tf.optimizers.SGD(learning_rate)\""," ]"," },"," {"," \"cell_type\": \"code\","," \"execution_count\": 8,"," \"metadata\": {},"," \"outputs\": [],"," \"source\": ["," \"# Optimization process. \\n\","," \"def run_optimization(x, y):\\n\","," \" # Wrap computation inside a GradientTape for automatic differentiation.\\n\","," \" with tf.GradientTape() as g:\\n\","," \" pred = neural_net(x)\\n\","," \" loss = cross_entropy(pred, y)\\n\","," \" \\n\","," \" # Variables to update, i.e. trainable variables.\\n\","," \" trainable_variables = list(weights.values()) + list(biases.values())\\n\","," \"\\n\","," \" # Compute gradients.\\n\","," \" gradients = g.gradient(loss, trainable_variables)\\n\","," \" \\n\","," \" # Update W and b following gradients.\\n\","," \" optimizer.apply_gradients(zip(gradients, trainable_variables))\""," ]"," },"," {"," \"cell_type\": \"code\","," \"execution_count\": 9,"," \"metadata\": {},"," \"outputs\": ["," {"," \"name\": \"stdout\","," \"output_type\": \"stream\","," \"text\": ["," \"step: 100, loss: 571.445923, accuracy: 0.222656\\n\","," \"step: 200, loss: 405.567535, accuracy: 0.488281\\n\","," \"step: 300, loss: 252.089172, accuracy: 0.660156\\n\","," \"step: 400, loss: 192.252136, accuracy: 0.792969\\n\","," \"step: 500, loss: 129.173553, accuracy: 0.855469\\n\","," \"step: 600, loss: 125.191071, accuracy: 0.859375\\n\","," \"step: 700, loss: 103.346634, accuracy: 0.890625\\n\","," \"step: 800, loss: 120.199402, accuracy: 0.871094\\n\","," \"step: 900, loss: 95.674088, accuracy: 0.890625\\n\","," \"step: 1000, loss: 113.775406, accuracy: 0.878906\\n\","," \"step: 1100, loss: 68.457413, accuracy: 0.941406\\n\","," \"step: 1200, loss: 80.773163, accuracy: 0.914062\\n\","," \"step: 1300, loss: 85.862785, accuracy: 0.902344\\n\","," \"step: 1400, loss: 63.480415, accuracy: 0.949219\\n\","," \"step: 1500, loss: 77.139435, accuracy: 0.910156\\n\","," \"step: 1600, loss: 88.129692, accuracy: 0.933594\\n\","," \"step: 1700, loss: 92.199730, accuracy: 0.906250\\n\","," \"step: 1800, loss: 90.150421, accuracy: 0.886719\\n\","," \"step: 1900, loss: 48.567772, accuracy: 0.949219\\n\","," \"step: 2000, loss: 54.002838, accuracy: 0.941406\\n\","," \"step: 2100, loss: 58.536209, accuracy: 0.933594\\n\","," \"step: 2200, loss: 47.156784, accuracy: 0.949219\\n\","," \"step: 2300, loss: 55.344498, accuracy: 0.949219\\n\","," \"step: 2400, loss: 70.956612, accuracy: 0.925781\\n\","," \"step: 2500, loss: 76.179062, accuracy: 0.917969\\n\","," \"step: 2600, loss: 44.956696, accuracy: 0.929688\\n\","," \"step: 2700, loss: 56.581280, accuracy: 0.941406\\n\","," \"step: 2800, loss: 57.775612, accuracy: 0.937500\\n\","," \"step: 2900, loss: 46.005424, accuracy: 0.960938\\n\","," \"step: 3000, loss: 51.832504, accuracy: 0.953125\\n\""," ]"," }"," ],"," \"source\": ["," \"# Run training for the given number of steps.\\n\","," \"for step, (batch_x, batch_y) in enumerate(train_data.take(training_steps), 1):\\n\","," \" # Run the optimization to update W and b values.\\n\","," \" run_optimization(batch_x, batch_y)\\n\","," \" \\n\","," \" if step % display_step == 0:\\n\","," \" pred = neural_net(batch_x)\\n\","," \" loss = cross_entropy(pred, batch_y)\\n\","," \" acc = accuracy(pred, batch_y)\\n\","," \" print(\\\"step: %i, loss: %f, accuracy: %f\\\" % (step, loss, acc))\""," ]"," },"," {"," \"cell_type\": \"code\","," \"execution_count\": 10,"," \"metadata\": {},"," \"outputs\": ["," {"," \"name\": \"stdout\","," \"output_type\": \"stream\","," \"text\": ["," \"Test Accuracy: 0.937600\\n\""," ]"," }"," ],"," \"source\": ["," \"# Test model on validation set.\\n\","," \"pred = neural_net(x_test)\\n\","," \"print(\\\"Test Accuracy: %f\\\" % accuracy(pred, y_test))\""," ]"," },"," {"," \"cell_type\": \"code\","," \"execution_count\": 11,"," \"metadata\": {},"," \"outputs\": [],"," \"source\": ["," \"# Visualize predictions.\\n\","," \"import matplotlib.pyplot as plt\""," ]"," },"," {"," \"cell_type\": \"code\","," \"execution_count\": 12,"," \"metadata\": {},"," \"outputs\": ["," {"," \"data\": {"," \"image/png\": \"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\\n\","," \"text/plain\": ["," \"