Как сказал тангенс, размер массива фиксирован. Но сначала вам нужно создать экземпляр, иначе это будет только нулевая ссылка.
String[] where = new String[10];
Этот массив может содержать только 10 элементов. Таким образом, вы можете добавить значение всего 10 раз. В вашем коде вы получаете нулевую ссылку. Вот почему он не работает. Чтобы иметь динамически растущую коллекцию, используйте ArrayList.
В1) Почему мы ввели вектор внедрения слова (300 dim) в качестве весов в слой внедрения LSTM?
blockquote>Очень упрощенно вы можете представить слои внедрения как таблица поиска, которая преобразует слово (представленное его индексом в словаре) в вектор. Это обучаемые слои. Поскольку вы уже обучили встраиванию слов вместо того, чтобы инициализировать слой встраивания со случайным весом, вы инициализируете его с помощью векторов, которые вы изучили.
Embedding(len(word_index)+1, 300, weights=[embedding_matrix], trainable=False)(input_layer)
Итак, вы
- создаете слой внедрения или справочную таблицу, которая может искать индексы слов от 0 до len (word_index).
- Каждое найденное слово будет отображаться в векторе размером 300.
- Эта таблица поиска загружена векторами из «embedding_matrix» (которая является предварительно обученной моделью).
- trainable = False замораживает вес в этом слое.
Вы прошли 300, потому что это размер вектора вашей предварительно обученной модели (embedding_matrix)
Q2) Как мы можем узнать оптимальное число нейронных элементов в слое LSTM?
< / blockquote>Вы создали слой LSTM, в котором на вход берется вектор размера 300 и возвращается вектор размера 300. Выходной размер и количество уложенных LSTMS являются гиперпараметрами, которые настраиваются вручную (обычно с использованием KFold CV)
Q3) Не могли бы вы объяснить, как обрабатывается одна запись в алгоритме LSTM?
blockquote>
- Одна запись / предложение (я) преобразуются в индексы словаря. Таким образом, для каждого предложения у вас есть массив индексов.
- Партия этих предложений создается и подается в качестве входных данных для модели.
- LSTM разворачивается, передавая по одному индексу за раз в качестве входных данных на каждом временном шаге.
- Наконец, выходной сигнал LSTM передается прямым финальным плотным слоем до размера 33. Таким образом, похоже, что каждый вход сопоставлен с одним из 33 классов в вашем случае.
Простой пример
import numpy as np from keras.preprocessing.text import one_hot from keras.preprocessing.sequence import pad_sequences from keras.models import Sequential from keras.layers import Dense from keras.layers import Flatten, LSTM from keras.layers.embeddings import Embedding from nltk.lm import Vocabulary from keras.utils import to_categorical training_data = [ "it was a good movie".split(), "it was a bad movie".split()] training_target = [1, 0] v = Vocabulary([word for s in training_data for word in s]) model = Sequential() model.add(Embedding(len(v),50,input_length = 5, dropout = 0.2)) model.add(LSTM(10, dropout_U = 0.2, dropout_W = 0.2)) model.add(Dense(2,activation='softmax')) model.compile(loss = 'categorical_crossentropy', optimizer='adam',metrics = ['accuracy']) print(model.summary()) x = np.array([list(map(lambda x: v[x], s)) for s in training_data]) y = to_categorical(training_target) model.fit(x,y)