池化层。Flatten、Reshape。batch、repeat、steps_per_epoch、epochs。tensorboard、ModelCheckpoint

日萌社

人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)


池化层


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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
import os import random import numpy as np import cv2 import keras from create_unet import create_model img_path = 'data_enh/img' mask_path = 'data_enh/mask' # 训练集与测试集的切分 img_files = np.array(os.listdir(img_path)) data_num = len(img_files) train_num = int(data_num * 0.8) train_ind = random.sample(range(data_num), train_num) test_ind = list(set(range(data_num)) - set(train_ind)) train_ind = np.array(train_ind) test_ind = np.array(test_ind) train_img = img_files[train_ind] # 训练的数据 test_img = img_files[test_ind] # 测试的数据 def get_mask_name(img_name): mask = [] for i in img_name: mask_name = i.replace('.jpg', '.png') mask.append(mask_name) return np.array(mask) train_mask = get_mask_name(train_img) test_msak = get_mask_name(test_img) def generator(img, mask, batch_size): num = len(img) while True: IMG = [] MASK = [] for i in range(batch_size): index = np.random.choice(num) img_name = img[index] mask_name = mask[index] img_temp = os.path.join(img_path, img_name) mask_temp = os.path.join(mask_path, mask_name) temp_img = cv2.imread(img_temp) temp_mask = cv2.imread(mask_temp, 0)/255 temp_mask = np.reshape(temp_mask, [256, 256, 1]) IMG.append(temp_img) MASK.append(temp_mask) IMG = np.array(IMG) MASK = np.array(MASK) yield IMG, MASK # train_data = generator(train_img, train_mask, 32) # temp_data = train_data.__next__() # 计算dice系数 def dice_coef(y_true, y_pred): y_true_f = keras.backend.flatten(y_true) y_pred_f = keras.backend.flatten(y_pred) intersection = keras.backend.sum(y_true_f * y_pred_f) area_true = keras.backend.sum(y_true_f * y_true_f) area_pred = keras.backend.sum(y_pred_f * y_pred_f) dice = (2 * intersection + 1)/(area_true + area_pred + 1) return dice # 自定义损失函数,dice_loss def dice_coef_loss(y_true, y_pred): return 1 - dice_coef(y_true, y_pred) # 模型的创建 model = create_model() # 模型的编译 model.compile(optimizer='Adam', loss=dice_coef_loss, metrics=[dice_coef]) # 模型的训练 history = model.fit_generator(generator(train_img, train_mask, 4), steps_per_epoch=100, epochs=10, validation_data=generator(test_img, test_msak, 4), validation_steps=4 ) # 模型的保存 model.save('unet_model.h5') # 模型的读取 model = keras.models.load_model('unet_model.h5', custom_objects={'dice_coef_loss': dice_coef_loss, 'dice_coef': dice_coef}) # 获取测试数据 test_generator = generator(test_img, test_msak, 32) img, mask = test_generator.__next__() # 模型的测试 model.evaluate(img, mask) # [0.11458712816238403, 0.885412871837616] 94%
02-14

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

あずにゃん

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值