当前,我正在应对Codalab挑战,因为我们必须根据给定的图像(输入)来预测svg代码(目标)。我正在使用Keras API来构建神经网络以构建模型。模型本身的架构似乎并没有太大的问题,因为它可以正常工作。该体系结构的功劳必须归功于Harshall Lamba,因为我的代码在很大程度上受我在Medium(https://towardsdatascience.com/image-captioning-with-keras-teaching-computers-to-describe-pictures-c88a46a311b8)上找到的模型的启发。但是,当我尝试拟合数据时,将返回以下错误:
ValueError:检查目标时出错:预期density_6的形状为(37,),但数组的形状为(101,)
我正尝试使用softmax激活来输出37个概率,因为我将在此处进行序列预测。
我尝试了几种方法来使模型适合。我已经非常仔细地研究了本文中的模型,因此我非常有信心那里没有问题。我的图像数据(X)具有以下numpy结构(64,64,4),我的目标序列在(101,)中。直到现在看来,唯一起作用的是将输出层更改为101个单位。但是,这显然不是我想要的,因为输出单位应该类似于我的词汇量(vocab_size)。
max_len = 101
vocab_size = 37
inputs1 = Input(shape=(64, 64, 4))
conv1 = Conv2D (16, kernel_size = (3,3), strides=(1, 1), padding='same') (inputs1)
pool1 = MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid') (conv1)
conv2 = Conv2D (8, kernel_size = (3,3), strides=(2, 2), padding='same') (pool1)
pool2 = MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid') (conv2)
flat1 = Flatten () (pool2)
fe1 = Dropout(0.5)(flat1)
fe2 = Dense(256, activation='relu')(fe1)
# SVG embedding
inputs2 = Input(shape=(max_len,))
se1 = Embedding(vocab_size, 16, mask_zero=True)(inputs2)
se2 = Dropout(0.5)(se1)
se3 = LSTM(256, return_sequences = False)(se2)
# decoder (feed forward) model
decoder1 = add([fe2, se3])
decoder2 = Dense(256, activation='relu')(decoder1)
outputs = Dense(vocab_size, activation='softmax')(decoder2)
# merge the two input models
model = Model(inputs=[inputs1, inputs2], outputs=outputs)
model.compile (loss='categorical_crossentropy', optimizer='rmsprop', metrics = ['accuracy'])
model.fit ([X, y], y, epochs = 3, batch_size = 1028)
非常感谢您!