Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.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
C# 如何将验证数据传递到Model.fit+;数据集?_C#_Python_Tensorflow_Keras - Fatal编程技术网

C# 如何将验证数据传递到Model.fit+;数据集?

C# 如何将验证数据传递到Model.fit+;数据集?,c#,python,tensorflow,keras,C#,Python,Tensorflow,Keras,我试图在生成的数据上训练一个简单的顺序网络。我有一个预计算的验证数据集 为了提供输入,我使用了tf.data.DatasetAPI,如下所示: 它无需验证数据即可正常工作 如果我将validation\u data作为一个张量元组传递,就像上面的例子,例如(testInputs,testOutputs),它抛出“TypeError:float()参数必须是字符串或数字,而不是“NoneType”。(在切换到数据集之前,我也会这样处理列车数据,并且验证工作正常) 如果我将testInputs和t

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

为了提供输入,我使用了
tf.data.Dataset
API,如下所示:

它无需验证数据即可正常工作

如果我将
validation\u data
作为一个张量元组传递,就像上面的例子,例如
(testInputs,testOutputs)
,它抛出
“TypeError:float()参数必须是字符串或数字,而不是“NoneType”
。(在切换到
数据集
之前,我也会这样处理列车数据,并且验证工作正常)

如果我将
testInputs
testOutputs
包装到一个
Dataset
中,类似于列车数据,例如
Dataset.from\u tensor\u切片(ValueTuple.Create(testInputs,testOutputs))

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


这里347是特征向量的大小,因此
测试输入。shape
是(221347)和
测试输出。shape
是(221,1)

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

首先,当直接将其作为元组输入时,不太确定错误。可能需要关于它的数据的更多信息

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

另一方面,如果我们使用该方法,它将创建一个包含单个元素的数据集,该元素由给定的张量作为输入组成。因此,它相当于直接通过dataset对象提供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_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_张量相同。

我不确定您的第一个错误,因为我不知道您数据的详细信息。但是对于第二个,它显示了这个错误,因为您使用from_tensor_slices,它将沿着第一维度对数据进行切片。因此,一个(221347)将被分割成221(347,)个数据点。如果您使用批处理方法将数据批处理到221,那么它会将数据放回(221347)形状。请注意,在这种情况下,您还需要使用validation\u steps参数,因为您正在使用steps\u per\u epoch来指定不需要为train计算的步骤,对于validation,情况也应该如此。@kvish,虽然我不完全理解您的解释,但在尝试几件事情之前,只需将来自\u张量的
切片
替换为来自\u张量的
即可验证
数据集
。嗯,你应该把你的评论变成一个答案。仍然不明白为什么来自张量切片的
适用于训练数据,而不适用于测试数据。
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 ]]))]