Python 使用tf.data.Dataset训练DL模型

Python 使用tf.data.Dataset训练DL模型,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我正在尝试做一个简单的深入学习任务,学习如何使用Tensorflow(尤其是它的数据集工具)。任务如下:训练一个模型,该模型可以判断给定浮点数序列(长度固定)的和是正(标记为1)还是负(标记为0) 我在没有使用tf.data.Dataset的情况下完成了以下操作,效果很好 def get_rand_seq(): 返回[rand.uniform(-1,1)表示范围(6)] n=1000 X=np.数组([get_rand_seq()表示范围(n)]) y=np.数组([0如果和(序列)小于0,则为

我正在尝试做一个简单的深入学习任务,学习如何使用Tensorflow(尤其是它的数据集工具)。任务如下:训练一个模型,该模型可以判断给定浮点数序列(长度固定)的和是正(标记为1)还是负(标记为0)

我在没有使用tf.data.Dataset的情况下完成了以下操作,效果很好

def get_rand_seq():
返回[rand.uniform(-1,1)表示范围(6)]
n=1000
X=np.数组([get_rand_seq()表示范围(n)])
y=np.数组([0如果和(序列)小于0,则为0,否则为1,表示X中的序列])
model=tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(16,input_shape=(6,),activation='relu'))
model.add(tf.keras.layers.Dense(4,activation='relu'))
model.add(tf.keras.layers.density(1,activation='sigmoid'))
compile(优化器='adam',loss='binary\u crossentropy',metrics=['acc'])
模型拟合(X,y,历次=10,批次大小=4)
尽管如此,当我尝试使用tf.data.Dataset输入执行相同操作时,我在训练步骤
model.fit(…)
这是我的密码:

ds\ux=tf.data.Dataset.from\u tensor\u切片(X)
ds_y=tf.data.Dataset.from_tensor_切片(y)
ds=tf.data.Dataset.zip((ds_X,ds_y))
model=tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(16,input_shape=(6,),activation='relu'))
model.add(tf.keras.layers.Dense(4,activation='relu'))
model.add(tf.keras.layers.density(1,activation='sigmoid'))
compile(优化器='adam',loss='binary\u crossentropy',metrics=['acc'])
模型拟合(ds,历次=10,批量大小=4)
我得到以下错误:

ValueError: Input 0 of layer sequential_5 is incompatible with the layer: expected axis -1 of input shape to have value 6 but received input with shape [6, 1]
即使将输入形状更改为(6,1)也无法使其工作


有没有一个善良的灵魂可以启发像我这样迷路的羊?

在使用
tf.data.Dataset
时,不要在
model.fit
中使用
batch\u size
参数。您应该对数据集本身采取行动(请记住,对数据集的任何操作,如批处理、疏解等…不会更改数据集的位置,这意味着将返回具有新属性的数据集副本,并且应覆盖数据集)

此外,不需要创建两个不同的数据集并对其进行压缩。您可以为工厂方法提供一个元组,用于
tf.data.Dataset.from\u tensor\u slices

import tensorflow as tf 
import numpy as np

def get_rand_seq():
    return [np.random.uniform(-1, 1) for _ in range(6)]

n = 1000
X = np.array([get_rand_seq() for _ in range(n)])
y = np.array([0 if sum(seq) < 0 else 1 for seq in X])
ds = tf.data.Dataset.from_tensor_slices((X, y)).batch(4)

# equivalent is 
# ds = tf.data.Dataset.from_tensor_slices((X, y))
# ds = ds.batch(4) # not in-place

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(16, input_shape=(6, ), activation='relu'))
model.add(tf.keras.layers.Dense(4, activation='relu'))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])

model.fit(ds, epochs=1000)
将tensorflow导入为tf
将numpy作为np导入
def get_rand_seq():
返回[np.random.uniform(-1,1)表示范围(6)]
n=1000
X=np.数组([get_rand_seq()表示范围(n)])
y=np.数组([0如果和(序列)小于0,则为0,否则为1,表示X中的序列])
ds=tf.data.Dataset.from_tensor_切片((X,y)).batch(4)
#等价物是
#ds=tf.data.Dataset.from_张量_切片((X,y))
#ds=ds.批次(4)#未到位
model=tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(16,input_shape=(6,),activation='relu'))
model.add(tf.keras.layers.Dense(4,activation='relu'))
model.add(tf.keras.layers.density(1,activation='sigmoid'))
compile(优化器='adam',loss='binary\u crossentropy',metrics=['acc'])
模型拟合(ds,历元=1000)