关于Tensorflow输入数据的shape确定
注意:
1.模型数据输入的shape与batch_size无关!
2.只有"单个"样本的shape有关!
3.且只与样本的"特征数据"的shape有关,与标签shape无关!
因为从框架设计上来说,每个人训练的输入batch_size不一定一样,所以模型输入shape就肯定不能带上batch_size。
只当真正训练时,自动每批次求导即可。即,你每次输入1个样本,它就计算1个样本,求一次损失;如果你输入10个,那么它就
计算10个样本,求其均值损失。
tensorflow的标准dataset格式
使用tf.data.Dataset.from_tensor_slices((特征数据列表,标签值列表))是最方便的一种方式。TF设计的数据读取方式:
每单个样本格式必须是(特征数据,标签值)这么一对。但是输入给from_tensor_slices的参数不能是[(特征数据,标签值),…],而是((特征数据列表,标签值列表)),这一点与pytorch不一样,pytorch是前一种格式即可被data.DataLoader读取。
batch_size就是这么一对一对样本组合的个数。batch_size的作用就是让模型一次一口吃多个样本。因为仅仅(特征数据,标签值)一对一口,吃的太慢。这样由batch_size个样本组合的数据叫mini_batch.
len(df) #样本总个数
#303
train_dataset = dataset.shuffle(len(df)).batch(3) #经过batch_size=3的划分后
len(train_dataset)
#101 每次喂给模型mini-batch后,需要喂101口。
在模型内部,模型层的直接输入数据是特征数据而不是标签数据,
标签数值仅仅只是在call函数中与模型生成的结果进行损失求值而已。所以不需要关心标签数值的shape,只需要盯着特征数据shape看就行了,并且仅看单个样本的特征数据shape无视batch_size.
如何查看Dataset单个特征数据的shape?
很简单直接打印Dataset即可,因为TF设计Dataset的打印输出仅为shape信息,不是具体数值
print(train_dataset)
#<BatchDataset shapes: ((None, 12), (None,)), types: (tf.float64, tf.int8)>
得到特征样本的shape是(None,12),其中None是占位batch_size,无视即可,本身就是(12,)
例:第一层模型的shape输入
model = tf.keras.Sequential([
tf.keras.layers.Dense(16,input_shape=(12,),activation='relu',name="D1"),
tf.keras.layers.Dense(32,activation='relu',name="D2"),
tf.keras.layers.Dense(64,activation='relu',name="D3"),
tf.keras.layers.Dense(32,activation='relu',name="D4"),
tf.keras.layers.Dense(16,activation='relu',name="D5"),
tf.keras.layers.Dense(1,activation='relu',name="D6")
])