Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Keras model.fit()与tf.dataset API+;验证数据_Python_Tensorflow_Keras - Fatal编程技术网

Python Keras model.fit()与tf.dataset API+;验证数据

Python Keras model.fit()与tf.dataset API+;验证数据,python,tensorflow,keras,Python,Tensorflow,Keras,因此,我通过以下代码使我的keras模型与tf.Dataset一起工作: # Initialize batch generators(returns tf.Dataset) batch_train = build_features.get_train_batches(batch_size=batch_size) # Create TensorFlow Iterator object iterator = batch_train.make_one_shot_iterator() dataset_

因此,我通过以下代码使我的keras模型与tf.Dataset一起工作:

# Initialize batch generators(returns tf.Dataset)
batch_train = build_features.get_train_batches(batch_size=batch_size)

# Create TensorFlow Iterator object
iterator = batch_train.make_one_shot_iterator()
dataset_inputs, dataset_labels = iterator.get_next()

# Create Model
logits = .....(some layers)
keras.models.Model(inputs=dataset_inputs, outputs=logits)

# Train network
model.compile(optimizer=train_opt, loss=model_loss, target_tensors=[dataset_labels])
model.fit(epochs=epochs, steps_per_epoch=num_batches, callbacks=callbacks, verbose=1)
但是,当我尝试将
验证\u数据
参数传递给模型时。安装它告诉我,我不能将其与发电机一起使用。在使用tf.Dataset时,有没有一种方法可以使用验证

例如,在tensorflow中,我可以执行以下操作:

# initialize batch generators
batch_train = build_features.get_train_batches(batch_size=batch_size)
batch_valid = build_features.get_valid_batches(batch_size=batch_size)

# create TensorFlow Iterator object
iterator = tf.data.Iterator.from_structure(batch_train.output_types,
                                           batch_train.output_shapes)

# create two initialization ops to switch between the datasets
init_op_train = iterator.make_initializer(batch_train)
init_op_valid = iterator.make_initializer(batch_valid)
然后使用
sess.run(init_op_train)
sess.run(init_op_valid)
在数据集之间切换

我试着实现一个回调,它可以实现这一点(切换到验证集,预测并返回),但它告诉我不能在回调中使用model.predict

有人能帮我用Keras+Tf.Dataset进行验证吗

编辑:将答案合并到代码中 最后,由于选择了答案,对我有效的是:

# Initialize batch generators(returns tf.Dataset)
batch_train = # returns tf.Dataset
batch_valid = # returns tf.Dataset

# Create TensorFlow Iterator object and wrap it in a generator
itr_train = make_iterator(batch_train)
itr_valid = make_iterator(batch_train)

# Create Model
logits = # the keras model
keras.models.Model(inputs=dataset_inputs, outputs=logits)

# Train network
model.compile(optimizer=train_opt, loss=model_loss, target_tensors=[dataset_labels])
model.fit_generator(
    generator=itr_train, validation_data=itr_valid, validation_steps=batch_size,
    epochs=epochs, steps_per_epoch=num_batches, callbacks=cbs, verbose=1, workers=0)

def make_iterator(dataset):
    iterator = dataset.make_one_shot_iterator()
    next_val = iterator.get_next()

    with K.get_session().as_default() as sess:
        while True:
            *inputs, labels = sess.run(next_val)
            yield inputs, labels

这不会引入任何开销

我使用fit\u Generator解决了这个问题。我找到了解决办法。我应用了@Dat Nguyen的解决方案


您只需创建两个迭代器,一个用于培训,一个用于验证,然后创建自己的生成器,从数据集中提取批次,并以(批次数据,批次标签)的形式提供数据。最后,在model.fit_生成器中,您将通过列车生成器和验证生成器

将可重新初始化的迭代器连接到Keras模型的方法是插入一个同时返回x和y值的迭代器:

sess = tf.Session()
keras.backend.set_session(sess) 

x = np.random.random((5, 2))
y = np.array([0, 1] * 3 + [1, 0] * 2).reshape(5, 2) # One hot encoded
input_dataset = tf.data.Dataset.from_tensor_slices((x, y))

# Create your reinitializable_iterator and initializer
reinitializable_iterator = tf.data.Iterator.from_structure(input_dataset.output_types, input_dataset.output_shapes)
init_op = reinitializable_iterator.make_initializer(input_dataset)

#run the initializer
sess.run(init_op) # feed_dict if you're using placeholders as input

# build keras model and plug in the iterator
model = keras.Model.model(...)
model.compile(...)
model.fit(reinitializable_iterator,...)

如果您还有一个验证数据集,最简单的方法就是创建一个单独的迭代器,并将其插入到validation_data参数中。确保按历元和验证步骤定义步骤,因为它们无法推断

因此,我必须在python生成器中封装tensorflow迭代器,如:
iterator=ds.make_one_shot\u iterator(),而True:next_val=iterator.get_next()产生sess.run(next_val)
Hi,这次是我在问你:)。我现在面临着fit_Generator的另一个问题,那就是我可以访问验证数据。例如,您希望在批次级别评估预测值,以便对其进行累积,然后计算整个历元的预测值,以便将其用于AUC度量。你知道我们怎样才能做到这一点吗?或者我应该为它打开一个新帖子。请无论如何打开一个新问题,这样其他人会受益。据我所知,您不能访问minibatch度量,但是定义自定义损失函数并在编译模型时将其包含在度量中应该做到这一点。Keras应该给你每个历元的平均auc这是我从sklearn得到的auc损失函数:
。metrics import roc_auc_score def roc_auc(y_true,y_pred):return roc_auc_score(y_true,y_pred)
@Dat Nguyen的解决方案已更改为将迭代器直接传递到model.fit,而不是fit_生成器。tensor flow 1.9应该支持它,但我不支持,请给出一个错误“AttributeError:“Iterator”对象没有属性“ndim”。更改后,如何将dataset_输入到模型中?我不知道keras.models.Model(inputs=dataset\u inputs,outputs=logits)是如何行的,我假设这是“Model”变量的内容,请您完成代码,我有完全相同的问题,但似乎不知道如何应用您的代码,谢谢advance@mark罗菲尔,我认为这行不正确,应该收到batch\u valid:itr\u valid=make\u迭代器(batch\u train)