关于Tensorflow输入数据的shape

关于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")
])

### 使用 `input_shape` 参数定义 TensorFlow 模型 在 TensorFlow 中,`input_shape` 是用于指定模型输入张量形状的重要参数。它通常出现在构建神经网络的第一层中,以便告知框架数据的结构和维度。以下是关于如何使用 `input_shape` 的详细说明: #### 定义模型时设置 `input_shape` 当通过 Keras API 构建模型时,可以在第一层显式地传递 `input_shape` 参数来描述输入数据的形式。例如,在 Sequential 或 Functional API 中,可以通过如下方式实现[^1]: ```python from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Conv2D model = Sequential() # 假设我们正在处理图像分类任务,输入大小为 (height, width, channels) model.add(Conv2D(filters=32, kernel_size=(3, 3), activation='relu', input_shape=(64, 64, 3))) ``` 上述代码片段展示了如何利用卷积层作为模型的第一层并指定了输入形状 `(64, 64, 3)` 表示高度、宽度以及颜色通道数。 如果是在函数式 API 下,则可以这样操作: ```python import tensorflow as tf from tensorflow.keras.layers import Input, Flatten, Dense inputs = Input(shape=(64, 64, 3)) x = Flatten()(inputs) outputs = Dense(10)(x) model = tf.keras.Model(inputs=inputs, outputs=outputs) ``` 这里同样设置了输入尺寸为 `(64, 64, 3)` 并将其连接到后续层上。 #### 处理多维数据与批量大小 值得注意的是,虽然我们在定义 `input_shape` 时不考虑批次维度(batch size),但在实际运行过程中,TensorFlow 自动会在最前面增加一个表示批次数目的轴(即 batch 轴)。因此,如果你看到最终传入的数据形式像 `[batch_size, height, width, channel]` 这样的四维数组,请不必惊讶——这是正常的机制设计[^4]。 另外需要注意一点,对于某些特定类型的层来说可能还需要额外配置其他属性才能正确工作;比如 RNN 类似 LSTM 层就需要明确指出时间步长(time steps)的信息。 #### 冻结预训练权重的影响 假设你在加载了一个已经过良好调优后的 CNN 预训练模型之后打算微调部分参数或者完全固定住原有特征提取器不变仅改变顶部全连接预测头的话,那么此时也需要合理运用 `trainable=False` 来控制哪些区域允许更新梯度从而影响学习过程[^3] 。不过这一步骤并不直接影响到原始设定好的 `input_shape`. ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值