Skip to content

Instantly share code, notes, and snippets.

@hereismari
Created September 26, 2018 13:16
Show Gist options
  • Save hereismari/4778383969d647a794afdf02c1218f30 to your computer and use it in GitHub Desktop.
Save hereismari/4778383969d647a794afdf02c1218f30 to your computer and use it in GitHub Desktop.
simple satellite image classifier
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Satellite image classification\n",
"\n",
"We'll use the [SAT-6 airbone dataset](http://csc.lsu.edu/~saikat/deepsat/). Datasets actually downloaded from the [Kaggle Challenge](https://www.kaggle.com/kmader/deepsat-overview).\n",
"\n",
"![](http://csc.lsu.edu/~saikat/deepsat/images/sat_img.png)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"## Dependencies\n",
"import os\n",
"import numpy as np\n",
"import pandas as pd\n",
"\n",
"import scipy.io\n",
"import tensorflow as tf\n",
"\n",
"import tensorflow.keras as keras\n",
"from tensorflow.keras.callbacks import TensorBoard\n",
"from tensorflow.keras.layers import Conv2D, MaxPool2D, Dense, Dropout, Flatten\n",
"from tensorflow.keras.models import Sequential\n",
"\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Loading data"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def load_data(filepath, nrows=None):\n",
" if os.path.splitext(os.path.basename(filepath))[1] == '.mat':\n",
" mat = scipy.io.loadmat(FILE_PATH) # this is a dictionary\n",
" return mat['train_x'], mat['test_x'], mat['train_y'], mat['test_y']\n",
" else:\n",
" return pd.read_csv(filepath, header=None, nrows=nrows).values"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# This image format is called NHWC, and it works on both CPU and GPU\n",
"# if a GPU is available probably you want to use NCHW that can speedup a little things :)\n",
"train_x = load_data('SAT/X_train_sat6.csv', nrows=200000).reshape(-1, 28, 28, 4)\n",
"train_y = load_data('SAT/y_train_sat6.csv', nrows=200000).astype(np.float32)\n",
"test_x = load_data('SAT/X_test_sat6.csv').clip(0, 255).reshape(-1, 28, 28, 4).astype(np.uint8)\n",
"test_y = load_data('SAT/y_test_sat6.csv').astype(np.float32)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train data shape: (200000, 28, 28, 4) Train labels shape: (200000, 6)\n",
"Test data shape: (81000, 28, 28, 4) Test labels shape: (81000, 6)\n"
]
}
],
"source": [
"print ('Train data shape:', train_x.shape, 'Train labels shape:', train_y.shape)\n",
"print ('Test data shape:', test_x.shape, 'Test labels shape:', test_y.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Visualizing images"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We have 200000 images (28x28x4), and 6 classes. Let's have a look on a couple of these images."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"def plot_images(data_x, data_y, num_images=16):\n",
" data_x = data_x[:num_images]\n",
" data_y = data_y[:num_images]\n",
"\n",
" fig, m_axs = plt.subplots(4, data_x.shape[0]//4, figsize = (12, 12))\n",
" for (x, y, c_ax) in zip(data_x, data_y, m_axs.flatten()):\n",
" c_ax.imshow(x[:,:,:3], # since we don't want NIR in the display\n",
" interpolation = 'none')\n",
" c_ax.axis('off')\n",
" c_ax.set_title('Category: {}'.format(y))"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x864 with 16 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_images(train_x, train_y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### [Keras model](https://www.kaggle.com/bhumitadivarekar/simple-keras-cnn-with-95-13-accuracy/code)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"# Create our model\n",
"tf.reset_default_graph()\n",
"\n",
"model = Sequential()\n",
"model.add(Conv2D(16, (3, 3), activation='relu', input_shape=(28, 28, 4)))\n",
"model.add(Conv2D(32, (3, 3), activation='relu'))\n",
"model.add(MaxPool2D(pool_size=(2,2)))\n",
"model.add(Dropout(0.5)) # regularization\n",
"model.add(Conv2D(32, (3, 3), activation='relu'))\n",
"model.add(Conv2D(64, (3, 3), activation='relu'))\n",
"model.add(MaxPool2D(pool_size=(2, 2)))\n",
"model.add(Dropout(0.5))\n",
"model.add(Flatten())\n",
"model.add(Dense(128, activation='relu'))\n",
"model.add(Dropout(0.5))\n",
"model.add(Dense(6, activation='softmax'))\n",
"\n",
"model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"conv2d (Conv2D) (None, 26, 26, 16) 592 \n",
"_________________________________________________________________\n",
"conv2d_1 (Conv2D) (None, 24, 24, 32) 4640 \n",
"_________________________________________________________________\n",
"max_pooling2d (MaxPooling2D) (None, 12, 12, 32) 0 \n",
"_________________________________________________________________\n",
"dropout (Dropout) (None, 12, 12, 32) 0 \n",
"_________________________________________________________________\n",
"conv2d_2 (Conv2D) (None, 10, 10, 32) 9248 \n",
"_________________________________________________________________\n",
"conv2d_3 (Conv2D) (None, 8, 8, 64) 18496 \n",
"_________________________________________________________________\n",
"max_pooling2d_1 (MaxPooling2 (None, 4, 4, 64) 0 \n",
"_________________________________________________________________\n",
"dropout_1 (Dropout) (None, 4, 4, 64) 0 \n",
"_________________________________________________________________\n",
"flatten (Flatten) (None, 1024) 0 \n",
"_________________________________________________________________\n",
"dense (Dense) (None, 128) 131200 \n",
"_________________________________________________________________\n",
"dropout_2 (Dropout) (None, 128) 0 \n",
"_________________________________________________________________\n",
"dense_1 (Dense) (None, 6) 774 \n",
"=================================================================\n",
"Total params: 164,950\n",
"Trainable params: 164,950\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
]
}
],
"source": [
"model.summary()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train on 160000 samples, validate on 40000 samples\n",
"Epoch 1/6\n",
"160000/160000 [==============================] - 46s 289us/step - loss: 0.8474 - acc: 0.8853 - val_loss: 0.1128 - val_acc: 0.9576\n",
"Epoch 2/6\n",
"160000/160000 [==============================] - 38s 236us/step - loss: 0.1225 - acc: 0.9540 - val_loss: 0.1103 - val_acc: 0.9625\n",
"Epoch 3/6\n",
"160000/160000 [==============================] - 38s 235us/step - loss: 0.1020 - acc: 0.9629 - val_loss: 0.1610 - val_acc: 0.9305\n",
"Epoch 4/6\n",
"160000/160000 [==============================] - 38s 236us/step - loss: 0.0944 - acc: 0.9667 - val_loss: 0.1703 - val_acc: 0.9278\n",
"Epoch 5/6\n",
"160000/160000 [==============================] - 37s 230us/step - loss: 0.0809 - acc: 0.9713 - val_loss: 0.2176 - val_acc: 0.8487\n",
"Epoch 6/6\n",
"160000/160000 [==============================] - 38s 235us/step - loss: 0.0708 - acc: 0.9745 - val_loss: 0.4594 - val_acc: 0.8183\n"
]
},
{
"data": {
"text/plain": [
"<tensorflow.python.keras.callbacks.History at 0x7fca7b592160>"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tbcallback = TensorBoard(log_dir='tensorboard_keras/', histogram_freq=1, write_graph=True)\n",
"\n",
"model.fit(train_x, train_y, batch_size=216, epochs=6, verbose=1,\n",
" validation_split=0.2, callbacks=[tbcallback])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### [Estimators model](https://www.kaggle.com/bhumitadivarekar/simple-keras-cnn-with-95-13-accuracy/code)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"def model_fn(features, labels, mode, params, config):\n",
" # Input Layer\n",
" input_layer = tf.reshape(features[\"x\"], [-1, 28, 28, 4])\n",
" # tf.summary.image('input_layer',input_layer)\n",
"\n",
" # First Convolutional Layer\n",
" conv1 = tf.layers.conv2d(inputs=input_layer,\n",
" filters=32,\n",
" kernel_size=[5,5],\n",
" padding='same',\n",
" activation=tf.nn.relu)\n",
"\n",
" # First MaxPool Layer\n",
" pool1 = tf.layers.max_pooling2d(inputs=conv1, \n",
" pool_size=[2,2], \n",
" strides=2)\n",
"\n",
" # Second Convolutional Layer\n",
" conv2 = tf.layers.conv2d(inputs=pool1,\n",
" filters=64,\n",
" kernel_size=[5,5],\n",
" padding='same',\n",
" activation=tf.nn.relu)\n",
"\n",
" # Second MaxPool Layer\n",
" pool2 = tf.layers.max_pooling2d(inputs=conv2, \n",
" pool_size=[2, 2],\n",
" strides=2)\n",
" \n",
" # Flatten Pool2\n",
" pool2_flat = tf.reshape(pool2, [-1, pool2.shape[1] * pool2.shape[2] * pool2.shape[3]])\n",
"\n",
" # First Dense Layer\n",
" dense1 = tf.layers.dense(inputs=pool2_flat,\n",
" units=1024,\n",
" activation=tf.nn.relu)\n",
"\n",
" # Dropout Layer for Training\n",
" dropout = tf.layers.dropout(inputs=dense1,\n",
" rate=0.5,\n",
" training=mode == tf.estimator.ModeKeys.TRAIN)\n",
"\n",
" # Second Dense Layer\n",
" dense2 = tf.layers.dense(inputs=dropout,\n",
" units=256,\n",
" activation=tf.nn.relu)\n",
"\n",
" # Output Layer\n",
" logits = tf.layers.dense(inputs=dense2, units=labels.shape[1])\n",
"\n",
" predictions = {\n",
" \"classes\": tf.argmax(input=logits, axis=1), # Result Classes\n",
" \"probabilities\": tf.nn.softmax(logits, name=\"softmax_tensor\") # Class Probabilities\n",
" }\n",
"\n",
" # Predict Mode\n",
" if mode == tf.estimator.ModeKeys.PREDICT:\n",
" return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)\n",
"\n",
" # Loss Function\n",
" loss = tf.losses.softmax_cross_entropy(onehot_labels=labels,\n",
" logits=logits)\n",
"\n",
" ## Classification Metrics\n",
" # accuracy\n",
" acc = tf.metrics.accuracy(labels=tf.argmax(labels,1),\n",
" predictions=predictions['classes'])\n",
"\n",
" # Precision\n",
" prec = tf.metrics.precision(labels=tf.argmax(labels,1),\n",
" predictions=predictions['classes'])\n",
"\n",
" # Recall\n",
" rec = tf.metrics.recall(labels=tf.argmax(labels,1),\n",
" predictions=predictions['classes'])\n",
"\n",
" # F1 Score\n",
" f1 = 2 * acc[1] * rec[1] / ( prec[1] + rec[1] ) # misssing op -> too lazy to create ;)\n",
"\n",
" #TensorBoard Summary\n",
" tf.summary.scalar('Accuracy', acc[1])\n",
" tf.summary.scalar('Precision', prec[1])\n",
" tf.summary.scalar('Recall', rec[1])\n",
" tf.summary.scalar('F1Score', f1)\n",
" tf.summary.histogram('Probabilities', predictions['probabilities'])\n",
" tf.summary.histogram('Classes', predictions['classes'])\n",
"\n",
" summary_hook = tf.train.SummarySaverHook(summary_op=tf.summary.merge_all(),\n",
" save_steps=1)\n",
"\n",
" # Learning Rate Decay (Exponential)\n",
" learning_rate = tf.train.exponential_decay(learning_rate=1e-04,\n",
" global_step=tf.train.get_global_step(),\n",
" decay_steps=10000, \n",
" decay_rate=0.96, \n",
" staircase=True,\n",
" name='lr_exp_decay')\n",
"\n",
" \n",
" # Training Mode (Adam Optimizer)\n",
" if mode == tf.estimator.ModeKeys.TRAIN:\n",
" optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)\n",
" train_op = optimizer.minimize(loss=loss,\n",
" global_step=tf.train.get_global_step())\n",
" return tf.estimator.EstimatorSpec(mode=mode, \n",
" loss=loss, \n",
" train_op=train_op)\n",
" #training_hooks=[summary_hook])\n",
"\n",
" # Evaluation Metrics\n",
" eval_metric_ops = {\n",
" \"Accuracy\": acc,\n",
" \"Precision\": prec,\n",
" \"Recall\": rec,\n",
" }\n",
" \n",
" # Evaluation Mode\n",
" return tf.estimator.EstimatorSpec(mode=mode, \n",
" loss=loss, \n",
" eval_metric_ops=eval_metric_ops)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"INFO:tensorflow:Using config: {'_model_dir': 'tensorboard_estimators/', '_tf_random_seed': None, '_save_summary_steps': 1, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x7fca7c479240>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}\n",
"WARNING:tensorflow:Estimator's model_fn (<function model_fn at 0x7fca7c439f28>) includes params argument, but params are not passed to Estimator.\n"
]
}
],
"source": [
"# Create Custom Classifier\n",
"sat6_classifier = tf.estimator.Estimator(model_fn=model_fn,\n",
" model_dir='tensorboard_estimators/',\n",
" config=tf.estimator.RunConfig(save_summary_steps=1))\n",
"\n",
"\n",
"# This will create a lot of output ;)\n",
"tensors_to_log = {\"probabilities\": \"softmax_tensor\"}\n",
"logging_hook = tf.train.LoggingTensorHook(tensors=tensors_to_log, \n",
" every_n_iter=1)\n",
"\n",
"# Training input function\n",
"train_input_fn = tf.estimator.inputs.numpy_input_fn(x={\"x\": train_x.astype(np.float32)},\n",
" y=train_y,\n",
" batch_size=512,\n",
" num_epochs=1,\n",
" shuffle=True)\n",
"# Evaluation input function\n",
"eval_input_fn = tf.estimator.inputs.numpy_input_fn(x={\"x\": test_x.astype(np.float32)},\n",
" y=test_y,\n",
" num_epochs=1,\n",
" shuffle=False)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"INFO:tensorflow:Calling model_fn.\n",
"INFO:tensorflow:Done calling model_fn.\n",
"INFO:tensorflow:Create CheckpointSaverHook.\n",
"INFO:tensorflow:Graph was finalized.\n",
"INFO:tensorflow:Running local_init_op.\n",
"INFO:tensorflow:Done running local_init_op.\n",
"INFO:tensorflow:Saving checkpoints for 0 into tensorboard_estimators/model.ckpt.\n",
"INFO:tensorflow:loss = 53.91294, step = 0\n",
"INFO:tensorflow:global_step/sec: 31.0976\n",
"INFO:tensorflow:loss = 0.4947251, step = 100 (3.216 sec)\n",
"INFO:tensorflow:global_step/sec: 30.2183\n",
"INFO:tensorflow:loss = 0.2848094, step = 200 (3.309 sec)\n",
"INFO:tensorflow:global_step/sec: 30.541\n",
"INFO:tensorflow:loss = 0.11197692, step = 300 (3.274 sec)\n",
"INFO:tensorflow:Saving checkpoints for 391 into tensorboard_estimators/model.ckpt.\n",
"INFO:tensorflow:Loss for final step: 0.19659443.\n",
"INFO:tensorflow:Calling model_fn.\n",
"INFO:tensorflow:Done calling model_fn.\n",
"INFO:tensorflow:Starting evaluation at 2018-09-26-13:12:25\n",
"INFO:tensorflow:Graph was finalized.\n",
"INFO:tensorflow:Restoring parameters from tensorboard_estimators/model.ckpt-391\n",
"INFO:tensorflow:Running local_init_op.\n",
"INFO:tensorflow:Done running local_init_op.\n",
"INFO:tensorflow:Finished evaluation at 2018-09-26-13:12:28\n",
"INFO:tensorflow:Saving dict for global step 391: Accuracy = 0.95758027, Precision = 0.9978517, Recall = 0.9916544, global_step = 391, loss = 0.10499477\n",
"INFO:tensorflow:Saving 'checkpoint_path' summary for global step 391: tensorboard_estimators/model.ckpt-391\n",
"INFO:tensorflow:Calling model_fn.\n",
"INFO:tensorflow:Done calling model_fn.\n",
"INFO:tensorflow:Create CheckpointSaverHook.\n",
"INFO:tensorflow:Graph was finalized.\n",
"INFO:tensorflow:Restoring parameters from tensorboard_estimators/model.ckpt-391\n",
"INFO:tensorflow:Running local_init_op.\n",
"INFO:tensorflow:Done running local_init_op.\n",
"INFO:tensorflow:Saving checkpoints for 391 into tensorboard_estimators/model.ckpt.\n",
"INFO:tensorflow:loss = 0.15981801, step = 391\n",
"INFO:tensorflow:global_step/sec: 29.8136\n",
"INFO:tensorflow:loss = 0.12778878, step = 491 (3.355 sec)\n",
"INFO:tensorflow:global_step/sec: 29.7642\n",
"INFO:tensorflow:loss = 0.14848973, step = 591 (3.359 sec)\n",
"INFO:tensorflow:global_step/sec: 29.514\n",
"INFO:tensorflow:loss = 0.119710535, step = 691 (3.388 sec)\n",
"INFO:tensorflow:Saving checkpoints for 782 into tensorboard_estimators/model.ckpt.\n",
"INFO:tensorflow:Loss for final step: 0.098422214.\n",
"INFO:tensorflow:Calling model_fn.\n",
"INFO:tensorflow:Done calling model_fn.\n",
"INFO:tensorflow:Starting evaluation at 2018-09-26-13:12:43\n",
"INFO:tensorflow:Graph was finalized.\n",
"INFO:tensorflow:Restoring parameters from tensorboard_estimators/model.ckpt-782\n",
"INFO:tensorflow:Running local_init_op.\n",
"INFO:tensorflow:Done running local_init_op.\n",
"INFO:tensorflow:Finished evaluation at 2018-09-26-13:12:47\n",
"INFO:tensorflow:Saving dict for global step 782: Accuracy = 0.96540743, Precision = 0.9951719, Recall = 0.997451, global_step = 782, loss = 0.089782625\n",
"INFO:tensorflow:Saving 'checkpoint_path' summary for global step 782: tensorboard_estimators/model.ckpt-782\n",
"INFO:tensorflow:Calling model_fn.\n",
"INFO:tensorflow:Done calling model_fn.\n",
"INFO:tensorflow:Create CheckpointSaverHook.\n",
"INFO:tensorflow:Graph was finalized.\n",
"INFO:tensorflow:Restoring parameters from tensorboard_estimators/model.ckpt-782\n",
"INFO:tensorflow:Running local_init_op.\n",
"INFO:tensorflow:Done running local_init_op.\n",
"INFO:tensorflow:Saving checkpoints for 782 into tensorboard_estimators/model.ckpt.\n",
"INFO:tensorflow:loss = 0.13617922, step = 782\n",
"INFO:tensorflow:global_step/sec: 28.5721\n",
"INFO:tensorflow:loss = 0.09131511, step = 882 (3.501 sec)\n",
"INFO:tensorflow:global_step/sec: 29.2682\n",
"INFO:tensorflow:loss = 0.103376426, step = 982 (3.417 sec)\n",
"INFO:tensorflow:global_step/sec: 29.9655\n",
"INFO:tensorflow:loss = 0.10884288, step = 1082 (3.337 sec)\n",
"INFO:tensorflow:Saving checkpoints for 1173 into tensorboard_estimators/model.ckpt.\n",
"INFO:tensorflow:Loss for final step: 0.10623576.\n",
"INFO:tensorflow:Calling model_fn.\n",
"INFO:tensorflow:Done calling model_fn.\n",
"INFO:tensorflow:Starting evaluation at 2018-09-26-13:13:01\n",
"INFO:tensorflow:Graph was finalized.\n",
"INFO:tensorflow:Restoring parameters from tensorboard_estimators/model.ckpt-1173\n",
"INFO:tensorflow:Running local_init_op.\n",
"INFO:tensorflow:Done running local_init_op.\n",
"INFO:tensorflow:Finished evaluation at 2018-09-26-13:13:05\n",
"INFO:tensorflow:Saving dict for global step 1173: Accuracy = 0.9692716, Precision = 0.9987024, Recall = 0.9958725, global_step = 1173, loss = 0.07666169\n",
"INFO:tensorflow:Saving 'checkpoint_path' summary for global step 1173: tensorboard_estimators/model.ckpt-1173\n",
"INFO:tensorflow:Calling model_fn.\n",
"INFO:tensorflow:Done calling model_fn.\n",
"INFO:tensorflow:Create CheckpointSaverHook.\n",
"INFO:tensorflow:Graph was finalized.\n",
"INFO:tensorflow:Restoring parameters from tensorboard_estimators/model.ckpt-1173\n",
"INFO:tensorflow:Running local_init_op.\n",
"INFO:tensorflow:Done running local_init_op.\n",
"INFO:tensorflow:Saving checkpoints for 1173 into tensorboard_estimators/model.ckpt.\n",
"INFO:tensorflow:loss = 0.06539459, step = 1173\n",
"INFO:tensorflow:global_step/sec: 31.0342\n",
"INFO:tensorflow:loss = 0.109894186, step = 1273 (3.223 sec)\n",
"INFO:tensorflow:global_step/sec: 31.7285\n",
"INFO:tensorflow:loss = 0.12242646, step = 1373 (3.152 sec)\n",
"INFO:tensorflow:global_step/sec: 31.6698\n",
"INFO:tensorflow:loss = 0.09273886, step = 1473 (3.157 sec)\n",
"INFO:tensorflow:Saving checkpoints for 1564 into tensorboard_estimators/model.ckpt.\n",
"INFO:tensorflow:Loss for final step: 0.118054055.\n",
"INFO:tensorflow:Calling model_fn.\n",
"INFO:tensorflow:Done calling model_fn.\n",
"INFO:tensorflow:Starting evaluation at 2018-09-26-13:13:18\n",
"INFO:tensorflow:Graph was finalized.\n",
"INFO:tensorflow:Restoring parameters from tensorboard_estimators/model.ckpt-1564\n",
"INFO:tensorflow:Running local_init_op.\n",
"INFO:tensorflow:Done running local_init_op.\n",
"INFO:tensorflow:Finished evaluation at 2018-09-26-13:13:22\n",
"INFO:tensorflow:Saving dict for global step 1564: Accuracy = 0.9728642, Precision = 0.99866515, Recall = 0.99708873, global_step = 1564, loss = 0.068631776\n",
"INFO:tensorflow:Saving 'checkpoint_path' summary for global step 1564: tensorboard_estimators/model.ckpt-1564\n",
"INFO:tensorflow:Calling model_fn.\n",
"INFO:tensorflow:Done calling model_fn.\n",
"INFO:tensorflow:Create CheckpointSaverHook.\n",
"INFO:tensorflow:Graph was finalized.\n",
"INFO:tensorflow:Restoring parameters from tensorboard_estimators/model.ckpt-1564\n",
"INFO:tensorflow:Running local_init_op.\n",
"INFO:tensorflow:Done running local_init_op.\n",
"INFO:tensorflow:Saving checkpoints for 1564 into tensorboard_estimators/model.ckpt.\n",
"INFO:tensorflow:loss = 0.06938286, step = 1564\n",
"INFO:tensorflow:global_step/sec: 30.9535\n",
"INFO:tensorflow:loss = 0.11954371, step = 1664 (3.231 sec)\n",
"INFO:tensorflow:global_step/sec: 31.7444\n",
"INFO:tensorflow:loss = 0.11116797, step = 1764 (3.152 sec)\n",
"INFO:tensorflow:global_step/sec: 31.5922\n",
"INFO:tensorflow:loss = 0.10316214, step = 1864 (3.163 sec)\n",
"INFO:tensorflow:Saving checkpoints for 1955 into tensorboard_estimators/model.ckpt.\n",
"INFO:tensorflow:Loss for final step: 0.05854837.\n",
"INFO:tensorflow:Calling model_fn.\n",
"INFO:tensorflow:Done calling model_fn.\n",
"INFO:tensorflow:Starting evaluation at 2018-09-26-13:13:36\n",
"INFO:tensorflow:Graph was finalized.\n",
"INFO:tensorflow:Restoring parameters from tensorboard_estimators/model.ckpt-1955\n",
"INFO:tensorflow:Running local_init_op.\n",
"INFO:tensorflow:Done running local_init_op.\n",
"INFO:tensorflow:Finished evaluation at 2018-09-26-13:13:39\n",
"INFO:tensorflow:Saving dict for global step 1955: Accuracy = 0.9750988, Precision = 0.99924767, Recall = 0.9967911, global_step = 1955, loss = 0.065600246\n",
"INFO:tensorflow:Saving 'checkpoint_path' summary for global step 1955: tensorboard_estimators/model.ckpt-1955\n",
"INFO:tensorflow:Calling model_fn.\n",
"INFO:tensorflow:Done calling model_fn.\n",
"INFO:tensorflow:Create CheckpointSaverHook.\n",
"INFO:tensorflow:Graph was finalized.\n",
"INFO:tensorflow:Restoring parameters from tensorboard_estimators/model.ckpt-1955\n",
"INFO:tensorflow:Running local_init_op.\n",
"INFO:tensorflow:Done running local_init_op.\n",
"INFO:tensorflow:Saving checkpoints for 1955 into tensorboard_estimators/model.ckpt.\n",
"INFO:tensorflow:loss = 0.07925157, step = 1955\n",
"INFO:tensorflow:global_step/sec: 30.415\n",
"INFO:tensorflow:loss = 0.062436722, step = 2055 (3.289 sec)\n",
"INFO:tensorflow:global_step/sec: 31.3649\n",
"INFO:tensorflow:loss = 0.12250227, step = 2155 (3.188 sec)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"INFO:tensorflow:global_step/sec: 30.7427\n",
"INFO:tensorflow:loss = 0.04916078, step = 2255 (3.253 sec)\n",
"INFO:tensorflow:Saving checkpoints for 2346 into tensorboard_estimators/model.ckpt.\n",
"INFO:tensorflow:Loss for final step: 0.1019489.\n",
"INFO:tensorflow:Calling model_fn.\n",
"INFO:tensorflow:Done calling model_fn.\n",
"INFO:tensorflow:Starting evaluation at 2018-09-26-13:13:53\n",
"INFO:tensorflow:Graph was finalized.\n",
"INFO:tensorflow:Restoring parameters from tensorboard_estimators/model.ckpt-2346\n",
"INFO:tensorflow:Running local_init_op.\n",
"INFO:tensorflow:Done running local_init_op.\n",
"INFO:tensorflow:Finished evaluation at 2018-09-26-13:13:57\n",
"INFO:tensorflow:Saving dict for global step 2346: Accuracy = 0.9765062, Precision = 0.9986798, Recall = 0.9983697, global_step = 2346, loss = 0.06288443\n",
"INFO:tensorflow:Saving 'checkpoint_path' summary for global step 2346: tensorboard_estimators/model.ckpt-2346\n",
"INFO:tensorflow:Calling model_fn.\n",
"INFO:tensorflow:Done calling model_fn.\n",
"INFO:tensorflow:Create CheckpointSaverHook.\n",
"INFO:tensorflow:Graph was finalized.\n",
"INFO:tensorflow:Restoring parameters from tensorboard_estimators/model.ckpt-2346\n",
"INFO:tensorflow:Running local_init_op.\n",
"INFO:tensorflow:Done running local_init_op.\n",
"INFO:tensorflow:Saving checkpoints for 2346 into tensorboard_estimators/model.ckpt.\n",
"INFO:tensorflow:loss = 0.09425666, step = 2346\n",
"INFO:tensorflow:global_step/sec: 30.7456\n",
"INFO:tensorflow:loss = 0.08933724, step = 2446 (3.253 sec)\n",
"INFO:tensorflow:global_step/sec: 29.5191\n",
"INFO:tensorflow:loss = 0.07400364, step = 2546 (3.388 sec)\n",
"INFO:tensorflow:global_step/sec: 30.0854\n",
"INFO:tensorflow:loss = 0.08458238, step = 2646 (3.324 sec)\n",
"INFO:tensorflow:Saving checkpoints for 2737 into tensorboard_estimators/model.ckpt.\n",
"INFO:tensorflow:Loss for final step: 0.06881102.\n",
"INFO:tensorflow:Calling model_fn.\n",
"INFO:tensorflow:Done calling model_fn.\n",
"INFO:tensorflow:Starting evaluation at 2018-09-26-13:14:11\n",
"INFO:tensorflow:Graph was finalized.\n",
"INFO:tensorflow:Restoring parameters from tensorboard_estimators/model.ckpt-2737\n",
"INFO:tensorflow:Running local_init_op.\n",
"INFO:tensorflow:Done running local_init_op.\n",
"INFO:tensorflow:Finished evaluation at 2018-09-26-13:14:14\n",
"INFO:tensorflow:Saving dict for global step 2737: Accuracy = 0.97885185, Precision = 0.9995595, Recall = 0.9983438, global_step = 2737, loss = 0.05700874\n",
"INFO:tensorflow:Saving 'checkpoint_path' summary for global step 2737: tensorboard_estimators/model.ckpt-2737\n",
"INFO:tensorflow:Calling model_fn.\n",
"INFO:tensorflow:Done calling model_fn.\n",
"INFO:tensorflow:Create CheckpointSaverHook.\n",
"INFO:tensorflow:Graph was finalized.\n",
"INFO:tensorflow:Restoring parameters from tensorboard_estimators/model.ckpt-2737\n",
"INFO:tensorflow:Running local_init_op.\n",
"INFO:tensorflow:Done running local_init_op.\n",
"INFO:tensorflow:Saving checkpoints for 2737 into tensorboard_estimators/model.ckpt.\n",
"INFO:tensorflow:loss = 0.038277045, step = 2737\n",
"INFO:tensorflow:global_step/sec: 30.5391\n",
"INFO:tensorflow:loss = 0.07222056, step = 2837 (3.275 sec)\n",
"INFO:tensorflow:global_step/sec: 31.6087\n",
"INFO:tensorflow:loss = 0.052876107, step = 2937 (3.164 sec)\n",
"INFO:tensorflow:global_step/sec: 31.4002\n",
"INFO:tensorflow:loss = 0.04464199, step = 3037 (3.185 sec)\n",
"INFO:tensorflow:Saving checkpoints for 3128 into tensorboard_estimators/model.ckpt.\n",
"INFO:tensorflow:Loss for final step: 0.07779242.\n",
"INFO:tensorflow:Calling model_fn.\n",
"INFO:tensorflow:Done calling model_fn.\n",
"INFO:tensorflow:Starting evaluation at 2018-09-26-13:14:28\n",
"INFO:tensorflow:Graph was finalized.\n",
"INFO:tensorflow:Restoring parameters from tensorboard_estimators/model.ckpt-3128\n",
"INFO:tensorflow:Running local_init_op.\n",
"INFO:tensorflow:Done running local_init_op.\n",
"INFO:tensorflow:Finished evaluation at 2018-09-26-13:14:32\n",
"INFO:tensorflow:Saving dict for global step 3128: Accuracy = 0.9788272, Precision = 0.9992493, Recall = 0.9989002, global_step = 3128, loss = 0.05736828\n",
"INFO:tensorflow:Saving 'checkpoint_path' summary for global step 3128: tensorboard_estimators/model.ckpt-3128\n",
"INFO:tensorflow:Calling model_fn.\n",
"INFO:tensorflow:Done calling model_fn.\n",
"INFO:tensorflow:Create CheckpointSaverHook.\n",
"INFO:tensorflow:Graph was finalized.\n",
"INFO:tensorflow:Restoring parameters from tensorboard_estimators/model.ckpt-3128\n",
"INFO:tensorflow:Running local_init_op.\n",
"INFO:tensorflow:Done running local_init_op.\n",
"INFO:tensorflow:Saving checkpoints for 3128 into tensorboard_estimators/model.ckpt.\n",
"INFO:tensorflow:loss = 0.07032058, step = 3128\n",
"INFO:tensorflow:global_step/sec: 30.1948\n",
"INFO:tensorflow:loss = 0.08222327, step = 3228 (3.313 sec)\n",
"INFO:tensorflow:global_step/sec: 30.4547\n",
"INFO:tensorflow:loss = 0.08279471, step = 3328 (3.284 sec)\n",
"INFO:tensorflow:global_step/sec: 30.8002\n",
"INFO:tensorflow:loss = 0.06161387, step = 3428 (3.247 sec)\n",
"INFO:tensorflow:Saving checkpoints for 3519 into tensorboard_estimators/model.ckpt.\n",
"INFO:tensorflow:Loss for final step: 0.1025974.\n",
"INFO:tensorflow:Calling model_fn.\n",
"INFO:tensorflow:Done calling model_fn.\n",
"INFO:tensorflow:Starting evaluation at 2018-09-26-13:14:46\n",
"INFO:tensorflow:Graph was finalized.\n",
"INFO:tensorflow:Restoring parameters from tensorboard_estimators/model.ckpt-3519\n",
"INFO:tensorflow:Running local_init_op.\n",
"INFO:tensorflow:Done running local_init_op.\n",
"INFO:tensorflow:Finished evaluation at 2018-09-26-13:14:49\n",
"INFO:tensorflow:Saving dict for global step 3519: Accuracy = 0.98232096, Precision = 0.99957263, Recall = 0.998732, global_step = 3519, loss = 0.048257396\n",
"INFO:tensorflow:Saving 'checkpoint_path' summary for global step 3519: tensorboard_estimators/model.ckpt-3519\n",
"INFO:tensorflow:Calling model_fn.\n",
"INFO:tensorflow:Done calling model_fn.\n",
"INFO:tensorflow:Create CheckpointSaverHook.\n",
"INFO:tensorflow:Graph was finalized.\n",
"INFO:tensorflow:Restoring parameters from tensorboard_estimators/model.ckpt-3519\n",
"INFO:tensorflow:Running local_init_op.\n",
"INFO:tensorflow:Done running local_init_op.\n",
"INFO:tensorflow:Saving checkpoints for 3519 into tensorboard_estimators/model.ckpt.\n",
"INFO:tensorflow:loss = 0.0554646, step = 3519\n",
"INFO:tensorflow:global_step/sec: 29.63\n",
"INFO:tensorflow:loss = 0.05625517, step = 3619 (3.376 sec)\n",
"INFO:tensorflow:global_step/sec: 29.9541\n",
"INFO:tensorflow:loss = 0.05105275, step = 3719 (3.338 sec)\n",
"INFO:tensorflow:global_step/sec: 30.5697\n",
"INFO:tensorflow:loss = 0.039163433, step = 3819 (3.271 sec)\n",
"INFO:tensorflow:Saving checkpoints for 3910 into tensorboard_estimators/model.ckpt.\n",
"INFO:tensorflow:Loss for final step: 0.045340568.\n",
"INFO:tensorflow:Calling model_fn.\n",
"INFO:tensorflow:Done calling model_fn.\n",
"INFO:tensorflow:Starting evaluation at 2018-09-26-13:15:04\n",
"INFO:tensorflow:Graph was finalized.\n",
"INFO:tensorflow:Restoring parameters from tensorboard_estimators/model.ckpt-3910\n",
"INFO:tensorflow:Running local_init_op.\n",
"INFO:tensorflow:Done running local_init_op.\n",
"INFO:tensorflow:Finished evaluation at 2018-09-26-13:15:07\n",
"INFO:tensorflow:Saving dict for global step 3910: Accuracy = 0.98307407, Precision = 0.9993788, Recall = 0.99914604, global_step = 3910, loss = 0.0456343\n",
"INFO:tensorflow:Saving 'checkpoint_path' summary for global step 3910: tensorboard_estimators/model.ckpt-3910\n"
]
}
],
"source": [
"# 10 Training Epochs, Evaluation Step after each Epoch\n",
"for i in range(10):\n",
" sat6_classifier.train(input_fn=train_input_fn)\n",
" eval_results = sat6_classifier.evaluate(input_fn=eval_input_fn)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Comentar sobre: batchnorm e outros tipos de regularização."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python (myenv)",
"language": "python",
"name": "myenv"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment