在Keras中不重复地分配数据示例的重要性



给定以下数据集设置:

tweet, number of retweets, genre

我想建立一个softmax分类器来预测推特类型。我正在努力寻找一种方法,在不重复数据(推特(的情况下,将样本重要性分配给keras。

例如:对于类型1和类型3,推特#1被转发1000次。对于类型1和类型4,推特#2被转发100次。如何在训练数据中不重复推文1000次的情况下,将推文#1的重要性纳入类型1和类型3?

model = tf.keras.Sequential()
embedding_layer = tf.keras.layers.Embedding(VOCAB_SIZE, EMBEDDING_DIM)
model.add(embedding_layer)
model.add(tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(LSTM_SIZE)))
model.add(tf.keras.layers.Dense(len(GENRES_LIST)+1,activation=tf.keras.activations.softmax))
m = tf.keras.metrics.SparseTopKCategoricalAccuracy(k=1)
opt = tf.keras.optimizers.Adam(learning_rate=0.01)
model.compile(optimizer=opt,
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=[m])

model.fit(train_data, epochs=50, validation_data=test_data,verbose=1)

如果您使用.fit(),我认为复制数据是实现您想要的目标的唯一方法。

或者,您可以考虑使用.train_on_batch().test_on_batch()编写自己的批处理程序。这样,您就可以控制向模型提供的内容。

一个带有参数p的对numpy.random.choice()的简单调用应该可以完成您想要的操作(在您的批处理程序中(:

来源:

  • https://keras.io/api/models/model_training_apis/
  • https://docs.scipy.org/doc//numpy-1.10.4/reference/generated/numpy.random.choice.html

您可以简单地使用sample_weight矩阵并将其传递给.fit函数。因此,假设您有两个推文样本,每个样本都有其转发次数(如您所述(。您只需要为每个样本创建一个一维权重数组(1:1映射(。可以输入整数值,也可以将权重规格化为0到1之间的值。您的数据将如下所示:

X_train = [tweet1, tweet2]
y_train = [[1,0,1,0], [1,0,0,1]] # one-hot encoding
my_sample_weight = [1000,100]
model.fit(train_data, epochs=50, validation_data=test_data, sample_weight=my_sample_weight, verbose=1)

最新更新