Итак, я немного затрудняюсь с концепциями заполнения и маскировки.
Задача — это POS-теги в НЛП, и у меня есть 14987 предложений обучения, 46 занятий.
По сути, у меня есть тензор меток, который дополняется до одинаковой длины с помощью -1.
Поэтому, применяя маску на основе значения -1, можно игнорировать позицию -1.
код следующий:
В то же время у меня есть последовательности поездов, которые в данном случае дополняются 0 до одинаковой длины, после этого существует также функция, которая связывает каждый fasttext 300-dim встраивает в каждое слово и резервирует вектор размером 300dim от 1e-10 для токена OOV и вектор нулей размером 300dim для позиции заполнения (отмеченный 0 как я уже говорил ранее)
tokenizer = Tokenizer(oov_token='')
tokenizer.fit_on_texts(my_train_input)
# Converti le frasi di train, validation e test in sequenze di indici
X_train_sequences = tokenizer.texts_to_sequences(my_train_input)
X_val_sequences = tokenizer.texts_to_sequences(my_valid_input)
X_test_sequences = tokenizer.texts_to_sequences(my_test_input)
# Applica il padding a tutte le sequenze
X_train_padded = pad_sequences(X_train_sequences, maxlen=max_sentence_len, padding='post', value=0)
X_val_padded = pad_sequences(X_val_sequences, maxlen=max_sentence_len, padding='post', value=0)
X_test_padded = pad_sequences(X_test_sequences, maxlen=max_sentence_len, padding='post', value=0)
Функция, которая связывает каждое слово с его встраиванием, следующая: как я уже говорил, я резервирую вектор размером 300dim 1e-10 для токена OOV и один 300dim нулей для позиции заполнения.< /p>
def getX(input_indices, model, vector_size=300):
x = []
OOV_count = 0
token_count = 0
# Cambiamo il vettore di OOV con piccoli valori costanti, e manteniamo gli zeri per il padding
oov_vector = np.full(vector_size, 1e-10) # Usa un valore non nullo per distinguere dagli zeri
for sentence in input_indices:
v = []
for idx in sentence:
if idx == 0: # Se è padding, usa il vettore di zeri
wv = np.zeros(vector_size)
else:
word = tokenizer.index_word.get(idx, None)
if word and word in model.key_to_index:
wv = model[word]
else:
wv = oov_vector # Assegna il vettore OOV non nullo
OOV_count += 1
token_count += 1
v.append(wv)
x.append(v)
print("Out of vocabulary rate: %f" % (OOV_count / token_count))
print("Vocabulary cover rate: %f" % ((token_count - OOV_count) / token_count))
return np.array(x, dtype=np.float32)
X_train = getX(X_train_padded, model)
X_val = getX(X_val_padded, model)
X_test = getX(X_test_padded, model)
Результатом getX является тензор поезда (14987, 124), тензор val (3465, 124) и тестовый тензор (3683, 124), поэтому они не соответствуют меткам ( после маскировки они были (204567, 46) и т. д., как видно ранее). Теперь моя гипотеза заключалась в том, чтобы ввести в RNN поезд и метки и устранить несоответствие, применяя другую маску (но на основе 0, а не -1) в конце вычисления состояний (то есть в трехмерном тензоре), я подумал, что, поскольку у меня была одинаковая дополненная позиция (я думаю (?)) для последовательностей поездов и меток, я получил бы ту же форму.
Но, учитывая маску, которую нужно применить к обучение утверждает, что:
def train_mask(tensor, value):
mask = tf.not_equal(tensor[..., 0], value) # mask
mask = tf.cast(mask, tf.bool)
print("mask", mask.shape)
# Reshape del tensore 3D in una forma 2D per rendere applicabile la maschera
tensor_flat = tf.reshape(tensor, [-1, tensor.shape[-1]]) # Shape: (batch_size * max_len, dim)
# Reshape della maschera a 1D
mask_flat = tf.reshape(mask, [-1]) # Shape: (batch_size * max_len,)
# Applica la maschera per ottenere solo i timesteps validi
masked_states = tf.boolean_mask(tensor_flat, mask_flat) # Output: (num_valid_timesteps, dim)
return masked_states
# States computation
states = RNN.compute_states(X_train)
# Output: X_train: (14987, 124, 1000)
masked_states = train_mask(states, 0) # I thought to obtain (204567, 1000) like before for the labels
#Output: masked_states: (1858388,1000)
Маскированные метки (204567, 46), но маскированные состояния (1858388,1000), поэтому у меня есть несоответствие (204567 != 1858388)
Возможно, после вычисления состояний у меня есть другие 0, а не только те, что в заполнении, но я не могу выполнить маскирование перед вычислением состояний, потому что tf хочет, чтобы на входе был 3D-тензор...
У кого-нибудь есть предложения?
print("labels tr:", labels_tr.shape) print("labels vl", labels_vl.shape) print("labels test:", labels_test.shape) # Outputs: mask (14987, 124) mask (3465, 124) mask (3683, 124) labels tr: (204567, 46) labels vl (51574, 46) labels test: (46625, 46) [/code] В то же время у меня есть последовательности поездов, которые в данном случае дополняются 0 до одинаковой длины, после этого существует также функция, которая связывает каждый fasttext 300-dim встраивает в каждое слово и резервирует вектор размером 300dim от 1e-10 для токена OOV и вектор нулей размером 300dim для позиции заполнения (отмеченный 0 как я уже говорил ранее) [code]tokenizer = Tokenizer(oov_token='') tokenizer.fit_on_texts(my_train_input)
# Converti le frasi di train, validation e test in sequenze di indici X_train_sequences = tokenizer.texts_to_sequences(my_train_input) X_val_sequences = tokenizer.texts_to_sequences(my_valid_input) X_test_sequences = tokenizer.texts_to_sequences(my_test_input)
# Applica il padding a tutte le sequenze X_train_padded = pad_sequences(X_train_sequences, maxlen=max_sentence_len, padding='post', value=0) X_val_padded = pad_sequences(X_val_sequences, maxlen=max_sentence_len, padding='post', value=0) X_test_padded = pad_sequences(X_test_sequences, maxlen=max_sentence_len, padding='post', value=0) [/code] Функция, которая связывает каждое слово с его встраиванием, следующая: как я уже говорил, я резервирую вектор размером 300dim 1e-10 для токена OOV и один 300dim нулей для позиции заполнения.< /p> [code]def getX(input_indices, model, vector_size=300):
x = [] OOV_count = 0 token_count = 0
# Cambiamo il vettore di OOV con piccoli valori costanti, e manteniamo gli zeri per il padding oov_vector = np.full(vector_size, 1e-10) # Usa un valore non nullo per distinguere dagli zeri
for sentence in input_indices: v = [] for idx in sentence: if idx == 0: # Se è padding, usa il vettore di zeri wv = np.zeros(vector_size) else: word = tokenizer.index_word.get(idx, None) if word and word in model.key_to_index: wv = model[word] else: wv = oov_vector # Assegna il vettore OOV non nullo OOV_count += 1 token_count += 1 v.append(wv) x.append(v)
X_train = getX(X_train_padded, model) X_val = getX(X_val_padded, model) X_test = getX(X_test_padded, model) [/code] Результатом getX является тензор поезда (14987, 124), тензор val (3465, 124) и тестовый тензор (3683, 124), поэтому они не соответствуют меткам ( после маскировки они были (204567, 46) и т. д., как видно ранее). Теперь моя гипотеза заключалась в том, чтобы ввести в RNN поезд и метки и устранить несоответствие, применяя другую маску (но на основе 0, а не -1) в конце вычисления состояний (то есть в трехмерном тензоре), я подумал, что, поскольку у меня была одинаковая дополненная позиция (я думаю (?)) для последовательностей поездов и меток, я получил бы ту же форму. Но, учитывая маску, которую нужно применить к обучение утверждает, что: [code]def train_mask(tensor, value): mask = tf.not_equal(tensor[..., 0], value) # mask mask = tf.cast(mask, tf.bool) print("mask", mask.shape) # Reshape del tensore 3D in una forma 2D per rendere applicabile la maschera tensor_flat = tf.reshape(tensor, [-1, tensor.shape[-1]]) # Shape: (batch_size * max_len, dim) # Reshape della maschera a 1D mask_flat = tf.reshape(mask, [-1]) # Shape: (batch_size * max_len,) # Applica la maschera per ottenere solo i timesteps validi masked_states = tf.boolean_mask(tensor_flat, mask_flat) # Output: (num_valid_timesteps, dim) return masked_states
# States computation states = RNN.compute_states(X_train) # Output: X_train: (14987, 124, 1000)
masked_states = train_mask(states, 0) # I thought to obtain (204567, 1000) like before for the labels
#Output: masked_states: (1858388,1000) [/code] Маскированные метки (204567, 46), но маскированные состояния (1858388,1000), поэтому у меня есть несоответствие (204567 != 1858388) Возможно, после вычисления состояний у меня есть другие 0, а не только те, что в заполнении, но я не могу выполнить маскирование перед вычислением состояний, потому что tf хочет, чтобы на входе был 3D-тензор... У кого-нибудь есть предложения?