Neural network 检查输入时出现Keras形状错误

Neural network 检查输入时出现Keras形状错误,neural-network,keras,language-model,Neural Network,Keras,Language Model,我试图训练一个简单的MLP模型,该模型将输入问题(使用300D单词嵌入)和使用预训练VGG16模型提取的图像特征映射到固定长度的特征向量。但是,我不知道如何修复下面提到的错误。下面是我目前正在尝试运行的代码: parser=argparse.ArgumentParser() add_参数('-num_hidden_units',type=int,default=1024) add_参数('-num_hidden_layers',type=int,default=3) parser.add_参数(

我试图训练一个简单的MLP模型,该模型将输入问题(使用300D单词嵌入)和使用预训练VGG16模型提取的图像特征映射到固定长度的特征向量。但是,我不知道如何修复下面提到的错误。下面是我目前正在尝试运行的代码:

parser=argparse.ArgumentParser()
add_参数('-num_hidden_units',type=int,default=1024)
add_参数('-num_hidden_layers',type=int,default=3)
parser.add_参数('-dropout',type=float,default=0.5)
parser.add_参数('-activation',type=str,default=tanh')
parser.add_参数('-language_only',type=bool,default=False)
parser.add_参数('-num_epochs',type=int,default=10)#default=100
parser.add_参数('-model_save_interval',type=int,default=10)
add_参数('-batch_size',type=int,default=128)
args=parser.parse_args()
问题(train=open('data/qa/preprocess/questions_train2014.txt','r')。read().splitlines()
answers\u train=open('data/qa/preprocess/answers\u train2014\u modal.txt','r')。read().splitlines()
images\u train=open('data/qa/preprocess/images\u train2014.txt','r').read().splitlines()
vgg_model_path='data/coco/vgg_feats.mat'
maxAnswers=1000
问题训练、答案训练、图像训练=选择频繁的答案(问题训练、答案训练、图像训练、最大答案)
#对剩下的答案进行编码
labelencoder=预处理。labelencoder()
labelencoder.fit(答案与训练)
nb_classes=len(列表(labelencoder.classes))
dump(labelencoder,'models/labelencoder.pkl')
features\u struct=scipy.io.loadmat(vgg\u模型\u路径)
VGGfeatures=features_struct['feats']
打印(“加载的vgg功能”)
image_id=open('data/coco/coco_vgg_IDMap.txt')。read().splitlines()
id_map={}
对于图像\u ID中的ID:
id_split=ids.split()
id_映射[id_分割[0]]=int(id_分割[1])
nlp=英语()
打印('加载的word2vec功能…')
img_dim=4096
文字尺寸=300
模型=顺序()
如果仅args.language_:
添加(密集(args.num\u hidden\u units,input\u dim=word\u vec\u dim,init='uniform'))
其他:
添加(密集(args.num_hidden_units,input_dim=img_dim+word_vec_dim,init='uniform'))
模型添加(激活(参数激活))
如果参数退出>0:
model.add(辍学(参数辍学))
对于范围内的i(args.num\u hidden\u layers-1):
添加(密集(args.num\u隐藏单位,init='uniform'))
模型添加(激活(参数激活))
如果参数退出>0:
model.add(辍学(参数辍学))
add(稠密(nb_类,init='uniform'))
添加(激活('softmax'))
json_string=model.to_json()
如果仅args.language_:
model_file_name='models/mlp_language_only_num_hidden_units_'+str(args.num_hidden_units)+''u num_hidden_layers_'+str(args.num_hidden_layers)
其他:
model_file_name='models/mlp_num_hidden_units_'+str(args.num_hidden_units)+''u num_hidden_layers_'+str(args.num_hidden_layers)
打开(模型文件名称+'.json',w')。写入(json字符串)
打印('编译模型…')
compile(loss='classifical\u crossentropy',optimizer='rmsprop')
打印('编译完成…')
打印('培训已开始…')
对于范围内的k(args.num_epochs):
#在遍历数据点之前,先将其洗牌
索引\u shuf=列表(范围(len(问题\u列)))
洗牌(索引)
问题训练=[索引中的问题训练[i]
answers\u train=[索引中i的answers\u train[i]
images\u train=[索引中i的images\u train[i]
progbar=通用的实用程序
对于zip中的qu_批次、an_批次、im_批次(grouper(questions_train,args.batch_size,fillvalue=questions_train[-1]),
石斑鱼(answers\u train,args.batch\u size,fillvalue=answers\u train[-1]),
grouper(图像序列,参数。批量大小,填充值=图像序列[-1]):
X_q_batch=获取问题矩阵和(qu_batch,nlp)
如果仅args.language_:
X_批次=X_q_批次
其他:
X_i_batch=获取图像矩阵(im_batch、id_map、VGG特征)
X_批次=np.hstack((X_q_批次,X_i_批次))
Y_批次=获取答案矩阵(批次,标签编码)
损耗=型号。批量生产(X批、Y批)
progbar.add(args.batch_size,value=[(“列车损失”,损失)])
#打印类型(丢失)
如果k%args.model\u save\u interval==0:
model.save_weights(model_file_name+''u epoch_{:02d}.hdf5'.格式(k))
model.save_weights(model_file_name+''u epoch_{:02d}.hdf5'.格式(k))
下面是我得到的错误:

Keras:检查输入时出错:预期密集9_输入具有形状 (4396,)但得到了形状为(4096,)的数组


我认为错误在于模型第一层的else语句中传递的内容与训练中传递的内容不同。在第一个图层中指定:

model = Sequential()
if args.language_only:
    model.add(Dense(args.num_hidden_units, input_dim=word_vec_dim, init='uniform'))
else:
    model.add(Dense(args.num_hidden_units, input_dim=img_dim+word_vec_dim, init='uniform'))
显然,您传递的是输入尺寸=img尺寸+单词尺寸=4096+300=4396。在培训期间,您通过:

X_q_batch = get_questions_matrix_sum(qu_batch, nlp)
if args.language_only:
    X_batch = X_q_batch
else:
    X_i_batch = get_images_matrix(im_batch, id_map, VGGfeatures)
    X_batch = np.hstack((X_q_batch, X_i_batch))
因此,在
else
分支中,X_batch将有
X_q_batch
X_i_batch
行,这显然是=4096。 顺便说一句,为了调试的目的,给图层一个
名称将更容易,例如

x = Dense(64, activation='relu', name="dense_one")
我希望这有帮助