【发布时间】:2020-06-02 11:25:15
【问题描述】:
请注意,我是 tensorflow 和一般机器学习的新手。
我对一组不平衡的数据进行了神经网络训练,因此我需要不同的样本权重。
我的模型是这样构造的:
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}}]]
我对为什么这可能不起作用有我的想法。我知道它可能正在尝试将我的一维数组解析为默认批量大小 32,但我不明白为什么。从阅读the documentation 看来,您可以添加一个一维数组来构成从权重到训练数据的一维映射,所以这应该很容易吗?我错过了什么?
【问题讨论】:
-
你的标签是什么?你的网络输出一个矩阵 Nx101
-
不确定你的意思。
-
我的意思是你的
y.shape的形状。它应该与网络的输出形状相同 -
y 的形状为 (9171, 101),x 也是如此。
标签: python tensorflow machine-learning keras neural-network