当前位置 : 主页 > 编程语言 > python >

网络模型python

来源:互联网 收集:自由互联 发布时间:2022-06-28
基于VGG16垃圾分类 import os import random import keras . preprocessing . image as kpi from keras . applications . imagenet_utils import preprocess_input from keras . applications . inception_resnet_v2 import InceptionResNetV2 from ker

基于VGG16垃圾分类

import os
import random
import keras.preprocessing.image as kpi
from keras.applications.imagenet_utils import preprocess_input
from keras.applications.inception_resnet_v2 import InceptionResNetV2
from keras.layers import Dense
from keras import Model
from keras.callbacks import ModelCheckpoint
from keras.metrics import top_k_categorical_accuracy
import numpy as np
from keras.utils.np_utils import to_categorical
import matplotlib.pyplot as plt

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

# 设置级别
class_names_to_ids = {"cardboard": 0, "glass": 1, "metal": 2, "paper": 3, "plastic": 4, "trash": 5}

# 指定数据集,输出的path
data_dir = 'datasets/'
ouput_path = 'results/list.txt'

# 分出的数据集合path
train_list_path = 'results/list_train.txt'
test_list_path = 'results/list_test.txt'

#模型的保存
save_model_dir = "trained_model"
filepath = "model_{epoch:02d}-{val_acc:.2f}.hdf5"

# 将文件的相对路径极其类别写入文件list.txt
def read_lists():
with open(ouput_path, 'w') as fd:
for class_name in class_names_to_ids.keys():
images_list = os.listdir(data_dir + class_name)
for image_name in images_list:
fd.write('{classn}/{imagen} {classids}\\n'.format(
classn=class_name,
imagen=image_name,
classids=class_names_to_ids[class_name]))

# 数据集量
def read_datalines():
count = 0
with open(ouput_path, 'r') as fd:
for line in fd.readlines():
count += 1
return count

# 划分测试集和训练集
def exc_split_test_array(data_num):
_NUM_TEST_ARRAY = (int)(round(data_num * 0.20, 0))
_RANDOM_SEED = 0
lines = None

with open(ouput_path, 'r') as fd:
lines = fd.readlines()

random.seed(_RANDOM_SEED)
random.shuffle(lines)

with open(train_list_path, 'w') as fd:
if not lines is None:
for line in lines[_NUM_TEST_ARRAY:]:
fd.write(line)

with open(test_list_path, 'w') as fd:
if not lines is None:
for line in lines[:_NUM_TEST_ARRAY]:
fd.write(line)

# 加载路径字符串到array
def get_train_test_data(list_file):
train_x = []
train_y = []
with open(list_file) as fd:
for line in fd.readlines():
train_x.append(line.strip()[:-2])
train_y.append((int)(line.strip()[-1]))
return train_x, train_y

# 加载预处理数据
def process_train_test_data(x_path):

images = []
for image_path in x_path:
image_load = kpi.load_img('datasets/' + image_path)
img = kpi.img_to_array(image_load)
img = preprocess_input(img)
images.append(img)
return images

#模型设置
def top3_acc(y_true, y_pred):
return top_k_categorical_accuracy(y_true, y_pred, k=3)

def top5_acc(y_true, y_pred):
return top_k_categorical_accuracy(y_true, y_pred, k=5)

if __name__ == "__main__":
# read_lists()
# exc_split_test_array(read_datalines())
train_x, train_y = get_train_test_data(train_list_path)
test_x, test_y = get_train_test_data(test_list_path)

train_images = process_train_test_data(train_x)
test_images = process_train_test_data(test_x)

# 构建模型,这里使用的是keras中已经训练好的InceptionResNetV2模型
base_model = InceptionResNetV2(include_top=False, pooling='avg')
outputs = Dense(6, activation='softmax')(base_model.output)
model = Model(base_model.inputs, outputs)

#设置ModelCheckpoint,按照验集的准确率进行保存
checkpoint = ModelCheckpoint(os.path.join(save_model_dir, filepath),
monitor="val_acc",
verbose=1,
save_best_only=True)

model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy', top3_acc, top5_acc])

#模型训练
history = model.fit(np.array(train_images),
to_categorical(train_y),
batch_size=8,
epochs=5,
shuffle=True,
validation_data=(np.array(test_images), to_categorical(test_y)),
callbacks=[checkpoint])

plt.scatter(history.epoch,history.history.get("loss"))
plt.scatter(history.epoch,history.history.get("acc"))
plt.show()
上一篇:垃圾分类(加入增强学习和通道机制)
下一篇:没有了
网友评论