Advertisement
lamiastella

cnn_expanded

Oct 23rd, 2018
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.95 KB | None | 0 0
  1. import copy
  2. import os
  3. import math
  4. import numpy as np
  5. import scipy
  6. import scipy.io
  7.  
  8. from six.moves import range
  9.  
  10. import read_data
  11.  
  12. @read_data.restartable
  13. def svhn_dataset_generator(dataset_name, batch_size):
  14.     assert dataset_name in ['train', 'test']
  15.     assert batch_size > 0 or batch_size == -1  # -1 for entire dataset
  16.  
  17.     path = './svhn_mat/' # path to the SVHN dataset you will download in Q1.1
  18.     file_name = '%s_32x32.mat' % dataset_name
  19.     file_dict = scipy.io.loadmat(os.path.join(path, file_name))
  20.     X_all = file_dict['X'].transpose((3, 0, 1, 2))
  21.     y_all = file_dict['y']
  22.     data_len = X_all.shape[0]
  23.     batch_size = batch_size if batch_size > 0 else data_len
  24.  
  25.     X_all_padded = np.concatenate([X_all, X_all[:batch_size]], axis=0)
  26.     y_all_padded = np.concatenate([y_all, y_all[:batch_size]], axis=0)
  27.     y_all_padded[y_all_padded == 10] = 0
  28.  
  29.     for slice_i in range(int(math.ceil(data_len / batch_size))):
  30.         idx = slice_i * batch_size
  31.         X_batch = X_all_padded[idx:idx + batch_size]
  32.         y_batch = np.ravel(y_all_padded[idx:idx + batch_size])
  33.         yield X_batch, y_batch
  34.  
  35.  
  36.  
  37. def apply_classification_loss(model_function):
  38.     with tf.Graph().as_default() as g:
  39.         #with tf.device("/gpu:0"):  # use gpu:0 if on GPU
  40.         x_ = tf.placeholder(tf.float32, [None, 32, 32, 3])
  41.         y_ = tf.placeholder(tf.int32, [None])
  42.         y_logits = model_function(x_)
  43.  
  44.         y_dict = dict(labels=y_, logits=y_logits)
  45.         losses = tf.nn.sparse_softmax_cross_entropy_with_logits(**y_dict)
  46.         cross_entropy_loss = tf.reduce_mean(losses)
  47.         trainer = tf.train.AdamOptimizer(learning_rate=0.001)
  48.         train_op = trainer.minimize(cross_entropy_loss)
  49.  
  50.         y_pred = tf.argmax(tf.nn.softmax(y_logits), axis=1)
  51.         correct_prediction = tf.equal(tf.cast(y_pred, tf.int32), y_)
  52.         accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
  53.  
  54.     model_dict = {'graph': g, 'inputs': [x_, y_], 'train_op': train_op,
  55.                   'accuracy': accuracy, 'loss': cross_entropy_loss}
  56.  
  57.     return model_dict
  58.  
  59.  
  60.  
  61.  
  62. def train_model(model_dict, dataset_generators, epoch_n, print_every):
  63.     with model_dict['graph'].as_default(), tf.Session() as sess:
  64.         with tf.device("/gpu:0"):
  65.             sess.run(tf.global_variables_initializer())
  66.  
  67.             for epoch_i in range(epoch_n):
  68.                 for iter_i, data_batch in enumerate(dataset_generators['train']):
  69.                     train_feed_dict = dict(zip(model_dict['inputs'], data_batch))
  70.                     sess.run(model_dict['train_op'], feed_dict=train_feed_dict)
  71.  
  72.                     if iter_i % print_every == 0:
  73.                         collect_arr = []
  74.                         for test_batch in dataset_generators['test']:
  75.                             test_feed_dict = dict(zip(model_dict['inputs'], test_batch))
  76.                             to_compute = [model_dict['loss'], model_dict['accuracy']]
  77.                             collect_arr.append(sess.run(to_compute, test_feed_dict))
  78.                         averages = np.mean(collect_arr, axis=0)
  79.                         fmt = (epoch_i, iter_i, ) + tuple(averages)
  80.                         print('epoch {:d} iter {:d}, loss: {:.3f}, '
  81.                               'accuracy: {:.3f}'.format(*fmt))
  82.  
  83.  
  84. dataset_generators = {
  85.         'train': svhn_dataset_generator('train', 256),
  86.         'test': svhn_dataset_generator('test', 256)
  87. }
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94. def cnn_expanded(x_):
  95.     conv1 = tf.layers.conv2d(
  96.             inputs=x_,
  97.             filters=32,  # number of filters
  98.             kernel_size=[5, 5],
  99.             padding="same",
  100.             activation=tf.nn.relu)
  101.  
  102.     pool1 = tf.layers.max_pooling2d(inputs=conv1,
  103.                                     pool_size=[2, 2],
  104.                                     strides=2)  # convolution stride
  105.  
  106.     conv2 = tf.layers.conv2d(
  107.             inputs=pool1,
  108.             filters=32, # number of filters
  109.             kernel_size=[9, 9],
  110.             padding="same",
  111.             activation=tf.nn.relu)
  112.     pool2 = tf.layers.max_pooling2d(inputs=conv2,
  113.                                     pool_size=[2, 2],
  114.                                     strides=2)  # convolution stride
  115.  
  116.  
  117.     conv3 = tf.layers.conv2d(
  118.             inputs=pool1,
  119.             filters=32,
  120.             kernel_size=[9,9],
  121.             padding="same",
  122.             activation=tf.nn.relu)
  123.     pool3 = tf.layers.max_pooling2d(inputs=conv2,
  124.                                    pool_size=[2,2],
  125.                                    strides=2) #convolution stride
  126.     pool_flat = tf.contrib.layers.flatten(pool3, scope='pool3flat')
  127.  
  128.  
  129.     #pool_flat = tf.contrib.layers.flatten(pool2, scope='pool2flat')
  130.     dense = tf.layers.dense(inputs=pool_flat, units=500, activation=tf.nn.relu)
  131.     logits = tf.layers.dense(inputs=dense, units=10)
  132.     return logits
  133.  
  134.  
  135.  
  136.  
  137. model_dict = apply_classification_loss(cnn_expanded)
  138. train_model(model_dict, dataset_generators, epoch_n=50, print_every=20)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement