#tensorflow #keras
Вопрос:
У меня есть данные, содержащие логическую функцию (X), Есть ли какой-либо способ сделать образцы, содержащие x=1, более важными, чем другие образцы?
NB1: Делая определенные обучающие выборки более важными, я имею в виду, что эти выборки могут повлиять на модель больше, чем другие выборки. Я уже читал что-то подобное на эту тему, но я не смог понять это правильно. Вот что я прочитал:
В TensorFlow Keras легко сделать некоторые обучающие выборки более важными. Обычный вывод из класса DataGenerator(tf.keras.utils.Последовательность) равна (X,y). Вместо этого выведите (X,y,w), где вес имеет ту же форму, что и у. Затем сделайте w=2 для всех положительных целей и w=1 для всех отрицательных целей. Затем тренируйтесь с обычными вызовами TensorFlow Keras t_gen = DataGenerator() model.fit(t_gen)
NB2: Я работаю с LSTM
Комментарии:
1. Ваш вопрос мне непонятен, что вы подразумеваете под «приданием большего значения» ? С какой сетью вы работаете ?
2. Что именно вы подразумеваете под «более важным»?
3. Я сожалею, потому что вопрос не был ясен с самого начала. И я надеюсь, что теперь это ясно.
Ответ №1:
Я предполагаю, что под «более важным» вы подразумеваете, что образцы с x=1 окажут большее влияние на функцию затрат, чем образцы, где x не =1. В модели есть два параметра.подгонка, которая может позволить вам сделать это, class_weight или sample_weight. Из документации, расположенной здесь, они описаны ниже:
class_weight: Optional dictionary mapping class indices (integers) to a weight
(float) value, used for weighting the loss function (during training only). This
can be useful to tell the model to "pay more attention" to samples from an under-represented class.
sample_weight: Optional Numpy array of weights for the training samples, used for
weighting the loss function (during training only). You can either pass a flat (1D)
Numpy array with the same length as the input samples (1:1 mapping between weights and samples), or in the case of temporal data, you can pass a 2D array with shape
(samples, sequence_length), to apply a different weight to every timestep of every
sample. This argument is not supported when x is a dataset, generator, or
keras.utils.Sequence instance, instead provide the sample_weights as the third
element of x.
Чтобы получить желаемый результат с помощью sample_weight, вам нужно будет создать генератор, который создает пакеты данных, возвращающие 3 значения, x, y, w, где x-массив образцов, y-массив меток, а w-массив веса образца. В вашем случае вам может потребоваться значение w =1 для всех выборок, где ваше значение x не равно 1, и w=2 для всех выборок, где ваше значение x=1. Это привело бы к тому, что образцы с x=1 оказывали бы вдвое большее влияние на функцию затрат. Информация о том, как создать пользовательский генератор, находится здесь. В коде вам нужно будет определить значение w для каждого образца и вернуть массив w вместе с x и y.
Более простой альтернативой может быть использование class_weight, если x является классом в ваших данных. Например, предположим, что у вас есть набор данных формы:
No of Samples Class Class Index
100 A 0
200 B 1
1700 C 2
Здесь ваш набор данных НЕ сбалансирован, и ваша модель будет склонна предсказывать класс C, так как, если она всегда предсказывает класс C, она будет правильной в 85% случаев. Чтобы справиться с этим, мы хотели бы, чтобы классы A и B оказывали повышенное влияние на функцию затрат. Использование параметра class_weight обеспечивает эту возможность. Мы хотели бы, чтобы класс А имел
1700/100=в 17 раз большее влияние на функцию затрат, чем класс C, и класс B, чтобы иметь
1700/200=в 8,5 раз больше влияет на функцию затрат, чем класс C, поэтому наш словарь class_weight будет выглядеть следующим образом
class_weight={0:17, 1:8.5, 2:1}