Почему веса моего образца ломают мою нейронную сеть? - PullRequest
0 голосов
/ 18 февраля 2020

Обращаем ваше внимание, что я новичок в тензорном потоке и в общем машинном обучении.

У меня тренировка нейронной сети на наборе несбалансированных данных, и поэтому мне требуются разные веса выборки.

Моя модель построена так:

def loss(a1, a2):
    customloss = keras.backend.mean(keras.backend.square((a1 - a2)))
    return customloss

def build_model():
    model = keras.Sequential()
    model.add(keras.layers.Dense(101, activation=keras.activations.linear, input_shape=(101,)))
    model.add(keras.layers.Dense(101, activation=keras.activations.linear))
    model.add(keras.layers.Dense(101))

    optimizer = keras.optimizers.RMSprop(0.00001)

    model.compile(loss=loss, optimizer=optimizer, metrics=['mae', 'accuracy'])

    return model

, и я тренирую ее так:

EPOCHS=400
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=20)
model = build_model()
history = model.fit(x, y, epochs=EPOCHS, validation_split=0.2, verbose=1, sample_weight=weights, callbacks=[early_stop])

, где weights - массив формы (9171,) и x и y каждый имеет форму (9171,101).

Если я уберу аргумент sample_weight, сеть запустится. Но с этим на месте, я получаю следующее сообщение об ошибке:

Epoch 1/400
Traceback (most recent call last):
  File "nnotest.py", line 153, in <module>
    history = model.fit(x, y, epochs=EPOCHS, validation_split=0.2, verbose=1, sample_weight=weights, callbacks=[early_stop])
  File "/home/star2/hgc4/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 780, in fit
    steps_name='steps_per_epoch')
  File "/home/star2/hgc4/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_arrays.py", line 363, in model_iteration
    batch_outs = f(ins_batch)
  File "/home/star2/hgc4/.local/lib/python3.6/site-packages/tensorflow/python/keras/backend.py", line 3292, in __call__
    run_metadata=self.run_metadata)
  File "/home/star2/hgc4/.local/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1458, in __call__
    run_metadata_ptr)
tensorflow.python.framework.errors_impl.InvalidArgumentError: Can not squeeze dim[0], expected a dimension of 1, got 32
     [[{{node loss_1/dense_8_loss/weighted_loss/Squeeze}}]]

У меня есть идеи о том, почему это может не работать. Я понимаю, что он может пытаться разобрать мой 1D массив в размер пакета по умолчанию 32, но я не могу понять, почему. Из прочтения документации может показаться, что вы можете добавить одномерный массив для составления одномерного отображения весов в тренировочные данные, так что это должно быть легко? Чего мне не хватает?

1 Ответ

0 голосов
/ 18 февраля 2020

Потому что у вашей потери нет образцов. Вы получаете глобальное среднее.

Если вы хотите получить среднеквадратическую ошибку, скомпилируйте с loss='mse'.

В противном случае не сверните размер партии (ось = 0):

def loss(true, pred):
    return keras.backend.mean(keras.backend.square(true-pred), axis=-1)
...