图片尺寸大小不一,需裁剪成一样大小。
数据量比较大,不能一下全装入内存
经常需要修改参数,例如输出尺寸
# 数据生成器
ImageDatagenerator
参数调整会影响识别率
kerastuer.tuner import Hyperband
kerastuner.engine.hyperparameters import Htperparameters
tensorboardx 第三方库
最常用的三个功能
1.记录数据分类指标,进行分类任务,实时监控训练数据。
2.记录图像效果
记录日志
1.import logging
notset 不记录任何信息 < debug 记录开发过程中的细节信息 <info < warning 记录可能存在的问题< error 程序运行时发生的错误 < cartical 严重的错误,例如程序崩溃
在正常情况下,会输出warning级别以上的
通过logging.basicConfig
通过logging打印参数
logging.basicConfig(format="%(ressage)s", level=lpgging.INFO, filmae='./mnist.log',filemode='w')
以覆盖的方式打印
2. 实例化summaryWriter()
#不指定任何参数, 默认路径为"runs/CURRENT_DATETIME_HOSTNAME"
writer = SummaryWriter().
#通过参数log_dir 指定日志路径
wiret = SummaryWriter(log.dir="./runs/verdion")
# 通过参数comment 指定日志路径后缀,与参数log_dir同时使用,不起作用
writer = SummaryWriter(comment="_resent")
使用add_scalar记录数字常量
writer.add_scalar(tag, scalsr_value, global_step, walltime=None)
tag:(string)数据图表名称
scalar_value:(float)需要记录的数据,通常在图表中作为y轴的数据
gloab_step:(int, optional) 训练的step, 通常在图表中作为x轴的数据
walltime:(float, optional)记录生成的时间,默认为time.time()
2.1 跳转连接的设计
ResNeSt网络模型的特征提取单元通过步长大于1的卷积来降低特征图的大小,因此,特征信息从网络浅层传递到网络深层是一个特征图尺度逐渐缩小的过程。在这个过程中,梯度和特征信息会变得不明确甚至消失,最终得到的局部细节特征较少,使得网络对高相似性甲骨文字产生误判,最终导致识别率较低。
为解决这一问题,本文借鉴DenseNet[23]的跳转连接思想。在DenseNet的网络结构中,靠近输入和靠近输出层之间包含更短的连接。对于每一层,所有前一层的特征图作为输入,而这一层的特征图作为后续所有层的输入,有效地缓解了梯度消失问题,并加强了特征的传播,鼓励特征复用。因此,本文在ResNeSt网络模型的特征提取结构中,通过跳转连接逐步从网络浅层向网络深层引入图像特征,并与深层图像特征进行融合,从而较好解决了局部细节特征从网络浅层到深层传递过程的信息损失问题。
在ResNeSt的特征提取结构当中包含着4个特征提取层,每个层中包含了不同数量的特征提取单元。随着网络层数的加深,提取到的特征图尺寸在逐步减小。而本文提出的跳转连接结构是将特征提取层i的输入特征图与输出特征图进行通道级的连接,然后作为特征提取层i+1的输入特征图。此过程要求需要相加的特征图必须在维度、宽度以及高度保持一致,因此,本文设计了特征融合单元,来对特征提取层i
批量读取数据
def show_batch(generator):x_batch, y_batch = next(generator)for i in range(len(x_batch)):plt.subplot(1, len(x_batch), i + 1)plt.imshow(x_batch[i].astype('uint8'))plt.title(f"Label: {y_batch[i].argmax()}")plt.axis('off')plt.show()print("Training batch:")
show_batch(train_gen)print("Testing batch:")
show_batch(test_gen)
的输入特征图的维度、宽度以及高度进行调整,此过程如图5。
读取文件夹下的照片
train_dir = '/home/jovyan/work/datasets/666be34edcb9f32d6c981720-momodel/train'
test_dir = '/home/jovyan/work/datasets/666be34edcb9f32d6c981720-momodel/test'def display_images_from_directory(directory):# 遍历目录中的所有子目录for root, dirs, files in os.walk(directory):for file in files:# 检查文件是否为图片文件if file.endswith(('jpg', 'jpeg', 'png', 'bmp')):# 构建文件的完整路径file_path = os.path.join(root, file)# 读取图像image = cv2.imread(file_path)# 转换颜色空间从BGR到RGBimage = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 显示图像plt.imshow(image)plt.title(file)plt.axis('off')plt.show()print("Training images:")
display_images_from_directory(train_dir)print("Testing images:")
display_images_from_directory(test_dir)
ImageDataGenerator
1创建生成器对象,从指定目录中读取图像,
1. 基本属性和方法
- 目录读取:
directory
参数指定了图像所在的目录,生成器会从这个目录及其子目录中读取图像文件。 - 批量大小:
batch_size
参数指定了每个批次生成的图像数量。 - 是否打乱:
shuffle
参数为False
,表示生成器不会打乱图像的顺序。 - 图像大小:
target_size
参数指定了输出图像的大小(例如(im_size, im_size)
)。 - 标签模式:
class_mode
参数为'categorical'
,表示使用 one-hot 编码的类别标签。
2. 生成器行为
test_gen
是一个可迭代对象,每次调用 next(test_gen)
或 for batch in test_gen
时,会生成一批图像及其对应的标签。
每批数据是一个元组 (images, labels)
,其中 images
是一个形状为 (batch_size, target_size[0], target_size[1], 3)
的 numpy 数组,表示一批图像数据;labels
是一个形状为 (batch_size, num_classes)
的 numpy 数组,表示对应的 one-hot 编码的标签。
根据 ImageDataGenerator
的初始化参数,图像可以被自动进行缩放、归一化、增强等预处理操作。
3. 属性示例
test_gen.samples
: 总样本数。test_gen.class_indices
: 字典,映射类名到类索引。test_gen.classes
: 包含每个样本的类索引的 numpy 数组。test_gen.filenames
: 包含每个样本文件名的列表。test_gen.n
: 总样本数(与test_gen.samples
相同)。test_gen.batch_size
: 每批次生成的样本数量。test_gen.target_size
: 图像的目标大小。test_gen.num_classes
: 类别数。
模型建立
resnet 提出了层间残差跳连,利用前方信息缓解梯度消失,单独堆叠网络层数,会使模型退化
当前层和前两层元素相加,矩阵做加法,两层堆叠卷积不该都维度,一种是改变维度,一种维度不变。
1.resnetblock实现两种不同的堆叠情况 ,每次调用该类会生成一个黄色块,如果维度不同同,则residual_path = 1,使用1*1卷积操作,调整输入特征图的尺寸和深度,如果相同,直接相加,过激活
weights='imagenet'
:这表示使用在 ImageNet 数据集上预训练的权重。ImageNet 是一个包含数百万张标记图像的大型数据集,常用于图像分类任务。使用预训练的权重可以利用在大型数据集上学到的特征,从而加快训练过程并提高性能。
include_top=False
:这表示不包括网络的顶层。顶层通常是用于特定分类任务的全连接层(Dense Layer)。将其设置为 False
可以排除顶层,使得你可以在模型的输出后添加自定义层,以适应你的特定任务(例如,不同数量的分类标签)。
input_shape=(im_size, im_size, 3)
:这设置了输入图像的形状。im_size
是图像的宽度和高度(假设是150),3
表示图像有三个通道(RGB)。这意味着模型的输入图像大小应为 (150, 150, 3)
。
因为我们的训练集图片时白底黑字的,所以我们 设置 color_mode='grayscale'
以加载灰度图像(黑白图像)。这将使图像只有一个颜色通道。
1.tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)
适用于标签以整数形式编码的分类任务,即标签是类别的索引而不是 one-hot 编码的向量。
如果 from_logits=False
,则假设模型输出的是概率分布(经过 softmax 函数处理的概率),损失函数会根据这些概率计算交叉熵损失。
适用于模型的最后一层没有经过 softmax 处理的情况,因为损失函数会在内部进行 softmax 计算。
2. 'categorical_crossentropy'
适用于标签以 one-hot 编码形式提供的分类任务,即标签是每个类别的概率分布向量。
损失函数预期模型输出是经过 softmax 处理后的概率分布(即 logits 被转换为概率分布),然后计算交叉熵损失。
适用于模型的最后一层输出经过 softmax 处理后的情况,或者在使用 from_logits=True
的情况下,将模型输出的 logits 作为输入进行处理。