在 ResNet50 或任何深度学习模型中处理多个输入(图像、文本)数据
Posted
技术标签:
【中文标题】在 ResNet50 或任何深度学习模型中处理多个输入(图像、文本)数据【英文标题】:Working with multiple input (image,text) data in ResNet50 or any Deep Learning Models 【发布时间】:2020-01-04 22:42:50 【问题描述】:这是一个抽象的想法,我不知道正确的实现管道;我使用了 RestNet50 架构来训练模型,将图像分类为 3 类;我正在考虑探索的一种方法是使用图像的文本数据;
train_gen = image.ImageDataGenerator().flow_from_directory(dataset_path_train, target_size=input_shape[:2], batch_size=batch_size, class_mode='categorical', shuffle=True, seed=seed)
test_gen = image.ImageDataGenerator().flow_from_directory(dataset_path_valid, target_size=input_shape[:2], batch_size=batch_size, class_mode='categorical', shuffle=True, seed=seed)
模型数据准备; 现在对于每个图像,我也有 text,label 作为单个图像的键值对; 如果我必须通过 1. WordtoVec 2. TFIDF
我读过 Keras 中的嵌入层;我不确定如何将文本数据与 test_gen 和 train_gen 一起嵌入模型中(在任何中间层或 Flatten() 之后。
base_model = ResNet50(weights='imagenet', include_top=False,
input_shape=input_shape)
from keras.models import Model, load_model
x = base_model.output
x = Flatten(name='flatten')(x)
predictions = Dense(3, activation='softmax', name='predictions')(x)
model = Model(inputs=base_model.input, outputs=predictions)
for layer in model.layers[0:141]:
layer.trainable = True
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit_generator(train_gen,steps_per_epoch=1000 , epochs=2,validation_steps=100, validation_data=test_gen,verbose=1)
【问题讨论】:
【参考方案1】:所以看完这个Multi-input and multi-output models就解决了
文本输入是使用 sklearn tfidf 进行 TFIDF 处理的,它产生了 26038 个矩阵特征;
x = base_model.output
x = Flatten(name='flatten')(x)
x2= Input(shape=(26078,), dtype='float32', name='tfidf_input')
combinedInput = concatenate([x2, x])
x = Dense(1024, activation="relu")(combinedInput)
# adding a regularizer with x sch as x=Dense(1024,activation="relu",activity_regularizer=regularizers.l1(0.01))
#x1= Dense(512, activation='softmax', name='predictions')(x)
predictions = Dense(3, activation='softmax', name='predictions')(x)
model = Model(inputs=[base_model.input,x2], outputs=predictions)
for layer in model.layers[0:141]:
layer.trainable = True
我添加了一个维度为 (26078,) 的输入层,它将在将其转换为 TFIDF 后来自文本(现在这将添加为文本特征)
在模型上拟合数据时
model.fit([image_data, text_feature], label,epochs=50,validation_split=0.10,steps_per_epoch=100,validation_steps=8, shuffle = True)
它需要 2 个输入,一个是图像的 ResNet 输入,另一个是 [datasize,26078] 的数组。
【讨论】:
以上是关于在 ResNet50 或任何深度学习模型中处理多个输入(图像、文本)数据的主要内容,如果未能解决你的问题,请参考以下文章
手把手写深度学习(13):如何利用官方预训练模型做微调/迁移学习?(以Resnet50提取图像特征为例)
手把手写深度学习(14):如何利用官方预训练模型做微调/迁移学习?(以Resnet50提取图像特征为例)
深度学习100例 | 第29天-ResNet50模型:船型识别