import albumentations
norm_size = 224
datapath = ‘data/train’
epochs = 20
init_lr = 3e-4
labellist = []
dicclass = {‘black-grass’: 0, ‘charlock’: 1, ‘cleavers’: 2, ‘common chickweed’: 3, ‘common wheat’: 4, ‘fat hen’: 5, ‘loose silky-bent’: 6,
‘maize’: 7, ‘scentless mayweed’: 8, ‘shepherds purse’: 9, ‘small-flowered cranesbill’: 10, ‘sugar beet’: 11}
classnum = 12
batch_size = 4
np.random.seed(42)
这里可以看出tensorflow2.0以上的版本集成了keras,我们在使用的时候就不必单独安装keras了,以前的代码升级到tensorflow2.0以上的版本将keras前面加上tensorflow即可。
tensorflow说完了,再说明一下几个重要的全局参数:
-
norm_size = 224 设置输入图像的大小,resnet50默认的图片尺寸是224×224。
-
datapath = ‘data/train’ 设置图片存放的路径,在这里要说明一下如果图片很多,一定不要放在工程目录下,否则pycharm加载工程的时候会浏览所有的图片,很慢很慢。
-
epochs = 20 epochs的数量,关于epoch的设置多少合适,这个问题很纠结,一般情况设置300足够了,如果感觉没有训练好,再载入模型训练。
-
init_lr = 1e-3 学习率,一般情况从0.001开始逐渐降低,也别太小了到1e-6就可以了。
-
classnum = 12 类别数量,数据集有两个类别,所有就分为两类。
-
batch_size = 4 batchsize,根据硬件的情况和数据集的大小设置,太小了loss浮动太大,太大了收敛不好,根据经验来,一般设置为2的次方。windows可以通过任务管理器查看显存的占用情况。
ubuntu可以使用nvidia-smi查看显存的占用。
- 定义numpy.random的随机因子。这样就可以固定随机的index
和以前做法不同的是,这里不再处理图片,而是只返回图片路径的list列表。
具体做法详见代码:
def loadimagedata():
imagelist = []
listclasses = os.listdir(datapath) # 类别文件夹
print(listclasses)
for class_name in listclasses:
label_id = dicclass[class_name]
class_path = os.path.join(datapath, class_name)
image_names = os.listdir(class_path)
for image_name in image_names:
image_full_path = os.path.join(class_path, image_name)
labellist.append(label_id)
imagelist.append(image_full_path)
return imagelist
print(“开始加载数据”)
imagearr = loadimagedata()
labellist = np.array(labellist)
print(“加载数据完成”)
做好数据之后,我们需要切分训练集和测试集,一般按照4:1或者7:3的比例来切分。切分数据集使用train_test_split()方法,需要导入from sklearn.model_selection import train_test_split 包。例:
trainx, valx, trainy, valy = train_test_split(imagearr, labellist, test_size=0.2, random_state=42)
train_transform = albumentations.compose([
albumentations.oneof([
albumentations.randomgamma(gamma_limit=(60, 120), p=0.9),
albumentations.randombrightnesscontrast(brightness_limit=0.2, contrast_limit=0.2, p=0.9),
albumentations.clahe(clip_limit=4.0, tile_grid_size=(4, 4), p=0.9),
]),
albumentations.horizontalflip(p=0.5),
albumentations.shiftscalerotate(shift_limit=0.2, scale_limit=0.2, rotate_limit=20,
interpolation=cv2.inter_linear, border_mode=cv2.border_constant, p=1),
albumentations.normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225), max_pixel_value=255.0, p=1.0)
])
val_transform = albumentations.compose([
albumentations.normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225), max_pixel_value=255.0, p=1.0)
])
这个随意写的,具体的设置可以参考我以前写的文章:
图像增强库albumentations使用总结_ai浩-csdn博客_albumentations
写了两个数据增强,一个是用于训练,一个用于验证。验证集只需要对图片做归一化处理。
generator的主要作用是处理图像,并迭代的方式返回一个batch的图像以及对应的label。
思路:
在while循环:
-
初始化input_samples和input_labels,连个list分别用来存放image和image对应的标签。
-
循环batch_size次数:
-
- 随机一个index
-
分别从file_pathlist和labels,得到图片的路径和对应的label
-
读取图片
-
如果是训练就训练的transform,如果不是就执行验证的transform。
-
resize图片
-
将image转数组
-
将图像和label分别放到input_samples和input_labels
-
将list转numpy数组。
-
返回一次迭代
def generator(file_pathlist,labels,batch_size,train_action=false):
l = len(file_pathlist)
while true:
input_labels = []
input_samples = []
for row in range(0, batch_size):
temp = np.random.randint(0, l)
x = file_pathlist[temp]
y = labels[temp]
image = cv2.imdecode(np.fromfile(x, dtype=np.uint8), -1)
if image.shape[2] > 3:
image = image[:, :, :3]
if train_action:
image=train_transform(image=image)[‘image’]
else:
image = val_transform(image=image)[‘image’]
image = cv2.resize(image, (norm_size, norm_size), interpolation=cv2.inter_lanczos4)
image = img_to_array(image)
input_samples.append(image)
input_labels.append(y)
batch_x = np.asarray(input_samples)
batch_y = np.asarray(input_labels)
yield (batch_x, batch_y)
modelcheckpoint:用来保存成绩最好的模型。
语法如下:
keras.callbacks.modelcheckpoint(filepath, monitor=‘val_loss’, verbose=0, save_best_only=false, save_weights_only=false, mode=‘auto’, period=1)
该回调函数将在每个epoch后保存模型到filepath
filepath可以是格式化的字符串,里面的占位符将会被epoch值和传入on_epoch_end的logs关键字所填入
例如,filepath若为weights.{epoch:02d-{val_loss:.2f}}.hdf5,则会生成对应epoch和验证集loss的多个文件。
reducelronplateau:当评价指标不在提升时,减少学习率,语法如下:
keras.callbacks.reducelronplateau(monitor=‘val_loss’, factor=0.1, patience=10, verbose=0, mode=‘auto’, epsilon=0.0001, cooldown=0, min_lr=0)
当学习停滞时,减少2倍或10倍的学习率常常能获得较好的效果。该回调函数检测指标的情况,如果在patience个epoch中看不到模型性能提升,则减少学习率
本例代码如下:
checkpointer = modelcheckpoint(filepath=‘best_model.hdf5’,
monitor=‘val_accuracy’, verbose=1, save_best_only=true, mode=‘max’)
reduce = reducelronplateau(monitor=‘val_accuracy’, patience=10,
verbose=1,
factor=0.5,
min_lr=1e-6)
model = sequential()
model.add(resnet50(include_top=false, pooling=‘avg’, weights=‘imagenet’))
model.add(dense(classnum, activation=‘softmax’))
optimizer = adam(learning_rate=init_lr)
model.compile(optimizer=optimizer, loss=‘sparse_categorical_crossentropy’, metrics=[‘accuracy’])
history = model.fit(generator(trainx,trainy,batch_size,train_action=true),
steps_per_epoch=len(trainx) / batch_size,
validation_data=generator(valx,valy,batch_size,train_action=false),
epochs=epochs,
validation_steps=len(valx) / batch_size,
callbacks=[checkpointer, reduce])
model.save(‘my_model.h5’)
print(history)
上篇博文中没有使用预训练模型,这篇在使用的时候,出现了错误,经过查阅资料发现了这种方式是错误的,如下:
#model = resnet50(weights=“imagenet”,input_shape=(224,224,3),include_top=false, classes=classnum) #include_top=false 去掉最后的全连接层
如果想指定classes,有两个条件:include_top:true, weights:none。否则无法指定classes。
所以指定classes就不能用预训练了,所以采用另一种方式:
model = sequential()
model.add(resnet50(include_top=false, pooling=‘avg’, weights=‘imagenet’))
model.add(dense(classnum, activation=‘softmax’))
另外,上篇文章使用的是fit_generator,新版本中fit支持generator方式,所以改为fit。
loss_trend_graph_path = r"ww_loss.jpg"
acc_trend_graph_path = r"ww_acc.jpg"
import matplotlib.pyplot as plt
print(“now,we start drawing the loss and acc trends graph…”)
summarize history for accuracy
fig = plt.figure(1)
plt.plot(history.history[“accuracy”])
plt.plot(history.history[“val_accuracy”])
plt.title(“model accuracy”)
plt.ylabel(“accuracy”)
plt.xlabel(“epoch”)
plt.legend([“train”, “test”], loc=“upper left”)
plt.savefig(acc_trend_graph_path)
plt.close(1)
summarize history for loss
fig = plt.figure(2)
plt.plot(history.history[“loss”])
plt.plot(history.history[“val_loss”])
plt.title(“model loss”)
plt.ylabel(“loss”)
plt.xlabel(“epoch”)
plt.legend([“train”, “test”], loc=“upper left”)
plt.savefig(loss_trend_graph_path)
plt.close(2)
print(“we are done, everything seems ok…”)
#windows系统设置10关机
#os.system(“shutdown -s -t 10”)
===============================================================
1、导入依赖
import cv2
import numpy as np
from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.models import load_model
import time
import os
import albumentations
2、设置全局参数
这里注意,字典的顺序和训练时的顺序保持一致
norm_size=224
imagelist=[]
emotion_labels = {
0: ‘black-grass’,
1: ‘charlock’,
2: ‘cleavers’,
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、oppo等大厂,18年进入阿里一直到现在。
深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加vx:vip204888 (备注大数据获取)
,小编13年上海交大毕业,曾经在小公司待过,也去过华为、oppo等大厂,18年进入阿里一直到现在。**
深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
[外链图片转存中…(img-lpcpvlpd-1712859774963)]
[外链图片转存中…(img-tifrfzw5-1712859774963)]
[外链图片转存中…(img-13ew5eep-1712859774964)]
[外链图片转存中…(img-r8at2lua-1712859774964)]
[外链图片转存中…(img-brrrvbz1-1712859774964)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加vx:vip204888 (备注大数据获取)
[外链图片转存中…(img-gzfqfwof-1712859774964)]
发表评论