Обращаем ваше внимание, что я новичок в тензорном потоке и в общем машинном обучении.
У меня тренировка нейронной сети на наборе несбалансированных данных, и поэтому мне требуются разные веса выборки.
Моя модель построена так:
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, но я не могу понять, почему. Из прочтения документации может показаться, что вы можете добавить одномерный массив для составления одномерного отображения весов в тренировочные данные, так что это должно быть легко? Чего мне не хватает?