supervised_reptile/models.py (35 lines of code) (raw):

""" Models for supervised meta-learning. """ from functools import partial import numpy as np import tensorflow as tf DEFAULT_OPTIMIZER = partial(tf.train.AdamOptimizer, beta1=0) # pylint: disable=R0903 class OmniglotModel: """ A model for Omniglot classification. """ def __init__(self, num_classes, optimizer=DEFAULT_OPTIMIZER, **optim_kwargs): self.input_ph = tf.placeholder(tf.float32, shape=(None, 28, 28)) out = tf.reshape(self.input_ph, (-1, 28, 28, 1)) for _ in range(4): out = tf.layers.conv2d(out, 64, 3, strides=2, padding='same') out = tf.layers.batch_normalization(out, training=True) out = tf.nn.relu(out) out = tf.reshape(out, (-1, int(np.prod(out.get_shape()[1:])))) self.logits = tf.layers.dense(out, num_classes) self.label_ph = tf.placeholder(tf.int32, shape=(None,)) self.loss = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=self.label_ph, logits=self.logits) self.predictions = tf.argmax(self.logits, axis=-1) self.minimize_op = optimizer(**optim_kwargs).minimize(self.loss) # pylint: disable=R0903 class MiniImageNetModel: """ A model for Mini-ImageNet classification. """ def __init__(self, num_classes, optimizer=DEFAULT_OPTIMIZER, **optim_kwargs): self.input_ph = tf.placeholder(tf.float32, shape=(None, 84, 84, 3)) out = self.input_ph for _ in range(4): out = tf.layers.conv2d(out, 32, 3, padding='same') out = tf.layers.batch_normalization(out, training=True) out = tf.layers.max_pooling2d(out, 2, 2, padding='same') out = tf.nn.relu(out) out = tf.reshape(out, (-1, int(np.prod(out.get_shape()[1:])))) self.logits = tf.layers.dense(out, num_classes) self.label_ph = tf.placeholder(tf.int32, shape=(None,)) self.loss = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=self.label_ph, logits=self.logits) self.predictions = tf.argmax(self.logits, axis=-1) self.minimize_op = optimizer(**optim_kwargs).minimize(self.loss)