Не удалось получить графики метрик модели SentenceTransformer.Python

Программы на Python
Ответить
Anonymous
 Не удалось получить графики метрик модели SentenceTransformer.

Сообщение Anonymous »

Я создаваю модель Seedencetransformer ('All-Minilm-L6-V2'), используя словарь (JSON) с названием Category_Descriptions в качестве набора данных.
Ниже приведен Структура данных Category_descriptions :
{
"CategoryA": {
"CategorySearch": "Description for CategoryA",
"SubCategory1": "Description for SubCategory1 of CategoryA",
"SubCategory2": "Description for SubCategory2 of CategoryA",
...
},
"CategoryB": {
"CategorySearch": "Description for CategoryB",
"SubCategory1": "Description for SubCategory1 of CategoryB",
"SubCategory2": "Description for SubCategory2 of CategoryB",
...
},
...
}

Я не могу получить точность обучения, потерю обучения, точность проверки, потерю проверки. Я пробовал много способов, но результат обычно заканчивается TypeError: FitMixin.smart_batching_collate() отсутствует 1 обязательный позиционный аргумент: 'batch'
Использовал ли я неправильный collate_fn или определите неверную функцию потерь?
Ниже приведены мои процессы точной настройки:
  • Читать категорию описания и описания подкатегорий из файла json.
  • Преобразуйте данные в объекты InputExample.
  • Преобразуйте текстовые метки в числовые индексы.
  • Разделить набор данных на 80% обучающих данных и 20% проверочных данных.
  • Используйте SentenceTransformer('all-MiniLM-L6-v2') в качестве предварительного обученный model.
  • Создайте загрузчик данных для данных обучения и данных проверки.
  • Используйте SoftmaxLoss в качестве функции потерь.
  • Модель точной настройки.
  • Построение результатов.
Ниже приведена часть кода, предназначенная для точной настройки:
with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'Embedding Dictionary.json'), 'r', encoding='utf-8') as f:
category_descriptions = json.load(f)

training_data = []

for category, subcats in category_descriptions.items():
if 'CategorySearch' in subcats:
training_data.append(InputExample(texts=[subcats["CategorySearch"], ''], label=category))

for subcat, description in subcats.items():
if subcat != "CategorySearch":
training_data.append(InputExample(texts=[description, ''], label=subcat))

all_labels = list(set(example.label for example in training_data))

label_to_index = {label: idx for idx, label in enumerate(all_labels)}
index_to_label = {idx: label for label, idx in label_to_index.items()}

for example in training_data:
example.label = label_to_index[example.label]

train_data, valid_data = train_test_split(training_data, test_size=0.2, random_state=42)

org_model = SentenceTransformer('all-MiniLM-L6-v2')

train_dataloader = DataLoader(train_data, shuffle=True, batch_size=8, collate_fn=SentenceTransformer.smart_batching_collate)
valid_dataloader = DataLoader(valid_data, shuffle=False, batch_size=8, collate_fn=SentenceTransformer.smart_batching_collate)

loss_function = losses.SoftmaxLoss(model=org_model, num_labels=len(all_labels), sentence_embedding_dimension=org_model.get_sentence_embedding_dimension())

epochs = 5
warmup_steps = 20

train_losses, valid_losses = [], []
train_accuracies, valid_accuracies = [], []

for epoch in range(epochs):

org_model.train()
train_loss, train_correct, train_total = 0, 0, 0
for batch in train_dataloader:
loss_value = loss_function(batch)
loss_value.backward()
org_model.optimizer.step()
org_model.optimizer.zero_grad()
train_loss += loss_value.item()
predictions = loss_function.get_prediction(batch)
train_correct += (predictions == batch['labels']).sum().item()
train_total += len(batch['labels'])

train_losses.append(train_loss / len(train_dataloader))
train_accuracies.append(train_correct / train_total)

org_model.eval()
valid_loss, valid_correct, valid_total = 0, 0, 0
with torch.no_grad():
for batch in valid_dataloader:
loss_value = loss_function(batch)
valid_loss += loss_value.item()
predictions = loss_function.get_prediction(batch)
valid_correct += (predictions == batch['labels']).sum().item()
valid_total += len(batch['labels'])

valid_losses.append(valid_loss / len(valid_dataloader))
valid_accuracies.append(valid_correct / valid_total)

print(f"Epoch {epoch + 1}/{epochs}")
print(f"Training Loss: {train_losses[-1]:.4f}, Training Accuracy: {train_accuracies[-1]:.4f}")
print(f"Validation Loss: {valid_losses[-1]:.4f}, Validation Accuracy: {valid_accuracies[-1]:.4f}")

plt.figure(figsize=(12, 6))

plt.subplot(1, 2, 1)
plt.plot(range(1, epochs + 1), train_losses, label='Training Loss', marker='o')
plt.plot(range(1, epochs + 1), valid_losses, label='Validation Loss', marker='o')
plt.title('Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()

plt.subplot(1, 2, 2)
plt.plot(range(1, epochs + 1), train_accuracies, label='Training Accuracy', marker='o')
plt.plot(range(1, epochs + 1), valid_accuracies, label='Validation Accuracy', marker='o')
plt.title('Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()

plt.tight_layout()
plt.show()


Подробнее здесь: https://stackoverflow.com/questions/793 ... rmer-model
Ответить

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

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

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

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

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