我正在尝试针对生成的数据训练一个简单的Sequential
网络。我有一个预先计算的验证数据集。
要提供输入,我正在使用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() argument must be a string or a number, not 'NoneType'
。 (这也是我在切换到Dataset
并进行验证之前也使用过的训练数据的方法)
如果我将testInputs
和testOutputs
包装成Dataset
,类似于火车数据,例如Dataset.from_tensor_slices(ValueTuple.Create(testInputs, testOutputs))
我收到另一个错误:ValueError : Error when checking input: expected sequential_input to have 2 dimensions, but got array with shape (347,)
。
这里347是特征向量的大小,因此testInputs.shape
是(221,347),而testOutputs.shape
是(221,1)
答案 0 :(得分: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代码更改为类似的内容,然后将打印内容修改为类似的内容,例如:< / p>
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相同。