歡迎您光臨本站 註冊首頁

使用Keras預訓練模型ResNet50進行圖像分類方式

←手機掃碼閱讀     qp18502452 @ 2020-06-11 , reply:0

Keras提供了一些用ImageNet訓練過的模型:Xception,VGG16,VGG19,ResNet50,InceptionV3。在使用這些模型的時候,有一個參數include_top表示是否包含模型頂部的全連接層,如果包含,則可以將圖像分為ImageNet中的1000類,如果不包含,則可以利用這些參數來做一些定製的事情。

在運行時自動下載有可能會失敗,需要去網站中手動下載,放在“~/.keras/models/”中,使用WinPython則在“settings/.keras/models/”中。

修正:表示當前是訓練模式還是測試模式的參數K.learning_phase()文中表述和使用有誤,在該函數說明中可以看到:

The learning phase flag is a bool tensor (0 = test, 1 = train),所以0是測試模式,1是訓練模式,部分網絡結構下兩者有差別。

這裡使用ResNet50預訓練模型,對Caltech101數據集進行圖像分類。只有CPU,運行較慢,但是在訓練集固定的情況下,較慢的過程只需要運行一次。

該預訓練模型的中文文檔介紹在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.h5py 2.7.0

從文件夾中提取圖像數據的方式:

函數:

  def eachFile(filepath):     #將目錄內的文件名放入列表中   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=''): #從文件夾中獲取圖像數據   file_name = os.path.join(pic_dir_out,data_name+t+'_'+str(train_left)+'_'+str(train_right)+'_'+str(Width)+"X"+str(Height)+".h5")    print file_name   if os.path.exists(file_name):   #判斷之前是否有存到文件中    f = h5py.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 = h5py.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

 

調用:

   global Width, Height, pic_dir_out, pic_dir_data   Width = 224   Height = 224   num_classes = 102    #Caltech101為102 cifar10為10   pic_dir_out = '/home/ccuux3/pic_cnn/pic_out/'    pic_dir_data = '/home/ccuux3/pic_cnn/pic_dataset/Caltech101/'   sub_dir = '224_resnet50/'   if not os.path.isdir(os.path.join(pic_dir_out,sub_dir)):    os.mkdir(os.path.join(pic_dir_out,sub_dir))   pic_dir_mine = os.path.join(pic_dir_out,sub_dir)   (X_train, y_train) = get_data("Caltech101_color_data_",0.0,0.7,data_format='channels_last',t='train')   y_train = np_utils.to_categorical(y_train, num_classes)

 

載入預訓練模型ResNet50,並將訓練圖像經過網絡運算得到數據,不包含頂部的全連接層,得到的結果存成文件,以後可以直接調用(由於我內存不夠,所以拆分了一下):

   input_tensor = Input(shape=(224, 224, 3))   base_model = ResNet50(input_tensor=input_tensor,include_top=False,weights='imagenet')   #base_model = ResNet50(input_tensor=input_tensor,include_top=False,weights=None)   get_resnet50_output = K.function([base_model.layers[0].input, K.learning_phase()],          [base_model.layers[-1].output])      file_name = os.path.join(pic_dir_mine,'resnet50_train_output'+'.h5')   if os.path.exists(file_name):    f = h5py.File(file_name,'r')    resnet50_train_output = f['resnet50_train_output'][:]    f.close()   else:    resnet50_train_output = []    delta = 10    for i in range(0,len(X_train),delta):     print i     one_resnet50_train_output = get_resnet50_output([X_train[i:i+delta], 0])[0]     resnet50_train_output.append(one_resnet50_train_output)    resnet50_train_output = np.concatenate(resnet50_train_output,axis=0)     f = h5py.File(file_name,'w')       f.create_dataset('resnet50_train_output', data = resnet50_train_output)    f.close()

 

將ResNet50網絡產生的結果用於圖像分類:

   input_tensor = Input(shape=(1, 1, 2048))   x = Flatten()(input_tensor)   x = Dense(1024, activation='relu')(x)   predictions = Dense(num_classes, activation='softmax')(x)    model = Model(inputs=input_tensor, outputs=predictions)   model.compile(optimizer=Adam(), loss='categorical_crossentropy',metrics=['accuracy'])

 

訓練圖像數據集:

   print(' Training ------------') #從文件中提取參數,訓練後存在新的文件中   cm = 0        #修改這個參數可以多次訓練   cm_str = '' if cm==0 else str(cm)   cm2_str = '' if (cm+1)==0 else str(cm+1)    if cm >= 1:    model.load_weights(os.path.join(pic_dir_mine,'cnn_model_Caltech101_resnet50_'+cm_str+'.h5'))   model.fit(resnet50_train_output, y_train, epochs=10, batch_size=128,)    model.save_weights(os.path.join(pic_dir_mine,'cnn_model_Caltech101_resnet50_'+cm2_str+'.h5'))

 

測試圖像數據集:

   (X_test, y_test) = get_data("Caltech101_color_data_",0.0,0.7,data_format='channels_last',t='test')    y_test = np_utils.to_categorical(y_test, num_classes)       file_name = os.path.join(pic_dir_mine,'resnet50_test_output'+'.h5')   if os.path.exists(file_name):    f = h5py.File(file_name,'r')    resnet50_test_output = f['resnet50_test_output'][:]    f.close()   else:    resnet50_test_output = []    delta = 10    for i in range(0,len(X_test),delta):     print i     one_resnet50_test_output = get_resnet50_output([X_test[i:i+delta], 0])[0]     resnet50_test_output.append(one_resnet50_test_output)    resnet50_test_output = np.concatenate(resnet50_test_output,axis=0)    f = h5py.File(file_name,'w')       f.create_dataset('resnet50_test_output', data = resnet50_test_output)    f.close()   print(' Testing ------------')  #對測試集進行評估   class_name_list = get_name_list(pic_dir_data) #獲取top-N的每類的準確率   pred = model.predict(resnet50_test_output, batch_size=32)

 

輸出測試集各類別top-5的準確率:

   N = 5   pred_list = []   for row in pred:    pred_list.append(row.argsort()[-N:][::-1]) #獲取最大的N個值的下標   pred_array = np.array(pred_list)   test_arg = np.argmax(y_test,axis=1)   class_count = [0 for _ in xrange(num_classes)]   class_acc = [0 for _ in xrange(num_classes)]   for i in xrange(len(test_arg)):    class_count[test_arg[i]] += 1    if test_arg[i] in pred_array[i]:     class_acc[test_arg[i]] += 1   print('top-'+str(N)+' all acc:',str(sum(class_acc))+'/'+str(len(test_arg)),sum(class_acc)/float(len(test_arg)))   for i in xrange(num_classes):    print (i, class_name_list[i], 'acc: '+str(class_acc[i])+'/'+str(class_count[i]))

 

完整代碼:

  # -*- coding: utf-8 -*-  import cv2  import numpy as np  import h5py  import os     from keras.utils import np_utils, conv_utils  from keras.models import Model  from keras.layers import Flatten, Dense, Input   from keras.optimizers import Adam  from keras.applications.resnet50 import ResNet50  from keras import backend as K     def get_name_list(filepath):    #獲取各個類別的名字   pathDir = os.listdir(filepath)   out = []   for allDir in pathDir:    if os.path.isdir(os.path.join(filepath,allDir)):     child = allDir.decode('gbk') # .decode('gbk')是解決中文顯示亂碼問題     out.append(child)   return out     def eachFile(filepath):     #將目錄內的文件名放入列表中   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=''): #從文件夾中獲取圖像數據   file_name = os.path.join(pic_dir_out,data_name+t+'_'+str(train_left)+'_'+str(train_right)+'_'+str(Width)+"X"+str(Height)+".h5")    print file_name   if os.path.exists(file_name):   #判斷之前是否有存到文件中    f = h5py.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 = h5py.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     def main():   global Width, Height, pic_dir_out, pic_dir_data   Width = 224   Height = 224   num_classes = 102    #Caltech101為102 cifar10為10   pic_dir_out = '/home/ccuux3/pic_cnn/pic_out/'    pic_dir_data = '/home/ccuux3/pic_cnn/pic_dataset/Caltech101/'   sub_dir = '224_resnet50/'   if not os.path.isdir(os.path.join(pic_dir_out,sub_dir)):    os.mkdir(os.path.join(pic_dir_out,sub_dir))   pic_dir_mine = os.path.join(pic_dir_out,sub_dir)   (X_train, y_train) = get_data("Caltech101_color_data_",0.0,0.7,data_format='channels_last',t='train')   y_train = np_utils.to_categorical(y_train, num_classes)      input_tensor = Input(shape=(224, 224, 3))   base_model = ResNet50(input_tensor=input_tensor,include_top=False,weights='imagenet')   #base_model = ResNet50(input_tensor=input_tensor,include_top=False,weights=None)   get_resnet50_output = K.function([base_model.layers[0].input, K.learning_phase()],          [base_model.layers[-1].output])      file_name = os.path.join(pic_dir_mine,'resnet50_train_output'+'.h5')   if os.path.exists(file_name):    f = h5py.File(file_name,'r')    resnet50_train_output = f['resnet50_train_output'][:]    f.close()   else:    resnet50_train_output = []    delta = 10    for i in range(0,len(X_train),delta):     print i     one_resnet50_train_output = get_resnet50_output([X_train[i:i+delta], 0])[0]     resnet50_train_output.append(one_resnet50_train_output)    resnet50_train_output = np.concatenate(resnet50_train_output,axis=0)     f = h5py.File(file_name,'w')       f.create_dataset('resnet50_train_output', data = resnet50_train_output)    f.close()      input_tensor = Input(shape=(1, 1, 2048))   x = Flatten()(input_tensor)   x = Dense(1024, activation='relu')(x)   predictions = Dense(num_classes, activation='softmax')(x)    model = Model(inputs=input_tensor, outputs=predictions)   model.compile(optimizer=Adam(), loss='categorical_crossentropy',metrics=['accuracy'])      print(' Training ------------') #從文件中提取參數,訓練後存在新的文件中   cm = 0        #修改這個參數可以多次訓練   cm_str = '' if cm==0 else str(cm)   cm2_str = '' if (cm+1)==0 else str(cm+1)    if cm >= 1:    model.load_weights(os.path.join(pic_dir_mine,'cnn_model_Caltech101_resnet50_'+cm_str+'.h5'))   model.fit(resnet50_train_output, y_train, epochs=10, batch_size=128,)    model.save_weights(os.path.join(pic_dir_mine,'cnn_model_Caltech101_resnet50_'+cm2_str+'.h5'))      (X_test, y_test) = get_data("Caltech101_color_data_",0.0,0.7,data_format='channels_last',t='test')    y_test = np_utils.to_categorical(y_test, num_classes)       file_name = os.path.join(pic_dir_mine,'resnet50_test_output'+'.h5')   if os.path.exists(file_name):    f = h5py.File(file_name,'r')    resnet50_test_output = f['resnet50_test_output'][:]    f.close()   else:    resnet50_test_output = []    delta = 10    for i in range(0,len(X_test),delta):     print i     one_resnet50_test_output = get_resnet50_output([X_test[i:i+delta], 0])[0]     resnet50_test_output.append(one_resnet50_test_output)    resnet50_test_output = np.concatenate(resnet50_test_output,axis=0)    f = h5py.File(file_name,'w')       f.create_dataset('resnet50_test_output', data = resnet50_test_output)    f.close()   print(' Testing ------------')  #對測試集進行評估   class_name_list = get_name_list(pic_dir_data) #獲取top-N的每類的準確率   pred = model.predict(resnet50_test_output, batch_size=32)   f = h5py.File(os.path.join(pic_dir_mine,'pred_'+cm2_str+'.h5'),'w')      f.create_dataset('pred', data = pred)   f.close()      N = 1   pred_list = []   for row in pred:    pred_list.append(row.argsort()[-N:][::-1]) #獲取最大的N個值的下標   pred_array = np.array(pred_list)   test_arg = np.argmax(y_test,axis=1)   class_count = [0 for _ in xrange(num_classes)]   class_acc = [0 for _ in xrange(num_classes)]   for i in xrange(len(test_arg)):    class_count[test_arg[i]] += 1    if test_arg[i] in pred_array[i]:     class_acc[test_arg[i]] += 1   print('top-'+str(N)+' all acc:',str(sum(class_acc))+'/'+str(len(test_arg)),sum(class_acc)/float(len(test_arg)))   for i in xrange(num_classes):    print (i, class_name_list[i], 'acc: '+str(class_acc[i])+'/'+str(class_count[i]))      print('----------------------------------------------------')   N = 5   pred_list = []   for row in pred:    pred_list.append(row.argsort()[-N:][::-1]) #獲取最大的N個值的下標   pred_array = np.array(pred_list)   test_arg = np.argmax(y_test,axis=1)   class_count = [0 for _ in xrange(num_classes)]   class_acc = [0 for _ in xrange(num_classes)]   for i in xrange(len(test_arg)):    class_count[test_arg[i]] += 1    if test_arg[i] in pred_array[i]:     class_acc[test_arg[i]] += 1   print('top-'+str(N)+' all acc:',str(sum(class_acc))+'/'+str(len(test_arg)),sum(class_acc)/float(len(test_arg)))   for i in xrange(num_classes):    print (i, class_name_list[i], 'acc: '+str(class_acc[i])+'/'+str(class_count[i]))      if __name__ == '__main__':   main()

 

運行結果:

  Using TensorFlow backend.  /home/ccuux3/pic_cnn/pic_out/Caltech101_color_data_train_0.0_0.7_224X224.h5    Training ------------  Epoch 1/10  6353/6353 [==============================] - 5s - loss: 1.1269 - acc: 0.7494    Epoch 2/10  6353/6353 [==============================] - 4s - loss: 0.1603 - acc: 0.9536    Epoch 3/10  6353/6353 [==============================] - 4s - loss: 0.0580 - acc: 0.9855    Epoch 4/10  6353/6353 [==============================] - 4s - loss: 0.0312 - acc: 0.9931    Epoch 5/10  6353/6353 [==============================] - 4s - loss: 0.0182 - acc: 0.9956    Epoch 6/10  6353/6353 [==============================] - 4s - loss: 0.0111 - acc: 0.9976    Epoch 7/10  6353/6353 [==============================] - 4s - loss: 0.0090 - acc: 0.9981    Epoch 8/10  6353/6353 [==============================] - 4s - loss: 0.0082 - acc: 0.9987    Epoch 9/10  6353/6353 [==============================] - 4s - loss: 0.0069 - acc: 0.9994    Epoch 10/10  6353/6353 [==============================] - 4s - loss: 0.0087 - acc: 0.9987    /home/ccuux3/pic_cnn/pic_out/Caltech101_color_data_test_0.0_0.7_224X224.h5    Testing ------------  ('top-1 all acc:', '2597/2792', 0.9301575931232091)  (0, u'62.mayfly', 'acc: 10/12')  (1, u'66.Motorbikes', 'acc: 240/240')  (2, u'68.octopus', 'acc: 7/11')  (3, u'94.umbrella', 'acc: 21/23')  (4, u'90.strawberry', 'acc: 10/11')  (5, u'86.stapler', 'acc: 13/14')  (6, u'83.sea_horse', 'acc: 15/18')  (7, u'72.pigeon', 'acc: 13/14')  (8, u'89.stop_sign', 'acc: 19/20')  (9, u'4.BACKGROUND_Google', 'acc: 125/141')  (10, u'22.cougar_face', 'acc: 18/21')  (11, u'81.scissors', 'acc: 9/12')  (12, u'100.wrench', 'acc: 8/12')  (13, u'57.Leopards', 'acc: 60/60')  (14, u'46.hawksbill', 'acc: 29/30')  (15, u'30.dolphin', 'acc: 19/20')  (16, u'9.bonsai', 'acc: 39/39')  (17, u'35.euphonium', 'acc: 18/20')  (18, u'44.gramophone', 'acc: 16/16')  (19, u'74.platypus', 'acc: 7/11')  (20, u'14.camera', 'acc: 15/15')  (21, u'55.lamp', 'acc: 15/19')  (22, u'38.Faces_easy', 'acc: 129/131')  (23, u'54.ketch', 'acc: 28/35')  (24, u'33.elephant', 'acc: 18/20')  (25, u'3.ant', 'acc: 8/13')  (26, u'49.helicopter', 'acc: 26/27')  (27, u'36.ewer', 'acc: 26/26')  (28, u'78.rooster', 'acc: 14/15')  (29, u'70.pagoda', 'acc: 15/15')  (30, u'58.llama', 'acc: 20/24')  (31, u'5.barrel', 'acc: 15/15')  (32, u'101.yin_yang', 'acc: 18/18')  (33, u'18.cellphone', 'acc: 18/18')  (34, u'59.lobster', 'acc: 7/13')  (35, u'17.ceiling_fan', 'acc: 14/15')  (36, u'16.car_side', 'acc: 37/37')  (37, u'50.ibis', 'acc: 24/24')  (38, u'76.revolver', 'acc: 23/25')  (39, u'84.snoopy', 'acc: 7/11')  (40, u'87.starfish', 'acc: 26/26')  (41, u'12.buddha', 'acc: 24/26')  (42, u'52.joshua_tree', 'acc: 20/20')  (43, u'43.gerenuk', 'acc: 10/11')  (44, u'65.minaret', 'acc: 23/23')  (45, u'91.sunflower', 'acc: 26/26')  (46, u'56.laptop', 'acc: 24/25')  (47, u'77.rhino', 'acc: 17/18')  (48, u'1.airplanes', 'acc: 239/240')  (49, u'88.stegosaurus', 'acc: 16/18')  (50, u'23.crab', 'acc: 17/22')  (51, u'8.binocular', 'acc: 8/10')  (52, u'31.dragonfly', 'acc: 18/21')  (53, u'6.bass', 'acc: 15/17')  (54, u'95.watch', 'acc: 72/72')  (55, u'0.accordion', 'acc: 17/17')  (56, u'98.wild_cat', 'acc: 9/11')  (57, u'67.nautilus', 'acc: 16/17')  (58, u'40.flamingo', 'acc: 20/21')  (59, u'92.tick', 'acc: 12/15')  (60, u'47.headphone', 'acc: 12/13')  (61, u'24.crayfish', 'acc: 15/21')  (62, u'97.wheelchair', 'acc: 17/18')  (63, u'27.cup', 'acc: 15/18')  (64, u'25.crocodile', 'acc: 14/15')  (65, u'2.anchor', 'acc: 7/13')  (66, u'19.chair', 'acc: 17/19')  (67, u'39.ferry', 'acc: 21/21')  (68, u'60.lotus', 'acc: 16/20')  (69, u'13.butterfly', 'acc: 26/28')  (70, u'34.emu', 'acc: 14/16')  (71, u'64.metronome', 'acc: 10/10')  (72, u'82.scorpion', 'acc: 24/26')  (73, u'7.beaver', 'acc: 12/14')  (74, u'48.hedgehog', 'acc: 16/17')  (75, u'37.Faces', 'acc: 131/131')  (76, u'45.grand_piano', 'acc: 30/30')  (77, u'79.saxophone', 'acc: 11/12')  (78, u'26.crocodile_head', 'acc: 9/16')  (79, u'80.schooner', 'acc: 15/19')  (80, u'93.trilobite', 'acc: 26/26')  (81, u'28.dalmatian', 'acc: 21/21')  (82, u'10.brain', 'acc: 28/30')  (83, u'61.mandolin', 'acc: 10/13')  (84, u'11.brontosaurus', 'acc: 11/13')  (85, u'63.menorah', 'acc: 25/27')  (86, u'85.soccer_ball', 'acc: 20/20')  (87, u'51.inline_skate', 'acc: 9/10')  (88, u'71.panda', 'acc: 11/12')  (89, u'53.kangaroo', 'acc: 24/26')  (90, u'99.windsor_chair', 'acc: 16/17')  (91, u'42.garfield', 'acc: 11/11')  (92, u'29.dollar_bill', 'acc: 16/16')  (93, u'20.chandelier', 'acc: 30/33')  (94, u'96.water_lilly', 'acc: 6/12')  (95, u'41.flamingo_head', 'acc: 13/14')  (96, u'73.pizza', 'acc: 13/16')  (97, u'21.cougar_body', 'acc: 15/15')  (98, u'75.pyramid', 'acc: 16/18')  (99, u'69.okapi', 'acc: 12/12')  (100, u'15.cannon', 'acc: 11/13')  (101, u'32.electric_guitar', 'acc: 19/23')  ----------------------------------------------------  ('top-5 all acc:', '2759/2792', 0.9881805157593123)  (0, u'62.mayfly', 'acc: 12/12')  (1, u'66.Motorbikes', 'acc: 240/240')  (2, u'68.octopus', 'acc: 11/11')  (3, u'94.umbrella', 'acc: 23/23')  (4, u'90.strawberry', 'acc: 11/11')  (5, u'86.stapler', 'acc: 14/14')  (6, u'83.sea_horse', 'acc: 16/18')  (7, u'72.pigeon', 'acc: 14/14')  (8, u'89.stop_sign', 'acc: 20/20')  (9, u'4.BACKGROUND_Google', 'acc: 141/141')  (10, u'22.cougar_face', 'acc: 19/21')  (11, u'81.scissors', 'acc: 11/12')  (12, u'100.wrench', 'acc: 10/12')  (13, u'57.Leopards', 'acc: 60/60')  (14, u'46.hawksbill', 'acc: 30/30')  (15, u'30.dolphin', 'acc: 20/20')  (16, u'9.bonsai', 'acc: 39/39')  (17, u'35.euphonium', 'acc: 20/20')  (18, u'44.gramophone', 'acc: 16/16')  (19, u'74.platypus', 'acc: 9/11')  (20, u'14.camera', 'acc: 15/15')  (21, u'55.lamp', 'acc: 18/19')  (22, u'38.Faces_easy', 'acc: 131/131')  (23, u'54.ketch', 'acc: 34/35')  (24, u'33.elephant', 'acc: 20/20')  (25, u'3.ant', 'acc: 10/13')  (26, u'49.helicopter', 'acc: 27/27')  (27, u'36.ewer', 'acc: 26/26')  (28, u'78.rooster', 'acc: 15/15')  (29, u'70.pagoda', 'acc: 15/15')  (30, u'58.llama', 'acc: 24/24')  (31, u'5.barrel', 'acc: 15/15')  (32, u'101.yin_yang', 'acc: 18/18')  (33, u'18.cellphone', 'acc: 18/18')  (34, u'59.lobster', 'acc: 13/13')  (35, u'17.ceiling_fan', 'acc: 14/15')  (36, u'16.car_side', 'acc: 37/37')  (37, u'50.ibis', 'acc: 24/24')  (38, u'76.revolver', 'acc: 25/25')  (39, u'84.snoopy', 'acc: 10/11')  (40, u'87.starfish', 'acc: 26/26')  (41, u'12.buddha', 'acc: 25/26')  (42, u'52.joshua_tree', 'acc: 20/20')  (43, u'43.gerenuk', 'acc: 11/11')  (44, u'65.minaret', 'acc: 23/23')  (45, u'91.sunflower', 'acc: 26/26')  (46, u'56.laptop', 'acc: 25/25')  (47, u'77.rhino', 'acc: 18/18')  (48, u'1.airplanes', 'acc: 240/240')  (49, u'88.stegosaurus', 'acc: 18/18')  (50, u'23.crab', 'acc: 22/22')  (51, u'8.binocular', 'acc: 10/10')  (52, u'31.dragonfly', 'acc: 20/21')  (53, u'6.bass', 'acc: 16/17')  (54, u'95.watch', 'acc: 72/72')  (55, u'0.accordion', 'acc: 17/17')  (56, u'98.wild_cat', 'acc: 11/11')  (57, u'67.nautilus', 'acc: 17/17')  (58, u'40.flamingo', 'acc: 21/21')  (59, u'92.tick', 'acc: 13/15')  (60, u'47.headphone', 'acc: 12/13')  (61, u'24.crayfish', 'acc: 21/21')  (62, u'97.wheelchair', 'acc: 18/18')  (63, u'27.cup', 'acc: 16/18')  (64, u'25.crocodile', 'acc: 15/15')  (65, u'2.anchor', 'acc: 12/13')  (66, u'19.chair', 'acc: 19/19')  (67, u'39.ferry', 'acc: 21/21')  (68, u'60.lotus', 'acc: 19/20')  (69, u'13.butterfly', 'acc: 27/28')  (70, u'34.emu', 'acc: 16/16')  (71, u'64.metronome', 'acc: 10/10')  (72, u'82.scorpion', 'acc: 26/26')  (73, u'7.beaver', 'acc: 14/14')  (74, u'48.hedgehog', 'acc: 17/17')  (75, u'37.Faces', 'acc: 131/131')  (76, u'45.grand_piano', 'acc: 30/30')  (77, u'79.saxophone', 'acc: 12/12')  (78, u'26.crocodile_head', 'acc: 14/16')  (79, u'80.schooner', 'acc: 19/19')  (80, u'93.trilobite', 'acc: 26/26')  (81, u'28.dalmatian', 'acc: 21/21')  (82, u'10.brain', 'acc: 30/30')  (83, u'61.mandolin', 'acc: 13/13')  (84, u'11.brontosaurus', 'acc: 13/13')  (85, u'63.menorah', 'acc: 25/27')  (86, u'85.soccer_ball', 'acc: 20/20')  (87, u'51.inline_skate', 'acc: 10/10')  (88, u'71.panda', 'acc: 12/12')  (89, u'53.kangaroo', 'acc: 26/26')  (90, u'99.windsor_chair', 'acc: 17/17')  (91, u'42.garfield', 'acc: 11/11')  (92, u'29.dollar_bill', 'acc: 16/16')  (93, u'20.chandelier', 'acc: 32/33')  (94, u'96.water_lilly', 'acc: 12/12')  (95, u'41.flamingo_head', 'acc: 14/14')  (96, u'73.pizza', 'acc: 16/16')  (97, u'21.cougar_body', 'acc: 15/15')  (98, u'75.pyramid', 'acc: 18/18')  (99, u'69.okapi', 'acc: 12/12')  (100, u'15.cannon', 'acc: 12/13')  (101, u'32.electric_guitar', 'acc: 23/23')

   


[qp18502452 ] 使用Keras預訓練模型ResNet50進行圖像分類方式已經有266次圍觀

http://coctec.com/docs/python/shhow-post-238002.html