這篇文章主要為大家展示了如何使用Keras預(yù)訓(xùn)練模型ResNet50進(jìn)行圖像分類,內(nèi)容簡而易懂,希望大家可以學(xué)習(xí)一下,學(xué)習(xí)完之后肯定會(huì)有收獲的,下面讓小編帶大家一起來看看吧。
成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)由有經(jīng)驗(yàn)的網(wǎng)站設(shè)計(jì)師、開發(fā)人員和項(xiàng)目經(jīng)理組成的專業(yè)建站團(tuán)隊(duì),負(fù)責(zé)網(wǎng)站視覺設(shè)計(jì)、用戶體驗(yàn)優(yōu)化、交互設(shè)計(jì)和前端開發(fā)等方面的工作,以確保網(wǎng)站外觀精美、成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站易于使用并且具有良好的響應(yīng)性。Keras提供了一些用ImageNet訓(xùn)練過的模型:Xception,VGG16,VGG19,ResNet50,InceptionV3。在使用這些模型的時(shí)候,有一個(gè)參數(shù)include_top表示是否包含模型頂部的全連接層,如果包含,則可以將圖像分為ImageNet中的1000類,如果不包含,則可以利用這些參數(shù)來做一些定制的事情。
在運(yùn)行時(shí)自動(dòng)下載有可能會(huì)失敗,需要去網(wǎng)站中手動(dòng)下載,放在“~/.keras/models/”中,使用WinPython則在“settings/.keras/models/”中。
修正:表示當(dāng)前是訓(xùn)練模式還是測試模式的參數(shù)K.learning_phase()文中表述和使用有誤,在該函數(shù)說明中可以看到:
The learning phase flag is a bool tensor (0 = test, 1 = train),所以0是測試模式,1是訓(xùn)練模式,部分網(wǎng)絡(luò)結(jié)構(gòu)下兩者有差別。
這里使用ResNet50預(yù)訓(xùn)練模型,對(duì)Caltech201數(shù)據(jù)集進(jìn)行圖像分類。只有CPU,運(yùn)行較慢,但是在訓(xùn)練集固定的情況下,較慢的過程只需要運(yùn)行一次。
該預(yù)訓(xùn)練模型的中文文檔介紹在http://keras-cn.readthedocs.io/en/latest/other/application/#resnet50。
我使用的版本:
1.Ubuntu 16.04.3
2.Python 2.7
3.Keras 2.0.8
4.Tensoflow 1.3.0
5.Numpy 1.13.1
6.python-opencv 2.4.9.1+dfsg-1.5ubuntu1
7.h6py 2.7.0
從文件夾中提取圖像數(shù)據(jù)的方式:
函數(shù):
def eachFile(filepath): #將目錄內(nèi)的文件名放入列表中 pathDir = os.listdir(filepath) out = [] for allDir in pathDir: child = allDir.decode('gbk') # .decode('gbk')是解決中文顯示亂碼問題 out.append(child) return out def get_data(data_name,train_left=0.0,train_right=0.7,train_all=0.7,resize=True,data_format=None,t=''): #從文件夾中獲取圖像數(shù)據(jù) file_name = os.path.join(pic_dir_out,data_name+t+'_'+str(train_left)+'_'+str(train_right)+'_'+str(Width)+"X"+str(Height)+".h6") print file_name if os.path.exists(file_name): #判斷之前是否有存到文件中 f = h6py.File(file_name,'r') if t=='train': X_train = f['X_train'][:] y_train = f['y_train'][:] f.close() return (X_train, y_train) elif t=='test': X_test = f['X_test'][:] y_test = f['y_test'][:] f.close() return (X_test, y_test) else: return data_format = conv_utils.normalize_data_format(data_format) pic_dir_set = eachFile(pic_dir_data) X_train = [] y_train = [] X_test = [] y_test = [] label = 0 for pic_dir in pic_dir_set: print pic_dir_data+pic_dir if not os.path.isdir(os.path.join(pic_dir_data,pic_dir)): continue pic_set = eachFile(os.path.join(pic_dir_data,pic_dir)) pic_index = 0 train_count = int(len(pic_set)*train_all) train_l = int(len(pic_set)*train_left) train_r = int(len(pic_set)*train_right) for pic_name in pic_set: if not os.path.isfile(os.path.join(pic_dir_data,pic_dir,pic_name)): continue img = cv2.imread(os.path.join(pic_dir_data,pic_dir,pic_name)) if img is None: continue if (resize): img = cv2.resize(img,(Width,Height)) img = img.reshape(-1,Width,Height,3) if (pic_index < train_count): if t=='train': if (pic_index >= train_l and pic_index < train_r): X_train.append(img) y_train.append(label) else: if t=='test': X_test.append(img) y_test.append(label) pic_index += 1 if len(pic_set) <> 0: label += 1 f = h6py.File(file_name,'w') if t=='train': X_train = np.concatenate(X_train,axis=0) y_train = np.array(y_train) f.create_dataset('X_train', data = X_train) f.create_dataset('y_train', data = y_train) f.close() return (X_train, y_train) elif t=='test': X_test = np.concatenate(X_test,axis=0) y_test = np.array(y_test) f.create_dataset('X_test', data = X_test) f.create_dataset('y_test', data = y_test) f.close() return (X_test, y_test) else: return