Keras реализует генератор данных, который выводит sample_weight

Я использую генератор данных для питания fit_generator. Мой генератор имеет на выходе кортеж (x_val, y_val, val_sample_weights), поэтому он показывает веса образца. Это похоже на:

import numpy as np
import keras
import librosa
from time import time
import random
from config import *

class DataGenerator(keras.utils.Sequence):

    'Generates data for Keras'

    def __init__(self, dataframe, batch_size=None, dim=None, labels_dim=None,
                 n_classes=None, shuffle=True, samples=None, duration=None, sample_weights=None):
        'Initialization'
        self.dim = dim
        self.batch_size = batch_size

        self.dataframe = dataframe
        self.dataframe = self.dataframe.sample(n=len(self.dataframe))
        self.samples = samples
        self.on_epoch_end()
        self.shuffle = shuffle
        self.sample_weights = sample_weights

    def __len__(self):
        'Denotes the number of batches per epoch'
        return int(np.floor(len(self.dataframe) / self.batch_size))

    def __getitem__(self, index):
        'Generate one batch of data'
        random_pd = self.dataframe.iloc[self.batch_size*index : (index+1)*self.batch_size]
        # Generate data
        X, y = self.__data_generation(random_pd)
        return X, y
    def __data_generation(self, random_pd):
        'Generates data containing batch_size samples' # X : (n_samples, *dim, n_channels)
        # Initialization
        X = np.empty((self.batch_size, 1, self.samples))
        y = np.empty((self.batch_size, self.n_classes))
        i = 0
        while i < self.batch_size:
            for index, row in random_pd.iterrows():
                 # generate 
                y[i,] = label
                X[i,] = ...
                i += 1
        return X, y, self.sample_weights

поэтому он вернет X, y, self.sample_weights.

Проблема в том, что мы получим StopIteration: too many values to unpack, как и ожидалось 2, но я даю 3 значения - как и делаю на самом деле.

Traceback (most recent call last):
File "train.py", line 438, in <module>
train()
File "train.py", line 422, in train
callbacks=callbacks
File "/usr/local/lib/python2.7/dist-packages/keras/legacy/interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/keras/models.py", line 1315, in fit_generator
initial_epoch=initial_epoch)
File "/usr/local/lib/python2.7/dist-packages/keras/legacy/interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 2250, in fit_generator
max_queue_size=max_queue_size)
File "/usr/local/lib/python2.7/dist-packages/keras/legacy/interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 2383, in evaluate_generator
generator_output = next(output_generator)
File "/usr/local/lib/python2.7/dist-packages/keras/utils/data_utils.py", line 584, in get
six.raise_from(StopIteration(e), e)
File "/usr/local/lib/python2.7/dist-packages/six.py", line 737, in raise_from
raise value
StopIteration: too many values to unpack 

Я вызываю fit_generator, как обычно, передавая свой training_generator, затем

history = model.fit_generator(generator=training_generator,
                                class_weight=class_weights,
                                verbose=1,
                                use_multiprocessing=True,
                                workers=24, 
                                steps_per_epoch=training_steps_per_epoch,
                                epochs=epochs,
                                validation_data=validation_generator,
                                validation_steps = validation_steps_per_epoch,
                                callbacks=callbacks
                                )

Я делаю это, потому что при использовании fit_generator невозможно передать sample_weight, поскольку подпись метода поддерживает только class_weight - см. Здесь https://github.com/keras-team/keras/issues/11800

Вы должны передавать веса выборки как партии, точно так же, как x и y.

Daniel Möller 05.12.2018 17:29

Я не понимаю, что ты имеешь в виду. Должен ли я разделять sample_weights на партии или рассчитывать «на лету» для каждой партии в процессе генерации данных?

loretoparisi 05.12.2018 17:38

Сделайте то же самое, что и с X и Y. Делайте партии, а не передавайте все.

Daniel Möller 05.12.2018 17:41

Хорошо, сейчас я думаю, что перепутал sample_weight и class_weight. Я хочу первый, чтобы веса были применены к проигрышу. В принципе sample_weights = class_weight.compute_sample_weight('balanced', y) в генераторе от sklearn.utils должен делать ...

loretoparisi 05.12.2018 17:47

@ DanielMöller, использующий пакет типа sample_weights = class_weight.compute_sample_weight('balanced', y_batch), все еще выдает ошибку too many values to unpack. Я тоже пробовал - datascience.stackexchange.com/questions/31129/…

loretoparisi 05.12.2018 18:08
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
552
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ох .... посмотри на свои ответные заявления ...

__data_generation возвращает 3 вещи. Но ты делаешь X, y = self.__data_generation(random_pd)

Попытка получить три значения (X,y,weights) в две переменные (X,y).

Обратите внимание, что __get_item__ также не возвращает веса.

Ах так! Теперь мы ближе! Теперь дело в том, что если я использую X, y, sample_weight = self.__data_generation(random_pd), то почему я получаю ValueError: Error when checking target: expected dense_1 to have shape (4,) but got array with shape (1,) (у меня 4 класса).

loretoparisi 05.12.2018 18:17

Я думаю, это что-то для другого вопроса, где вы публикуете свою модель и y.shape, когда он выходит из генератора.

Daniel Möller 05.12.2018 18:24

Другие вопросы по теме