日萌社
人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)
池化层![](https://i-blog.csdnimg.cn/blog_migrate/c5c092e165d3a70587f5c387672a0a81.png)
Flatten、Reshape
tf.keras.layers.Flatten():
不针对第一维batch_size进行操作,只针对第二维到第四维进行操作,即自动会把 (batch_size,长,宽,通道数) 进行reshape/展平为 (batch_size,长*宽*通道数)
tf.keras.layers.Reshape(target_shape=(长*宽*通道数,))
Reshape和Flatten一样都不会对第一维batch_size进行操作,因此Reshape中的shape参数格式只需要写针对第二维到第四维进行操作的写法即可。
比如shape参数格式(长*宽*通道数,) 自动会把 (batch_size,长,宽,通道数) 进行reshape/展平为 (batch_size,长*宽*通道数)
batch、repeat、steps_per_epoch、epochs
1.steps_per_epoch、epochs的两种用法
方式一:
如果使用 model.fit(train_dataset, validation_data=test_dataset, steps_per_epoch=M, epochs=N),
即同时steps_per_epoch和epochs的话,则要求把训练集和验证集都拷贝N份(epochs份),
因为使用了steps_per_epoch之后,每次epoch的遍历是对不同份的训练集和验证集进行遍历,
不再是对同一份训练集和验证集进行遍历,因此一开始就要拷贝N份(epochs份)的源训练集和源验证集,
供以遍历epoch次。可以使用repeat(epochs)对数据集进行拷贝epochs份。
方式二:
如果使用 model.fit(train_dataset, validation_data=test_dataset, epochs=N),
只使用了epochs的话,那么每次epoch的遍历都是对同一份训练集和验证集进行遍历,便不需要把训练集和验证集都拷贝N份(epochs份),
其中steps_per_epoch值不需要传入,即会在第一次epoch的遍历中自动计算steps_per_epoch值。
2.batch、repeat、steps_per_epoch、epochs 的使用注意事项
1.使用steps_per_epoch后 应保证要输入到模型的数据集(包括训练集/验证集)的批量数据的个数都应均为 steps_per_epoch * epoch。
steps_per_epoch 即表示 一个epoch 里面遍历批量数据的次数,即遍历多少个批量数据完成一个epoch。
比如可以先用 batch(批次大小) 然后才用 repeat(重复次数),
比如:repeat(2)重复数据集2次,即复制一份数据集,最终即有两份数据集。
2.fit中没有定义steps_per_epoch,只定义了epochs的话,那么只会对同一份数据集进行遍历epochs次进行训练。
如果fit中同时有传训练集和验证集validation_data进行训练/验证的话,那么均为对同一份训练集和验证集进行遍历epochs次进行训练/验证。
打印的训练信息格式如下:当前步数step/总步数steps - ETA:剩余训练时间 - loss - accuracy
3.fit中同时定义了steps_per_epoch和epochs的话,那么表示对数据集进行遍历epochs次进行训练,并且每个epoch中遍历steps_per_epoch个批量数据。
但要注意的是此处所说的对数据集进行遍历epochs次指的不是对同一份数据集遍历epochs次,而是对epochs份数据集遍历epochs次,
而每份数据集遍历1次,因此需要对原始数据集拷贝epochs份,才能每份数据集遍历1次,一共遍历epochs次进行训练。
如果fit中同时有传训练集和验证集validation_data进行训练/验证的话,那么同时要把训练集和验证集validation_data都拷贝epochs份。
可以使用repeat(epochs)对数据集进行拷贝epochs份。
第一个epoch打印的训练信息格式如下:
当前步数step/Unknown - ETA:剩余训练时间 - loss: - accuracy:
第一个epoch之后的每个epoch打印的训练信息格式如下:(因为经过第一个epoch之后底层就已经计算好每个epoch需要遍历多少个批量数据,即得出总步数steps)
当前步数step/总步数steps - ETA:剩余训练时间 - loss - accuracy
3.使用顺序:from_tensor_slices -> map -> shuffle -> batch -> repeat -> prefetch
train_dataset = tf.data.Dataset.from_tensor_slices((train_dataset, train_lable))
train_dataset = train_dataset.map(function, num_parallel_calls=tf.data.experimental.AUTOTUNE)
train_dataset = train_dataset.shuffle(buffer_size=N)
train_dataset = train_dataset.batch(batch_size)
epochs_repeats = N
train_dataset = train_dataset.repeat(epochs_repeats)
train_dataset = train_dataset.prefetch(tf.data.experimental.AUTOTUNE)
test_dataset = tf.data.Dataset.from_tensor_slices((test_dataset, test_lable))
test_dataset = test_dataset.map(function, num_parallel_calls=tf.data.experimental.AUTOTUNE)
test_dataset = test_dataset.batch(batch_size)
test_dataset = test_dataset.repeat(epochs_repeats)
4.tensor类型 和 ndarray类型使用 repeat的区别
比如源数据是[1, 2, 3]
tensor类型使用 repeat变成[1, 2, 3, 1, 2, 3]
ndarray类型使用 repeat变成[1, 1, 2, 2, 3, 3]
dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3])
dataset = dataset.repeat(3)
list(dataset.as_numpy_iterator())
[1, 2, 3, 1, 2, 3, 1, 2, 3]
tensorboard、ModelCheckpoint
#还要预先建立 ./graph/train/plugins/profile 的目录
#要在graph的同级目录下 使用命令 tensorboard --logdir=graph 或者 tensorboard --logdir='./graph'
#http://localhost:6006/ 访问
tensorboard = tf.keras.callbacks.TensorBoard(log_dir='./graph', histogram_freq=1, write_graph=True, write_images=True)
#预先建立./ckpt目录
check = tf.keras.callbacks.ModelCheckpoint('./ckpt/weights_{epoch:02d}-{val_loss:.2f}.h5',
monitor='val_loss',
save_best_only=True,
save_weights_only=False,
mode='auto',
period=1)
metrics 是 sparse_categorical_crossentropy,则ModelCheckpoint中的第一个路劲字符串信息中和monitor参数中都需要用val_sparse_categorical_crossentropy
metrics 是 acc,则ModelCheckpoint中的第一个路劲字符串信息中和monitor参数中都需要用val_acc
metrics 是 accuracy,则ModelCheckpoint中的第一个路劲字符串信息中和monitor参数中都需要用val_accuracy