接触MAML半年了,在把这个传说中的神奇框架给改得不成样子之后,又回到了原点。从完全没接触过tensorflow和未知深度学习神经网络为何物之时到倒腾实验半年的经历,让我渐渐领会到MAML的一些思想。学习之路坎坷,暂且以简单笔记记之。以下从数据集、代码、网络结构三个层次作了介绍。
MiniImageNet数据集
就从跟我实验有关的miniImagenet(下载)的5分类说起。这个数据集下载下来是一个100×600的数据集,即含有100类花鸟虫自然与生活中物品的集合,每类有600张图片。这些样本也就是类似这样的:
这里列举的样本大小是统一的,原始样本大小不一定一样大,但是数据经过分类(根据图片名称已标注类别),同时将大小统一至84×84,并划分为train,val,test数据集。
CODE
接下来就是代码中处理的一些方式。
第一部分 抽取样本作为训练和验证数据
def make_data_tensor(self, train=True):
if train:
#train目录下的所有分好类的样本的文件目录
folders = self.metatrain_character_folders
# number of tasks, not number of meta-iterations. (divide by metabatch size to measure)
#放进队列样本的批次数,验证数据批次有所不同。因miniImagenet训练验证数据量差别。 train有64类,val有16类,test有20类。
num_total_batches = 20000 #200000
else:
folders = self.metaval_character_folders
num_total_batches = 600
# make list of files
# print('Generating filenames:',folders)
print('Generating filenames')
all_filenames = []
all_labels = []
#从这里开始循环取出所有批次样本,每个批次样本类别随机(tain即64选5依次类推)
for _ in range(num_total_batches):
#随机选择num_classes类
sampled_character_folders = random.sample(folders, self.num_classes)
#打乱类别顺序
random.shuffle(sampled_character_folders)
#这里取出的样本实际是num_classes类,每类有self.num_samples_per_class个样本,最终是顺序按类连续排列的样本路径的列表
labels_and_images = get_images(sampled_character_folders, range(self.num_classes), nb_samples=self.num_samples_per_class, shuffle=False)
# make sure the above isn't randomized order
#样本路径列表
filenames = [li[1] for li in labels_and_images]
#样本标签列表,由于每个批次所取样本对应的标签都是一样的,所以后面队列中每次取出样本的标签只需要用到lables而不必用到all_labels(自行添加)
labels = [li[0] for li in labels_and_images]
all_filenames.extend(filenames)
all_labels.extend(filenames)
# make queue for tensorflow to read from
#这就是存放样本路径的队列,也就是说先把所有样本对应路径放进队列,只有在训练开始的时候才会根据队列去读出样本数据,这也是tensorflow图计算机制,先构建结点,等到需要计算某结点时才会依次根据结点间关系去一一计算出结果。
filename_queue = tf.train.string_input_producer(tf.convert_to_tensor(all_filenames), shuffle=False)
print('Generating image processing ops',len(list(set(all_filenames))))
image_reader = tf.WholeFileReader()
_, image_file = image_reader.read(filename_queue)
if FLAGS.datasource == 'miniimagenet':
#对于每个读出的样本所做的处理,解码、向量化(行向量)、归一化
image = tf.image.decode_jpeg(image_file, channels=3)
image.set_shape((self.img_size[0],self.img_size[1],3))
image = tf.reshape(image,