В настоящее время я работаю над проблемой Codalab, где мы должны предсказать svg-код (цель), учитывая изображение (входные данные). Я работаю с Keras API для построения нейронной сети, чтобы построить модель. Кажется, в архитектуре самой модели не так уж и много неправильного, так как она работает. Кредиты на архитектуру должны идти к Harshall Lamba, так как мой код в значительной степени вдохновлен моделью, которую я нашел на Medium (https://towardsdatascience.com/image-captioning-with-keras-teaching-computers-to-describe-pictures-c88a46a311b8). Однако, когда я пытаюсь подогнать свои данные, возвращается следующая ошибка:
ValueError: Ошибка при проверке цели: ожидалось, что плотность_6 имеет форму (37,), но получен массив с формой (101,)
Я пытаюсь вывести 37 вероятностей, используя активацию softmax, так как яздесь я собираюсь сделать прогноз последовательности.
Я попробовал несколько вещей, чтобы привести модель в соответствие. Я очень внимательно посмотрел на модель в статье, поэтому я вполне уверен, что там нет никаких проблемМои данные изображения (X) имеют следующую структуру (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)
Большое спасибо!