Keras:有没有一种简单的方法可以在各个时期之间在训练集中进行数据的突变(随机化)?

时间:2018-07-31 22:55:33

标签: python tensorflow keras

在不争论是否实际执行此操作的利弊的情况下,我很好奇是否有人在使用keras拟合模型期间创建或知道一种简单的方法来在各个时期之间对训练数据进行变异。

示例:我有100个向量和输出要素用于训练模型。我从其中80个随机选择训练集,另20个用于验证,然后运行afterEvaluate。 Keras拟合使人们可以使用afterEvaluate { prepareInplaceWebApp { doLast { println "hello world" } } } 调整训练数据的顺序,但这只是随机更改训练数据的顺序。从训练集中随机选取40个向量,运行一个历元,然后随机抽取另外40个向量,运行另一个历元,等等可能很有趣。

3 个答案:

答案 0 :(得分:4)

https://keras.io/models/model/#fit

model.fit()有一个自变量steps_per_epoch。如果设置shuffle=True并选择steps_per_epoch足够小,您将得到您描述的行为。

在具有80个训练示例的示例中:例如,您可以将batch_size设置为20,将steps_per_epoch设置为2,或者将batch_size设置为10,将steps_per_epoch设置为4,依此类推。

答案 1 :(得分:1)

我发现同时指定public ActionResult PieCount() { int undefined = db.EMPs.Where(x => x.JS_REF == 1).Count(); int regular = db.EMPs.Where(x => x.JS_REF ==2 ).Count(); int contractual = db.EMPs.Where(x => x.JS_REF == 3).Count(); int probationary = db.EMPs.Where(x => x.JS_REF ==4 ).Count(); int notdefined = db.EMPs.Where(x => x.JS_REF == null ).Count(); Ratio obj = new Ratio(); obj.Undefined = undefined; obj.Contractual = contractual; obj.Regular = regular; obj.Probationary = probationary; obj.Notdefined = notdefined; return Json(new { result = obj }, JsonRequestBehavior.AllowGet); } steps_per_epoch会引发错误。您可以在下面链接的代码中找到对应的代码行(请搜索batch_size)。因此,我们需要实现一个数据生成器以实现这种行为。

https://github.com/keras-team/keras/blob/1cf5218edb23e575a827ca4d849f1d52d21b4bb0/keras/engine/training_utils.py

答案 2 :(得分:0)

(目前)实现这种结果的唯一方法是使用Generator:

from tensorflow.python.keras.utils import Sequence
import numpy as np   

class mygenerator(Sequence):
def __init__(self, x_set, y_set, batch_size):
    self.x, self.y = x_set, y_set
    self.batch_size = batch_size

def __len__(self):
    return int(np.ceil(len(self.x) / float(self.batch_size)))

def __getitem__(self, idx):
    batch_x = self.x[idx * self.batch_size:(idx + 1) * self.batch_size]
    batch_y = self.y[idx * self.batch_size:(idx + 1) * self.batch_size]

    # read your data here using the batch lists, batch_x and batch_y
    x = [my_readfunction(filename) for filename in batch_x] 
    y = [my_readfunction(filename) for filename in batch_y]
    return np.array(x), np.array(y)

要获得所需的行为,可以更改函数__getitem__以便每次都随机分配一个