猿问

如何使用与模型输入形状兼容的tensorflow.data.experimental

我将使用tensorflow.data.experimental.CsvDatasetTensorFlow 2 来训练小批量。但是 Tensor 的形状不适合我模型的输入形状。


请让我知道通过 TensorFlow 数据集进行小批量训练的最佳方法是什么。


我尝试如下:


# I have a dataset with 4 features and 1 label

feature = tf.data.experimental.CsvDataset(['C:/data/iris_0.csv'], record_defaults=[.0] * 4, header=True, select_cols=[0,1,2,3])

label = tf.data.experimental.CsvDataset(['C:/data/iris_0.csv'], record_defaults=[.0] * 1, header=True, select_cols=[4])

dataset = tf.data.Dataset.zip((feature, label))


# and I try to minibatch training:

model = tf.keras.Sequential([tf.keras.layers.Dense(1, input_shape=(4,))])

model.compile(loss='mse', optimizer='sgd')

model.fit(dataset.repeat(1).batch(3), epochs=1)

我收到一个错误:


ValueError:检查输入时出错:期望dense_6_input具有形状(4,)但得到形状为(1,)的数组


因为:CsvDataset()返回形状的张量(features, batch),但我需要它是形状的(batch, features)。


参考代码:


for feature, label in dataset.repeat(1).batch(3).take(1):

    print(feature)


# (<tf.Tensor: id=487, shape=(3,), dtype=float32, numpy=array([5.1, 4.9, 4.7], dtype=float32)>, <tf.Tensor: id=488, shape=(3,), dtype=float32, numpy=array([3.5, 3. , 3.2], dtype=float32)>, <tf.Tensor: id=489, shape=(3,), dtype=float32, numpy=array([1.4, 1.4, 1.3], dtype=float32)>, <tf.Tensor: id=490, shape=(3,), dtype=float32, numpy=array([0.2, 0.2, 0.2], dtype=float32)>)


慕无忌1623718
浏览 87回答 1
1回答

当年话下

创建tf.data.experimental.CsvDataset一个数据集,其中数据集的每个元素对应于 CSV 文件中的一行,并由多个张量组成,即每列一个单独的张量。因此,首先需要使用mapdataset 方法将所有这些张量堆叠到单个张量中,以便它与模型期望的输入形状兼容:def map_func(features, label):&nbsp; &nbsp; return tf.stack(features, axis=1), tf.stack(label, axis=1)dataset = dataset.map(map_func).batch(BATCH_SIZE)
随时随地看视频慕课网APP

相关分类

Python
我要回答