Nano Hash - криптовалюты, майнинг, программирование

Как указать вход со списком массивов для слоя встраивания в Keras?

Я пытаюсь выполнить генерацию текста на уровне слов и столкнулся с следующей проблемой:

Мой ввод выглядит так:

   tokenized_seq = [[w2v_model.wv.vocab[word].index for word in w2v_data[i]] for i in range(len(w2v_data))]
   x_seq = []
   y_seq = []

   for seq in tokenized_seq:
      x_seq.append(seq[:-1])
      y_seq.append([seq[-1]])

Итак, я иду по последовательности (закодированные слова usnig word2vec) с скользящим окном фиксированного размера (токенизированный _seq — это список последовательностей фиксированной длины).

Посмотрите пример:

Блок кода:

print(x_seq[0], '->', y_seq[0])  
print(' '.join([w2v_model.wv.index2word[i] for i in x_seq[0]]), '->', w2v_model.wv.index2word[y_seq[0].pop()]) 

Выход:

[608, 1661, 1, 4260, 1, 3, 2978, 741, 0, 153, 740, 1, 12004] -> [109]
часть первая . i . — eh bien , mon prince . gênes -> et

Итак, я пытаюсь ввести все вышеперечисленное в слой Embedding.

model = Sequential()
model.add(Embedding(input_dim=vocab_size,
                    output_dim=emdedding_size,
                    input_length=avg_sent_len-1,
                    weights=[predtrained_weights]
                    trainable=False))

model.add(Bidirectional(LSTM(units=128)))

model.add(Dense(units=vocab_size, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

history = model.fit(x_seq, y_seq,
                   epochs=10,
                   batch_size=128,
                   validation_split=0.2,
                   verbose=2)

Параметры встраивания:

predtrained_weights = w2v_model.wv.vectors
vocab_size, emdedding_size = w2v_model.wv.vectors.shape

avg_sent_len — длина каждой последовательности в x_seq.

Модель компилируется хорошо, но при подгонке получаю следующую ошибку:

ValueError: Error when checking target: expected dense_40 to have shape (31412,) but got array with shape (223396,) 

(31412,) равно vocab_size 223396 равно x_seq или y_seq длине (количество входных последовательностей) Итак, кто-нибудь может мне помочь?


Ответы:


1

Вы вводите x_seq должен быть один пустой массив формы (batch_size, seq_len). Попробуйте добавить x_seq = np.array(x_seq).

02.04.2019
  • Спасибо, это помогло, но у меня все еще есть проблемы с встраиванием ввода. Ожидается, что ввод будет в форме vocab_size, но предоставленный ввод (и я думаю, что это правильный путь) - это x_seq.shape, что не то же самое. Так что я немного смущен 02.04.2019
  • Вероятно, проблема заключается в том, что слой BiLSTM следует за вашим слоем внедрения. input_shape этого слоя должно быть (seq_len, embedding_size), а не (vocab_size, seq_len), как вы написали в своем коде. Если это не поможет, предоставьте сообщение об ошибке, которое вы получите. 02.04.2019
  • Я пытался использовать как неуказанный LSTM: model.add(Bidirectional(LSTM(units=128)) как в нескольких примерах, так и указать форму ввода, как вы сказали: model.add(Bidirectional(LSTM(units=128, input_shape=(len(x_seq), emdedding_size)))) И оба способа не помогли. Сообщение об ошибке, которое я получаю: ValueError: Error when checking target: expected dense_34 to have shape (31412,) but got array with shape (223396,) 31412, - размер словаря, 223396 - длина x_seq (вход) 02.04.2019
  • Эта ошибка связана с целями (y_seq), а не с входами (x_seq). Ваша цель должна иметь форму (batch_size, vocab_size), где каждая из строк является одной горячей кодировкой. И вы действительно можете просто пропустить input_shape слоя LSTM. 02.04.2019
  • Если вы используете categorical_crossentropy как потерю, ваши метки обязательно должны быть закодированы в горячем режиме. В качестве альтернативы вы можете использовать sparse_categorical_crossentropy. В этом случае ваши метки должны иметь форму (batch_size, 1) и не быть закодированы горячим способом. Например, следующие фиктивные данные будут работать с разреженной категориальной кроссэнтропией: x_seq = np.random.rand(n_samples, seq_len) и y_seq = np.random.randint(0, vocab_size, n_samples).reshape((-1,1)). 02.04.2019
  • Большое спасибо! Мне было очень плохо использовать catigorical_crossetrpy вместо sparse_categorical_crossentropy. После добавления префикса sparse в функцию активации все заработало. 03.04.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..