【深度之眼cs231n第七期】笔记(二十一)

本文记录了使用RNN进行COCO数据集图像描述生成的过程,包括数据预处理、模型训练及验证。通过cs231n库,实现了RNN的单步、多步、词向量层和全连接层,并在小规模训练集上实现过拟合,验证集上展示了模型的局限性。
摘要由CSDN通过智能技术生成

RNN_Captioning.ipynb

准备工作

导入各种包

from __future__ import print_function
import time, os, json
import numpy as np
import matplotlib.pyplot as plt
from cs231n.gradient_check import eval_numerical_gradient, eval_numerical_gradient_array
from cs231n.rnn_layers import *
from cs231n.captioning_solver import CaptioningSolver
from cs231n.classifiers.rnn import CaptioningRNN
from cs231n.coco_utils import load_coco_data, sample_coco_minibatch, decode_captions
from cs231n.image_utils import image_from_url

# 默认的plot设置
%matplotlib inline
plt.rcParams['figure.figsize'] = (10.0, 8.0)
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'

# 自动重新加载
%load_ext autoreload
%autoreload 2

def rel_error(x, y):
    """ 相对误差 """
    return np.max(np.abs(x - y) / (np.maximum(1e-8, np.abs(x) + np.abs(y))))
  • 后面用到的COCO数据集是以HDF5的格式保存的,要读取HDF5格式的文件,需要安装h5py包(使用pip install h5py安装
  • 这次使用的是COCO2014的数据集,包含80,000张训练图片和40,000张验证图片。直接运行get_assignment3_data.sh获取数据集。注意:该数据集大约有1GB
  • 这些数据已经预处理过了,使用ImageNet上预训练的VGG-16网络的fc7层输出作为图像的特征,这些特征存储在train2014_vgg16_fc7.h5和val2014_vgg16_fc7.h5里。为了提高效率和减少内存,cs231n使用主成分分析(PCA)把4096维的数据降到512维了,降维后的数据储存在train2014_vgg16_fc7_pca.h5和val2014_vgg16_fc7_pca.h5里。
  • 原始的图像数据大约有20GB,所以下载的数据集没有包含进来。但所有图像的URL都保存在train2014_urls.txt和val2014_urls.txt,这样就可以从网络上下载图像。
  • 直接处理单词是比较低效的,所以给每个单词分配一个整数ID,这样就可以使用一串整数来表示一句话。整数ID和单词的对应关系储存在coco2014_vocab.json,可以使用cs231n/coco_utils.py里的decode_captions函数来把整数ID转化回单词。
  • cs231n在单词表里加入了一些特殊的token。在每一句话的开头和结尾都分别有< START > token和< END > token,很少用到的单词使用< UNK > token来表示。另外,由于每张图像的描述长短不一,而且我们是用小批量数据训练的,所以要在< END > token后添加了< NULL > token(不用计算损失和梯度)。由于这些实现有些麻烦,所以cs231n已经把token相关的东西都实现好了(nice!)。

使用cs231n/coco_utils.py里的load_coco_data函数加载MS-COCO数据集(包含图像描述,图像特征,URL和单词表)

# 加载coco数据集,这里使用的是PCA降维后的数据
# 要是想使用降维前的数据,把True改为False就可以了
data = load_coco_data(pca_features=True)

# 输出数据的信息
for k, v in data.items():
    if type(v) == np.ndarray:
        print(k, type(v), v.shape, v.dtype)
    else:
        print(k, type(v), len(v))

查看图片和它的描述

batch_size = 3

# 从加载的数据集中读取3张图片URL和它们的描述
captions, features, urls = sample_coco_minibatch(data, batch_size=batch_size)
for i, (caption, url) in enumerate(zip(captions, urls)):
    # plt.imshow(image_from_url(url))
    # 上一行代码再运行到imread()后就阻塞了,所以直接把URL打印出来
    print(url)
    plt.figure(figsize=(5, 0.5))
    plt.axis('off')
    # 把整数ID形式的描述转换回文字
    caption_str = decode_captions(caption, data['idx_to_word'])
    plt.title(caption_str)
    plt.show()

图像描述:< START > a orange is cut into < UNK > and sits in a bowl < END >(碗里有一个被切成两半的橘子)
在这里插入图片描述

训练模型

在cs231n/rnn_layers.py里实现不同的层后,验证这些层是否正确,包括单步RNN、多步RNN、词向量层等。

在cs231n/classifiers/rnn.py里实现CaptioningRNN模型,检验模型的正确性

# CaptioningRNN模型的前向传播
N, D, W, H = 10, 20, 30, 40
# 描述只会包含3个单词
word_to_idx = {
   '<NULL>': 0, 'cat': 2, 'dog': 3}
V = len(word_to_idx)
T = 13

# input_dim表示输入特征的维度,wordvec_dim表示词向量的维度
# hidden_dim表示隐藏状态h_t的维度
model = CaptioningRNN(word_to_idx,
          input_dim=D,
          wordvec_dim=W,
          hidden_dim=H,
          cell_type='rnn',
          dtype=np.float64)
# 所有模型参数都是一样的,本来应该在上一行的CaptioningRNN里初始化的,现在覆盖掉了
for k, v in model.params.items():
    model.params[k] = np.linspace(-1.4, 1.3, num=v.size).reshape(*v.shape)
# 生成图像特征
features = np.linspace(-1.5, 0.3, num=(N * D)).reshape(N, D)
# 生成描述
captions = (np.arange(N * T) % V).reshape(N, T)

loss, grads = model.loss(features, captions)
expected_loss = 9.83235591003
print('loss: ', loss)
print('expected loss: ', expected_loss)
print('difference: ', abs(loss - expected_loss))


# CaptioningRNN模型的反向传播
np.random.seed(231)
batch_size = 2
timesteps = 3
input_dim = 4
wordvec_dim = 5
hidden_dim = 6
word_to_idx = {
   '<NULL>': 0, 'cat': 2, 'dog': 3}
vocab_size = len(word_to_idx)

# 生成描述和特征
captions = np
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值