TensorFlow中CNN的样本加权

时间:2019-03-12 07:22:45

标签: python tensorflow machine-learning

我有一个在Tensorflow中实现的CNN,改编自该教程: CNN with Estimators

摘录自data_input_fn:

dataset = dataset.batch(batch_size)  
iterator = dataset.make_one_shot_iterator()
features, labels = iterator.get_next()
return features, labels

来自model_fn的摘录:

loss = tf.losses.softmax_cross_entropy(onehot_labels=labels, logits=logits)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
train_op = optimizer.minimize(  loss=loss)

我正在使用tf.estimator.Estimator并在调用train函数时提供step = 10000。在训练过程中,如何为数据集中的所有样本(约3M个样本)提供权重?我的理解是,在第一个模型的训练过程中,所有样本的权重均等(1 / N),并用于计算加权损失。然后,基于计算出的损耗值,应该在训练下一个模型时修改,保存和重新加载权重。是否应该从csv文件中提供权重,因为原始的TF记录文件不包含权重,或者有更好的方法吗?另外,是否有接受的功能可以根据损耗值修改权重?

3 个答案:

答案 0 :(得分:0)

每个样本没有权重,但是权重是针对输入向量+偏差的。因此,一个接受大小为n的向量的感知器(或一个神经元)将具有n个权重+ 1个偏差。并且您不会传递权重(直到您将其用于预测之前是经过预先训练的模型),将它们初始化,然后让模型训练权重。模型不过是模型架构+权重

单个神经元的权重

from keras.layers import Input, Dense
from keras.models import Model

model = Sequential()
model.add(Dense(1, input_dim=3))

print (model.summary())

_________________________________________________________________ Layer (type) Output Shape Param # ______________________________________________________________ dense_11 (Dense) (None, 1) 4 ________________________________________________________________ Total params: 4 Trainable params: 4 Non-trainable params: 0 _________________________________________________________________

您可以在模型定义中看到,它是单个神经元(无非线性激活),输入(X)大小为3。神经元每个特征的权重为1,偏差为1 = 3。 np.dot(W, X) + b。我们从随机权重和传播算法开始,学习正确的权重。

一旦学习了权重,我们就会将权重与模型架构一起存储,并在以后用于对看不见的数据进行预测。

卷积层中的权重

model = Sequential()
model.add(Conv2D(1, kernel_size=3, activation='relu', input_shape=(10,10,1)))
print (model.summary())

_________________________________________________________________ Layer (type) Output Shape Param # ______________________________________________________________ conv2d_4 (Conv2D) (None, 8, 8, 1) 10 ________________________________________________________________ Total params: 10 Trainable params: 10 Non-trainable params: 0 _________________________________________________________________

内核大小为3,因此该层的权数为3 * 3 +1偏差= 10

答案 1 :(得分:0)

可以在张量流中使用样本加权。几乎每个损失函数都带有一个“权重”参数,如果传递正确形状的张量,该参数将用于加权样本。

答案 2 :(得分:0)

AdaBoost通常不与神经网络一起使用。培训他们的费用使合奏方法的吸引力降低。因此,如果您要这样做,则可能必须自己实施。

如果您的模型是二进制分类器,则可以向tf.nn.weighted_cross_entropy_with_logits提供类权重。