tf.keras.applications 中有一些预定义好的经典卷积神经网络结构,如 VGG16 、 VGG19 、 ResNet 、 MobileNet、InceptionV3 等。我们可以直接调用这些经典的卷积神经网络结构(甚至载入预训练的参数),而无需手动定义网络结构。
导入需要的包
from keras.models import Model
from keras.layers import Dense, Flatten
from skimage import io, transform
import glob
import os
import numpy as np
from sklearn.model_selection import train_test_split
from keras.utils import np_utils
from keras.applications.vgg16 import VGG16
from keras.models import load_model
一个图像数据shape为[样本数N, 通道数C, 高度H, 宽度W],将其最后两个维度flatten,得到的是[N, C, H*W],标准的Batch Normalization就是在通道Channel这个维度上进行移动,对所有样本的所有值求均值和方差,有几个通道,得到的就是几个均值和方差。
path = r'./data/' # 数据存放路径(分类成文件夹,每个文件夹下的图片为一类)
w = 150
h = 150
c = 3
number_classification = 5#分类数
读取数据 ,Tensorflow定义的tensor的shape为[n,c,h,w],而我们直接读取文件格式是[n,h,w,c],需要进行转化
io.imread
读出图片格式是uint8(unsigned int)
;value是numpy array
;图像数据是以RGB
的格式进行存储的,通道值默认范围0-255。
def read_img(path):
'''
采用skimage的transform函数转换
改变图片尺寸resize函数
函数格式为:
skimage.transform.resize(image, output_shape)
image: 需要改变尺寸的图片
output_shape: 新的图片尺寸
'''
cate = [path + x for x in os.listdir(path) if os.path.isdir(path + x)]
imgs = []
labels = []
for idx, folder in enumerate(cate):
for im in glob.glob(folder + '/*.jpg'):
print('reading the images:%s' % (im))
img = io.imread(im)#RGB
img = transform.resize(img, (w, h))#转化格式
imgs.append(img)
labels.append(idx)
return np.asarray(imgs, np.float32), np.asarray(labels, np.int32)
data, label = read_img(path)
print("shape of data:", data.shape)
print("shape of label:&#