c# - 如何将validation_data传递给Model.fit + Dataset?

标签 c# python tensorflow keras

我正在尝试根据生成的数据训练一个简单的顺序网络。我有一个预先计算的验证数据集。

为了提供输入,我使用 tf.data.Dataset API,如下所示: https://stackoverflow.com/a/48134765/231238

var train = Dataset.from_tensor_slices(ValueTuple.Create(trainInputs, trainOutputs));
train = train
    .repeat(2000000)
    .shuffle(buffer_size: 1024 * 8 * InterpolateBy)
    .batch(1024);
model.fit_dyn(train,
    epochs: 6*1024,
    steps_per_epoch: 4
    // line below does not work:
    , validation_data: (testInputs, testOutputs)
);

没有 validation_data 也能正常工作。

如果我将 validation_data 作为张量元组传递,如上面的示例所示,例如(testInputs, testOutputs),它抛出'TypeError:float()参数必须是字符串或数字,而不是'NoneType'。 (这也是我在切换到数据集之前对训练数据所做的处理,并且验证有效)

如果我将 testInputstestOutputs 包装到 Dataset 中,类似于训练数据,例如Dataset.from_tensor_slices(ValueTuple.Create(testInputs, testOutputs))

我收到一个不同的错误:ValueError:检查输入时出错:预期顺序输入有 2 个维度,但得到了形状为 (347,) 的数组

这里 347 是特征向量的大小,因此 testInputs.shape 为 (221, 347),testOutputs.shape 为 (221, 1)

最佳答案

从我们的讨论中,我们可以澄清一些事情。

首先,不太确定直接将其作为元组提供时的错误。可能需要有关其数据的更多信息。

就使用 tf 数据进行验证而言,当我们使用 from_tensor_slices 时,“我们创建一个数据集,其元素是给定张量的切片”。对于此示例,我们提供的输入是一个具有各自形状 (221,347) 和 (221,1) 的元组。 from_tensor_slices 的作用是沿第 0 维(此处的大小为 221)对各个 numpy 数组进行切片。因此,该方法将创建一个数据集,其中每个元素分别是形状 (347,) 和 (1,) 的元组。数据集中将有 221 个这样的元素。

如果我们使用from_tensors另一方面,它创建一个具有单个元素的数据集,其中包含给定的张量作为输入。因此,它相当于直接通过数据集对象提供 numpy 数据。

下面是一个简短的示例,说明了它如何适用于更小的尺寸:

import numpy as np
import tensorflow as tf
np.random.seed(42)
example_train = np.random.randn(4, 4)
example_test = np.random.randn(4, 1)

print("Example Train:", example_train)
print("Example Test:", example_test)

dataset1 = tf.data.Dataset.from_tensor_slices((example_train, example_test))
dataset2 = tf.data.Dataset.from_tensors((example_train, example_test))

it1 = dataset1.make_one_shot_iterator().get_next()
it2 = dataset2.make_one_shot_iterator().get_next()

with tf.Session() as sess:
    for i in range(4):
        print("Element {} of dataset1: {}".format(i,sess.run([it1])))
    print ("Element 0 of dataset2: ", sess.run([it2]))

结果:

Example Train: [[ 0.49671415 -0.1382643   0.64768854  1.52302986]
 [-0.23415337 -0.23413696  1.57921282  0.76743473]
 [-0.46947439  0.54256004 -0.46341769 -0.46572975]
 [ 0.24196227 -1.91328024 -1.72491783 -0.56228753]]
Example Test: [[-1.01283112]
 [ 0.31424733]
 [-0.90802408]
 [-1.4123037 ]]
Element 0 of dataset1: [(array([ 0.49671415, -0.1382643 ,  0.64768854,  1.52302986]), array([-1.01283112]))]
Element 1 of dataset1: [(array([-0.23415337, -0.23413696,  1.57921282,  0.76743473]), array([0.31424733]))]
Element 2 of dataset1: [(array([-0.46947439,  0.54256004, -0.46341769, -0.46572975]), array([-0.90802408]))]
Element 3 of dataset1: [(array([ 0.24196227, -1.91328024, -1.72491783, -0.56228753]), array([-1.4123037]))]
Element 0 of dataset2:  [(array([[ 0.49671415, -0.1382643 ,  0.64768854,  1.52302986],
       [-0.23415337, -0.23413696,  1.57921282,  0.76743473],
       [-0.46947439,  0.54256004, -0.46341769, -0.46572975],
       [ 0.24196227, -1.91328024, -1.72491783, -0.56228753]]), array([[-1.01283112],
       [ 0.31424733],
       [-0.90802408],
       [-1.4123037 ]]))]

关于我对 batch 的评论方法,通过将batch_size设置为221来将东西重新组合在一起,如果我们将dataset1代码更改为类似这样的内容并将我们的打印修改为类似这样的内容,例如:

dataset1 = tf.data.Dataset.from_tensor_slices((example_train, example_test)).batch(4)

with tf.Session() as sess:
    print ("Element 0 of dataset1: ", sess.run([it1]))    

我们的结果:

Element 0 of dataset1:  [(array([[ 0.49671415, -0.1382643 ,  0.64768854,  1.52302986],
       [-0.23415337, -0.23413696,  1.57921282,  0.76743473],
       [-0.46947439,  0.54256004, -0.46341769, -0.46572975],
       [ 0.24196227, -1.91328024, -1.72491783, -0.56228753]]), array([[-1.01283112],
       [ 0.31424733],
       [-0.90802408],
       [-1.4123037 ]]))]

您可以看到与使用 from_tensors 相同。

关于c# - 如何将validation_data传递给Model.fit + Dataset?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54546660/

相关文章:

c# - 将文件从 Angular 发送到 .NET Core

python - 列表理解用于识别两个列表之间的字符串匹配

python - 面临导入错误: DLL load failed while implementing Microsoft azure iothub_service_client

python - 使用张量设置特定种子?

c# - 将消息从存储过程返回到 C# 应用程序

c# - ILNumerics 在向量上的简单数学运算与系统数组和 Math.NET 的性能对比

c# - DataGridView ToolTipText 未显示

javascript - 即使文件存在,XMLHttpRequest 返回 404

python - 是否在 Imagedatagenerator 中将 class_mode 从二进制更改为分类模式感到困惑

docker - 如何在 docker-compose 中为 tensorflow-serving 指定 "model_config_file"变量?