Данные обучения и метки не имеют одинаковой формы после маскировки из-за заполнения.Python

Программы на Python
Ответить
Anonymous
 Данные обучения и метки не имеют одинаковой формы после маскировки из-за заполнения.

Сообщение Anonymous »

Итак, я немного затрудняюсь с концепциями заполнения и маскировки.
Задача — это POS-теги в НЛП, и у меня есть 14987 предложений обучения, 46 занятий.
По сути, у меня есть тензор меток, который дополняется до одинаковой длины с помощью -1.
Поэтому, применяя маску на основе значения -1, можно игнорировать позицию -1.
Код следующий:

Код: Выделить всё

max_sentence_len = 124
y_train = pad_sequences(my_train_y, maxlen=max_sentence_len, padding='post', value=-1)
y_val = pad_sequences(my_valid_y, maxlen=max_sentence_len, padding='post', value=-1)
y_test = pad_sequences(my_test_y, maxlen=max_sentence_len, padding='post', value=-1)
# Output: y_train, y_val, y_test of shape
# (14987, 124)
# (3465, 124)
# (3683, 124)
Так, например:

Код: Выделить всё

> y_train
array([[ 0, -1, -1, ..., -1, -1, -1],
[ 1,  2,  3, ..., -1, -1, -1],
[ 1,  1, -1, ..., -1, -1, -1],
...,
[ 4,  8,  1, ..., -1, -1, -1],
[ 4,  8, -1, ..., -1, -1, -1],
[ 4,  8,  1, ..., -1, -1, -1]], dtype=int32)
Код маски, правильный ли я не знаю:

Код: Выделить всё

def mask(tensor, value):
mask = tf.not_equal(tensor, value)  # mask
mask = tf.cast(mask, tf.bool)
print("mask", mask.shape)
# Reshape del tensore
tensor_flat = tf.reshape(tensor, [-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_labels = tf.boolean_mask(tensor_flat, mask_flat)  # Output: (num_valid_timesteps, dim)
return masked_labels
Затем нанесение маски:

Код: Выделить всё

masked_labels = mask(y_train_tensor, -1)
masked_val_labels = mask(y_val_tensor, -1)
masked_test_labels = mask(y_test, -1)

nout = len(np.unique(masked_labels)) # nclasses for the onehot encoding

labels_tr = tf.one_hot(masked_labels, depth=nout)
labels_vl = tf.one_hot(masked_val_labels, depth=nout)
labels_test = tf.one_hot(masked_test_labels, depth=nout)

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)
В то же время у меня есть последовательности поездов, которые в данном случае дополняются 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, 0) # because 0 was the padding
# Output: X_train: (14987, 124, 1000)

masked_states = train_mask(states) # I thought to obtain (204567, 1000) like before for the labels

#Output: masked_states: (1858388,1000)
Метки (204567, 46), поэтому у меня несовпадение.
Может случиться так, что после вычисления состояний у меня есть другие 0 и не только те, что касаются заполнения, но я не могу выполнить маскирование перед вычислением состояний, потому что tf хочет, чтобы на входе был 3D-тензор...
У кого-нибудь есть какие-нибудь предложения?

Подробнее здесь: https://stackoverflow.com/questions/791 ... ue-padding
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»