-
使用keras创建VGG16定义的cnn网络结构
-
VGG16⽤用于图像分类, 将输⼊入图像分为1000个类别
-
根据论文中给的网络结构,我们选择绿色框内的结构,分为16个权值层,5个池化层,共21层结构
-
卷积层的输出可以作为池化层(pool)的输入,但卷积层和池化层的输出 不能当作全连接层(Dense,FC)的输入,之间必须加一个Flatten层
from keras.models import Sequential
from keras.layers import Dense, Flatten
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
def generate_vgg16():
搭建VGG16网络结构
:return: VGG16网络
此网络没有分支,所以使用Sequential(输入为列表)线性结构
224x224,3个通道的RGB图像
padding = 'same':卷积层的输入和输出的矩阵长宽不变,深度会变
activation = 'relu':设置激活函数为relu
maxpool 最大池化层:
pool_size = (2,2):每次池化把2x2的点输出做一个点
stride = (2,2):步长
Flatten:
卷积层的输出可以作为池化层的输入,
但卷积层和池化层的输出不能当作全连接层的输入,之间必须加一个Flatten层
Dense:
指定节点数量和激活函数
activation = 'relu':设置激活函数为relu
input_shape = (224, 224, 3)
model = Sequential([
Conv2D(64, (3, 3), input_shape=input_shape, padding='same', activation='relu'),
Conv2D(64, (3, 3), padding='same', activation='relu'),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
Conv2D(128, (3, 3), padding='same', activation='relu'),
Conv2D(128, (3, 3), padding='same', activation='relu'),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
Conv2D(256, (3, 3), padding='same', activation='relu'),
Conv2D(256, (3, 3), padding='same', activation='relu'),
Conv2D(256, (3, 3), padding='same', activation='relu'),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
Conv2D(512, (3, 3), padding='same', activation='relu'),
Conv2D(512, (3, 3), padding='same', activation='relu'),
Conv2D(512, (3, 3), padding='same', activation='relu'),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
Conv2D(512, (3, 3), padding='same', activation='relu'),
Conv2D(512, (3, 3), padding='same', activation='relu'),
Conv2D(512, (3, 3), padding='same', activation='relu'),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
Flatten(),
Dense(4096, activation='relu'),
Dense(4096, activation='relu'),
Dense(1000, activation='softmax')
return model
if __name__ == '__main__':
model = generate_vgg16()
model.summary()
运行可见输出
有运行结果可见,池化层是没有训练权值的,而卷积层因为共享权值,因此要训练的权值数也比较少,而全连接层需要训练的权值数就比较多。
-
从给定的VGG16网络结构文件和权值文件,创建VGG16网络。
-
修改网络结构(去除最后一层)。
-
利用修改的网络结构,提取flicker8k数据集中所有图像特征,使用字典存储,key为文件名(不带.jpg后缀),value为一个网络的输出。
-
将字典保存为features.pkl文件(使用pickle库)。
from keras.models import model_from_json
from PIL import Image as pil_image
from keras import backend as K
import numpy as np
from pickle import dump
from os import listdir
from keras.models import Model
import keras
import re
from tqdm import tqdm
def load_vgg16_model():
"""从当前目录下面的 vgg16_exported.json 和 vgg16_exported.h5 两个文件中导入 VGG16 网络并返回创建的网络模型
# Returns
创建的网络模型 model
json_file = open('vgg16_exported.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
model = model_from_json(loaded_model_json)
model.load_weights('vgg16_exported.h5')
return model
def preprocess_input(x):
"""预处理图像用于网络输入, 将图像由RGB格式转为BGR格式.
将图像的每一个图像通道减去其均值
# Arguments
x: numpy 数组, 4维.
data_format: Data format of the image array.
# Returns
Preprocessed Numpy array.
x = x[..., ::-1]
mean = [103.939, 116.779, 123.68]
x[..., 0] -= mean[0]
x[..., 1] -= mean[1]
x[..., 2] -= mean[2]
return x
def load_img_as_np_array(path, target_size):
"""从给定文件加载图像,转换图像大小为给定target_size,返回32位浮点数numpy数组.
# Arguments
path: 图像文件路径
target_size: 元组(图像高度, 图像宽度).
# Returns
A PIL Image instance.
img = pil_image.open(path)
img = img.resize(target_size, pil_image.NEAREST)
return np.asarray(img, dtype=K.floatx())
def extract_features(directory):
"""提取给定文件夹中所有图像的特征, 将提取的特征保存在文件features.pkl中,
提取的特征保存在一个dict中, key为文件名(不带.jpg后缀), value为特征值[np.array]
Args:
directory: 包含jpg文件的文件夹
Returns:
model = load_vgg16_model()
model.layers.pop()
model = Model(inputs=model.inputs, outputs=model.layers[-1].output)
print('模型建立成功')
features = dict()
pbar = tqdm(total=len(listdir(directory)), desc="进度", ncols=100)
for fn in listdir(directory):
fn = directory + '/' + fn
arr = load_img_as_np_array(fn, target_size=(224, 224))
arr = arr.reshape((1, arr.shape[0], arr.shape[1], arr.shape[2]))
arr = preprocess_input(arr)
feature = model.predict(arr, verbose=0)
id = re.findall('Flicker8k_Dataset/(.*?).jpg', fn)[0]
features[id] = feature
pbar.update(1)
print('特征提取完成')
return features
if __name__ == '__main__':
directory = 'Flicker8k_Dataset'
features = extract_features(directory)
print('提取特征的文件个数:%d' % len(features))
print(keras.backend.image_data_format())
dump(features, open('features.pkl', 'wb'))
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200727135924371.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDI3MDUzNw==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200727135933129.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDI3MDUzNw==,size_16,color_FFFFFF,t_70)
最后的结果,特征提取完成
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200727140909410.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDI3MDUzNw==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/202007271359469.png)
用CNN进行图像识别再用LSTM文字处理,再结合DNN实现看图说话涉及到的知识数字图像处理图像读取图像缩放图像数据维度变换自然语言处理文字清洗文字嵌入CNN(卷积神经网络)图像特征提取迁移学习LSTM(递归神经网络)文字串的特征提取DNN(深度神经网络)从图像特征和文字串的特征预测下一个单词目标自动生成英文标题,与人类生成的标题越相似越好。衡量两个句子的相似度(BLEU)。一个句子与其他几个句子的相似度(Corpus BLEU)BL.
该文内容主要是针对图像描绘从最基础的baseline:NIC模型开始到引出Attention,并且与Transformer模型进行性能比对,在源内容上进行拓展以及更新。主要针对学期大作业内容进行讲解。
任务定义:
图像描述是结合了计算机视觉和自然语言处理两个研究..
### 回答1:
自我批评序列训练是一种用于图像字幕生成的技术。它通过在训练期间对生成的字幕进行自我批评,以改进模型的性能。该方法使用了一种称为“自我注意力”的技术,它允许模型在生成字幕时关注先前生成的单词,从而提高生成的质量。自我批评序列训练已被证明是一种有效的技术,可以在各种图像字幕生成任务中提高模型的性能。
### 回答2:
Self-critical sequence training(SCST)是一种图像标注模型的训练方法,它通过对模型输出的错误进行自我评估来提高图像标注的精度。SCST是一种监督式学习方法,它通过与基础模型进行有针对性的反馈,来提高模型的输出结果。
在SCST中,模型首先生成一个单词序列,然后通过自我评估方法计算序列的损失函数。模型会将自己生成的序列与参考答案进行比较,并根据两者之间的差异来调整自己的参数。如果模型生成的序列与参考答案相似度高,则可以认为模型输出的结果是正确的,模型会将该序列的损失函数作为最终的目标值进行优化。
SCST的另一个优点是它可以生成更加准确的图像标注。在传统的图像标注方法中,模型在标注一张图片时会依靠之前标注的其他图片的信息,但是这种方法的精度往往会受到前一个标注结果的影响。而SCST在每个输入图像上独立进行标注,每一步只考虑当前序列的损失函数,从而减少标注过程中的误差。
总的来说,SCST是一种有效的图像标注训练方法,它能够通过自我评估来优化模型,同时生成更加准确的图像标注。
### 回答3:
“自我批评顺序训练”是一种用于图像描述的深度学习技术。该技术的主要目的是提高用计算机生成图像描述的质量和准确性。
在传统的图像描述方法中,计算机通过“编码-解码”系统生成描述。首先将图像输入编码器,然后将编码结果传入解码器,最后给出相应的描述。但是这种方法很难准确地给出正确的图像描述,特别是对于长句描述来说。
为了解决这个问题,研究人员提出了自我批评顺序训练技术,该技术的基本思想是通过与人工生成描述的对比来训练模型。具体来说,这个技术包括三个关键步骤:
1. 生成描述。计算机将图像输入到编码器,然后用解码器生成一个最初的描述并提交给人工审核。
2. 人工批评。人工将计算机生成的描述与自己生成的描述进行比较,然后给出分数。
3. 重新训练。计算机接收到人工评分后,采取相应的操作来调整自己的模型。然后再进行描述生成,直到达到最终的分数为止。
通过这种方法训练的计算机模型,可以显著提高图像描述的准确度和质量。在使用这种技术进行研究时,研究人员还发现,自我批评顺序训练能减少过拟合现象的发生。因为它强制计算机与人类对比,从而避免了学习到过多的训练数据和模型参数。