练手项目之image caption问题记录

小白一个,刚刚费了老大的劲完成一个练手项目——image caption,虽然跑通了,但是评估结果却惨不忍睹。于是贴上大神的作品,留待日后慢慢消化。顺便记录下自己踩坑的一些问题。

先膜拜下大神的作品。

本次项目采用的模型结构如下。一路输入信息是利用VGG16提取的图像特征,另一路输入信息是利用LSTM提取的单词串特征,输出是预测的下一个单词。即模型的功能是,在给定图像特征和caption前面若干个单词的情况下,能预测出caption的下一个单词;所以循环若干次后即可得到一句完整的caption。采用的数据集是Flicker8K。

目前效果不怎么好,虽然能完整输出一句话,并且有些对象还能沾些边,但大部分都张冠李戴。暂认为可以从这几个方面进行改进:试试其他模型结构(比如Seq2Seq等),增加注意力机制,采用更大的数据集,网络调参。

问题目录

交叉验证

Bleu评价

迭代生成器问题(yield/next/send/generator)

Embedding层

模型保存与载入

LSTM层

keras中现成的模型及应用

模型的抽取、冻结、微调

文本预处理

图像预处理及归一化

交叉验证问题

提到交叉验证并非就特指k折交叉验证。交叉验证包括3种:简单交叉验证、k折交叉验证、留一交叉验证。

Bleu评价问题

Bleu评价模型,需要注意维度

生成器问题

参考1参考2

yield、next、send:

  • 有yield语句的函数,返回一个生成器对象;
  • 调用next(g)或g.send()时才会正式执行该函数;
  • 执行到yield语句时返回一个值,函数暂停,下一次调用时会接着这个断点继续执行;
  • 项目中据此改写了图像生成器generator,使其每次返回多张图像信息,加快训练速度(每个epoch由700s缩减至220s)。

模型保存与载入问题

模型保存:

  • 方法一:结构(存为json文件)+权重
model_json = model.to_json()
with open("model_architecture.json", "w") as f_obj:
    f_obj.write(model_json)
model.save_weights("model_weights.h5")
  • 方法二:直接保存模型
model.save('model.h5')

模型载入:

  • 方法一:
model = keras.models.model_from_json(open('model_architecture.json').read())
model.load_weights('model_weight_epoch_1.h5')
  • 方法二:
model = keras.models.load_model('CIFAR10_model_epoch_1.h5')

其他保存文件:

  • np文件
np.save('bottleneck_features.npy', x_train_Dense)  # 将提取出的特征保存在.npy文件中
train_data = np.load('bottleneck_features.npy') 
pickle.dump(svm_classifier, open('svm_model_iris.pkl', 'wb')) #写入文件,需要二进制操作
model = pickle.load(open('svm_model_iris.pkl', 'rb'))
#下面还未见过应用
pickle.dumps(obj) #不需要写入文件中,直接返回一个序列化的bytes对象
pickle.loads(bytes_object) #直接从bytes对象中读取序列化的信息

Embedding问题

参考
main_input = Input(shape=(100,), dtype=‘int32‘, name=‘main_input‘)

x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)

  • 任何layer均可以加name参数;
  • Embedding层只能作为第一层;
  • Input层到Embedding层,内部相当于已经进行onehot转换了,仅需要提供字典大小10000即可;

LSTM问题

LSTM理解

LSTM重要参数:keras.layers.LSTM(units, activation=‘tanh‘,return_sequences=False, return_state=False),其中units为\(a^{<t>}\)和\(C^{<t>}\)的神经元个数。

LSTM中两个参数(return_sequences, return_state)的理解:

  • 两者均默认为false,LSTM对象默认返回一个值,开启return_state后另外返回最后一个cell的隐态\(a^{<t>}\)和\(C^{<t>}\);
  • keras中RNN和LSTM等模块没有参数V,要获得\(\hat y^{<t>}\),则需要再接一个Dense层(才是ng课中真正的参数V)转化一下;
  • 理解1
  • 理解2

LSTM中参数activation和recurrent_activation,暂时理解成前者为求\(\tilde C\)和\(a\)的激活函数,后者为求三大门的激活函数。(待验证。)

keras中现成的模型和应用

keras中自带了一些经典模型,比如VGG、ResNet、Inception等;并提供了这些模型的常见应用场景,比如利用ResNet50分类识别,利用VGG16提取图像特征,抽取模型中间层的输出来提取特征等等。(详见文档中Preprocessing模块的Applications。)

模型抽取、冻结、微调

三个问题共参考

模型抽取:(模型抽取参考

  • 获取层对象,以便获取其参数

    • model.get_layer(name=None,index=None),或者model.layers[index]
  • 获取模型输入
    • model.input
  • 例如:model = Model(inputs=model.input,outputs=model.get_layer(layer_name).output)

模型冻结:(模型冻结参考

  • 通过设置layer对象参数layer.trainable=False,或者模型参数model.trainable=False来控制;(注意layer和model这一参数冲突时默认顺序)
  • 通过model.save()和load_model()方法载入的模型冻结时有问题,故推荐使用结构+权重分开的方式保存模型。(model.to_json() + model.save_weights())

模型fine-tune:模型微调参考【待消化】

文本预处理问题

参考1;
参考2;

text_to_word_sequence如何添加自定义过滤词?比如加‘s

  • 目前解决:采用正则表达式先换掉‘s,再统一过滤掉。

三种常用函数:

  • keras.preprocessing.text.text_to_word_sequence

    • 将一句话打散成单词;输入是字符串,输出是单词列表;
    • 参数:filter可以滤掉不必要的标点符号;lower默认转小写;split默认以空格划分;
  • keras.preprocessing.text.Tokenizer
    • 单词与编码的互换工具;
    • 常用方法(注意输入输出格式):
      • tokenizer.fit_on_texts(["今天 北京 下 雨 了", "我 今天 加班"])
      • tokenizer.texts_to_sequences(["下 雨 我 加班", "北京 下雨"])
  • keras.preprocessing.sequence.pad_sequences
    • 填充序列至固定长度

      • pad_sequences([[1,2,3],[4,5,6]],maxlen=10,padding=‘pre‘)

图像预处理及归一化问题

1.各种归一化的区别、作用?【待消化】
参考1参考2

2.项目中利用VGG16提取图像特征前对图像预处理,为啥要把RGB转为BGR?这个VGG16训练时前处理是用BGR?

20191011注:keras.applications.vgg16.preprocess_input中根据不同的模式进行了通道互换(将RGB转为BGR)和通道零均值化(每个通道减去各自均值),源代码见D:\Anaconda3\Lib\site-packages\keras_applications\imagenet_utils.py。(至于为啥要由RGB转为BGR,推测可能是VGG16模型训练时候用了OpenCV,因为只有OpenCV用的BGR格式)

原文地址:https://www.cnblogs.com/inchbyinch/p/11666924.html

时间: 2024-10-09 17:12:18

练手项目之image caption问题记录的相关文章

20个Java练手项目,献给嗜学如狂的人

给大家推荐一条由浅入深的JAVA学习路径,首先完成 Java基础.JDK.JDBC.正则表达式等基础实验,然后进阶到 J2SE 和 SSH 框架学习.最后再通过有趣的练手项目进行巩固. JAVA基础 Java编程语言(新版 2. Java进阶之设计模式 3. JDK 核心 API 4. MySQL 基础课程 5. 正则表达式基础 6. JDBC 入门教程 J2SE & SSH框架 7. Java 函数式编程 8. J2SE网络通信实践 9. Struts框架教程 10. Hibernate框架教

Python之路【第二十四篇】:Python学习路径及练手项目合集

Python学习路径及练手项目合集 Wayne Shi· 2 个月前 参照:https://zhuanlan.zhihu.com/p/23561159 更多文章欢迎关注专栏:学习编程. 本系列Python技术路径中包含入门知识.Python基础.Web框架.基础项目.网络编程.数据与计算.综合项目七个模块.路径中的教程将带你逐步深入,学会如何使用 Python 实现一个博客,桌面词典,微信机器人或网络安全软件等.完成本路径的基础及项目练习,将具备独立的Python开发能力. 完整的Python学

前端练手项目

前端学习还是很有趣的,可以较快的上手然后自己开发一些好玩的项目来练手,网上也可以一抓一大把关于前端开发的小项目,可是还是有新手在学习的时候不知道可以做什么,以及怎么做,因此,就整理了一些前端项目教程,希望可以帮助正在学习前端的小伙伴.为了方便阅读,大概把前端可以做的项目分为三类: 游戏类 实用类 好玩类 然后依次推荐一些项目教程,想要学习的小伙伴可以看看~ 游戏类 其实很多常见的小游戏都是纯前端开发出来的,比如曾经风靡的2048.别踩白块啊等等,简单有趣,对于初学者来说,这些小游戏是非常不错的练

webpack练手项目之easySlide(二):代码分割

Hello,大家好. 在上一篇 webpack练手项目之easySlide(一):初探webpack  中我们一起为大家介绍了webpack的基本用法,使用webpack对前端代码进行模块化打包. 但是乍一看webpack只是将所有资源打包到一个JS文件中而已,并没有做到真正的按需加载,这当然不是我们所想要的. 不急,今天的这一章我们就来一起继续探索webpack的另外一个功能:code split. 1.什么是code split  英文不好,暂且将其翻译为代码分割.也就是我们根据实际业务需求

推荐的阅读及练手项目

关于作者: He is an expert in numerous languages including .NET, PHP, C/C++, Java and more 推荐阅读(Software development, Desktop, Web) http://www.coderslexicon.com/recommended-reading/ 推荐练手项目: http://blog.jobbole.com/49762/, 对应的电子书名叫The Programmers Idea Book

Python练手项目:20行爬取全王者全英雄皮肤

引言 ? ?王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成. ? ?文中源代码在文章末尾,可自行复制粘贴. 准备工作 ? ?爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: ? ?我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片地址: ? ?接着,我们切换一下英雄的

程序员练手项目

转自:http://mp.weixin.qq.com/s?__biz=MzA4OTE4MjIwMA==&mid=2666146030&idx=1&sn=765c206ffcb28822674376985cdf9393&scene=23&srcid=0801NjfvdJozzoHkpC1BGnN4#rd 我经常看有人发帖问关于项目点子的事,也看到了很多回帖,我自己也回了一些常见的项目.不过我觉得只列出三两个是远远不够的,因此就收集并这个项目列表,大家要找简单的编程项目

webpack练手项目:easySlide(一)

最近在学习webpack,正好拿了之前做的一个小组件,图片轮播来做了下练手,让我们一起来初步感受下webpack的神奇魅力.     webpack是一个前端的打包管理工具,大家可以前往:http://webpack.github.io/ 作详细了解.相对于之前的前端模块打包工具, 个人认为webpack至少拥有以下值得我们拿来一用的优点: js/css/img/html等等都是静态资源,都可以通过webpack进行打包处理 所有资源都可以按需加载,避免了之前的加载器把所有资源打包在一个文件,导

70个Python练手项目

前言: 不管学习那门语言都希望能做出实际的东西来,这个实际的东西当然就是项目啦,不用多说大家都知道学编程语言一定要做项目才行. 这里整理了70个Python实战项目列表,都有完整且详细的教程,你可以从中选择自己想做的项目进行参考学习练手,你也可以从中寻找灵感去做自己的项目. 70个Python项目列表: 1.[Python 图片转字符画]2.[200行Python代码实现2048]3.[Python3 实现火车票查询工具]4.[高德API+Python解决租房问题 ]5.[Python3 色情图