from keras.applications.vgg16 import VGG16 from keras.models import Sequential from keras.layers import Conv2D,MaxPool2D,Activation,Dropout,Flatten,Dense from keras.optimizers import SGD from keras.preprocessing.image import ImageDataGenerator,img_to_array,load_img import numpy as np import json import warnings warnings.filterwarnings("ignore") batch_size = 32 train_data = 'data/train/' test_data = 'data/test/' image_w = 150 image_h = 150 #載入模型 vgg16_model = VGG16(weights='imagenet', include_top=False, input_shape=(image_w,image_h,3)) # 搭建全連接層 top_model = Sequential() top_model.add(Flatten(input_shape=vgg16_model.output_shape[1:])) top_model.add(Dense(256,activation='relu')) top_model.add(Dropout(0.5)) top_model.add(Dense(10,activation='softmax')) model = Sequential() model.add(vgg16_model) model.add(top_model) train_datagen = ImageDataGenerator( rotation_range = 40, # 隨機旋轉度數 width_shift_range = 0.2, # 隨機水平平移 height_shift_range = 0.2,# 隨機豎直平移 rescale = 1/255, # 數據歸一化 shear_range = 20, # 隨機錯切變換 zoom_range = 0.2, # 隨機放大 horizontal_flip = True, # 水平翻轉 fill_mode = 'nearest', # 填充方式 ) test_datagen = ImageDataGenerator( rescale = 1/255, # 數據歸一化 ) # 生成訓練數據 train_generator = train_datagen.flow_from_directory( train_data, target_size=(image_w,image_h), batch_size=batch_size, ) # 測試數據 test_generator = test_datagen.flow_from_directory( test_data, target_size=(image_w,image_h), batch_size=batch_size, ) label = train_generator.class_indices #下面這一段是將每個狗的品種名字,保存到json文件里面。在預測的時候會預測出,0-9的數字 #我們可以通過數字索引出來這個名字,txt也可以 label = dict(zip(label.values(), label.keys())) file = open('label.json','w',encoding='utf-8') json.dump(label,file) # 定義優化器,代價函數,訓練過程中計算准確率 model.compile(optimizer=SGD(lr=1e-3,momentum=0.9),loss='categorical_crossentropy',metrics=['accuracy']) model.fit_generator(train_generator, steps_per_epoch=len(train_generator), epochs=50, validation_data=test_generator, validation_steps=len(test_generator)) # pip install h5py model.save('model_vgg16_dog.h5') #預測 from keras.models import load_model from keras.preprocessing.image import img_to_array,load_img import json import numpy as np import matplotlib.pyplot as plt file = open('label.json','r',encoding='utf-8') label = json.load(file) # 載入模型 model = load_model('model_vgg16_dog.h5') def predict(image): # 導入圖片 image = load_img(image) plt.imshow(image) image = image.resize((150,150)) image = img_to_array(image) image = image/255 image = np.expand_dims(image,0) plt.title(label[str(model.predict_classes(image)[0])]) plt.axis('off') plt.show() predict('data/test/n02093056-bullterrier/Niutougeng-is09aa7re.jpg')