Created
December 19, 2018 13:34
-
-
Save jenyckee/c8090ad2d7639bd54f8ca4238aeb5985 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
"""This file contains all the model information: the training steps, the batch size and the model iself.""" | |
import tensorflow as tf | |
def get_training_steps(): | |
"""Returns the number of batches that will be used to train your solution. | |
It is recommended to change this value.""" | |
return 50 | |
def get_batch_size(): | |
"""Returns the batch size that will be used by your solution. | |
It is recommended to change this value.""" | |
return 20 | |
def solution(features, labels, mode): | |
"""Returns an EstimatorSpec that is constructed using the solution that you have to write below.""" | |
# Input Layer (a batch of images that have 64x64 pixels and are RGB colored (3) | |
input_layer = tf.reshape(features["x"], [-1, 64, 64, 3]) | |
# TODO: Code of your solution | |
# Convolutional Layer #1 | |
conv1 = tf.layers.conv2d( | |
inputs=input_layer, | |
filters=32, | |
kernel_size=[5, 5], | |
padding="same", | |
activation=tf.nn.relu) | |
# Pooling Layer #1 | |
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2) | |
# Convolutional Layer #2 and Pooling Layer #2 | |
conv2 = tf.layers.conv2d( | |
inputs=pool1, | |
filters=64, | |
kernel_size=[5, 5], | |
padding="same", | |
activation=tf.nn.relu) | |
pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2) | |
# Dense Layer | |
pool2_flat = tf.reshape(pool2, [-1, 8 * 8 * 64]) | |
dense = tf.layers.dense(inputs=pool2_flat, units=1024, activation=tf.nn.relu) | |
dropout = tf.layers.dropout( | |
inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN) | |
# Logits Layer | |
logits = tf.layers.dense(inputs=dropout, units=4) | |
predictions = { | |
# Generate predictions (for PREDICT and EVAL mode) | |
"classes": tf.argmax(input=logits, axis=1), | |
# Add `softmax_tensor` to the graph. It is used for PREDICT and by the | |
# `logging_hook`. | |
"probabilities": tf.nn.softmax(logits, name="softmax_tensor") | |
} | |
if mode == tf.estimator.ModeKeys.PREDICT: | |
# TODO: return tf.estimator.EstimatorSpec with prediction values of all classes | |
return tf.estimator.EstimatorSpec(mode, predictions=predictions) | |
# Calculate Loss (for both TRAIN and EVAL modes) | |
loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits) | |
if mode == tf.estimator.ModeKeys.TRAIN: | |
# TODO: Let the model train here | |
# TODO: return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op) | |
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001) | |
train_op = optimizer.minimize( | |
loss=loss, | |
global_step=tf.train.get_global_step()) | |
return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op) | |
if mode == tf.estimator.ModeKeys.EVAL: | |
# The classes variable below exists of an tensor that contains all the predicted classes in a batch | |
# TODO: eval_metric_ops = {"accuracy": tf.metrics.accuracy(labels=labels, predictions=classes)} | |
# TODO: return tf.estimator.EstimatorSpec(mode=mode, loss=loss, eval_metric_ops=eval_metric_ops) | |
eval_metric_ops = { | |
"accuracy": tf.metrics.accuracy( | |
labels=labels, predictions=predictions["classes"])} | |
return tf.estimator.EstimatorSpec( | |
mode=mode, loss=loss, eval_metric_ops=eval_metric_ops) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment