1.配置环境
第三方库:
cv2
pytorch
torchvision
keras常用函数:
pytorch常用函数:
当sorted()函数被调用时,它会提供一个有序的列表作为返回值。
返回指定路径下的文件和文件夹列表。
在opencv-python中,若想为图像创建一个容器,需要指定dtype=np.uint8,否则虽然你的容器矩阵中是有值的,但是无法正常imshow,另数据类型为 np.uint8,也就是0~255,所以若计算过程中数据超出了这个范围,就会造成溢出。
用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。如: for i, file in enumerate(image_dir)
裁剪后的图片还是以numpy array
的方式保存的, 数值的取值范围是(0~255)
cv2.resize(src,dsize,dst=None,fx=None,fy=None,interpolation=None)
参数:
scr
:原图(cv2.imread()中读取出来的)
dsize
:输出图像尺寸
fx
:沿水平轴的比例因子
fy
:沿垂直轴的比例因子
interpolation
:插值方法
keras.layers.Dense(units,activation=None,use_bias=True,kernel_initializer='glorot_uniform',bias_initializer='zeros',kernel_regularizer=None,bias_regularizer=None,activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
units:该层有几个神经元
activation:该层使用的激活函数
use_bias:是否添加偏置项
kernel_initializer:权重初始化方法
bias_initializer:偏置值初始化方法
kernel_regularizer:权重规范化函数
bias_regularizer:偏置值规范化方法
activity_regularizer:输出的规范化方法
kernel_constraint:权重变化限制函数
bias_constraint:偏置值变化限制函数
keras.callbacks.TensorBoard(log_dir='./logs', histogram_freq=0, write_graph=True, write_images=False, embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None)
keras.callbacks.ModelCheckpoint(filepath,monitor='val_loss',verbose=0,save_best_only=False, save_weights_only=False, mode='auto', period=1)
fit( x, y, batch_size=32, epochs=10, verbose=1, callbacks=None,validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0)
class_weight:字典,将不同的类别映射为不同的权值,该参数用来在训练过程中调整损失函数(只能用于训练)
sample_weight:权值的numpy
array,用于在训练时调整损失函数(仅用于训练)。可以传递一个1D的与样本等长的向量用于对样本进行1对1的加权,或者在面对时序数据时,传递一个的形式为(samples,sequence_length)的矩阵来为每个时间步上的样本赋不同的权。这种情况下请确定在编译模型时添加了sample_weight_mode=’temporal’。
import os
import numpy as np
import cv2
import keras
import pandas as pd
import time
def readfile(path,lable):
image = sorted(os.listdir(path))#读取标签
#x用来存储图片
x = np.zeros((len(image),128,128,3),dtype=np.uint8)
#y用来存储标签
y = np.zeros((len(image)),dtype=np.uint8)
for i,file in enumerate(image):
img = cv2.imread(os.path.join(path,file))
#将多个路径组合后返回(加上这个训练测试集都可以调用)
x[i,:,:] = cv2.resize(img,(128,128))
if lable:
y[i]=int(file.split("_")[0])
if lable:
return x,y
else:
return x
data_dress="./food-11"
train_x,train_y = readfile(os.path.join(data_dress,"training"),True)
val_x,val_y=readfile(os.path.join(data_dress,"validation"),True)
test_x = readfile(os.path.join(data_dress,"testing"),False)
#设计CNN
modle = keras.models.Sequential()
#输入尺寸(128,128,3)
# padding: same:对边缘补0 valid:对边缘不补0
modle.add(keras.layers.Conv2D(32,(3,3),strides = (1,1),padding = "same",activation="relu",input_shape=(128,128,3)))
modle.add(keras.layers.MaxPooling2D(pool_size = (2,2),strides = (2,2)))
modle.add(keras.layers.Conv2D(64,(3,3),strides = (1,1),padding = "same",activation="relu"))
modle.add(keras.layers.MaxPooling2D(pool_size = (2,2),strides = (2,2)))
modle.add(keras.layers.Flatten())#128个filter??
modle.add(Dropout(0.5))
for i in range(20):
modle.add(keras.layers.Dense(100,activation="selu"))
modle.add(keras.layers.Dense(11,activation="softmax"))
modle.compile(loss = "sparse_categorical_crossentropy",optimizer = "adam",metrics = ["accuracy"])
#激活函数
#网络一共20个layer,每个layer有100个Node。Activation Function选择selu是为了自动批归一化,提高准确率。
dress = "./H5"
epoch=20
if not os.path.exists(dress):
os.mkdir(dress)
#如果地址不存在就创建地址
output_modle = os.path.join(dress,"cnn_classification.h5")
history = modle.fit(train_x,train_y,epochs=epoch)
#计算测试集准确率
modle.evaluate(val_x,val_y)
训练集准确率达到87.5%
测试集准确率却只有29%,使用三种方法:早停,正则化,droupout
1.demo中程序:点击跳转
2.demo中程序:点此跳转
3.使用keras的作业:点击跳转
4.keras常用函数:点击跳转
5.pytorch常用函数:点击跳转