我有一个在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记录文件不包含权重,或者有更好的方法吗?另外,是否有接受的功能可以根据损耗值修改权重?
答案 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提供类权重。