2017-12-30 9 views
0

Ich werde Keras vortrained Inception V3-Modell verwenden. Nach der Vorverarbeitung ist die Bildform 224 x 224 x 3. Aber die Eingabe in das Keras Inception V3-Modell ist (?, 3,?,?), Dh nach der Stapelgröße kommt der Kanal. Also habe ich Array-Shapes gemacht. Aber das macht die ganze Sache super langsam und verschlingt die Erinnerung, ich bin mir nicht sicher warum.numpy: schnellste Möglichkeit zum Ändern der Bildform von 224 x 224 x 3 auf 3 x 224 x 224

Hinweis: Wenn die Bildform 224, 224, 3 war, funktioniert es gut auf einem einfachen CNN. Aber 3, 224, 224, die dem einfachen CNN zugeführt wurden, machten die Dinge superlangsam und Speicherüberlauf.

Dies ist mein Code:

def get_image_preprocessed(image_name): 
    im = Image.open(image_name) 
    im = np.asarray(im) 
    im = im/float(255) 
    im = im.reshape(3,224,224) #this changes 224,224,3 to 3,224,224 
    return im 

Dies ist der Eingang Tensor Form

tf.Tensor 'input_1: 0' shape = (? ?, 3,,) dtype = float32

Weitere Informationen:

Artikelnummer-

model = Sequential() 
model.add(Conv2D(32, (3, 3), input_shape=(3,224, 224), padding='same', activation='relu', kernel_constraint=maxnorm(3))) 
model.add(Dropout(0.2)) 
model.add(Conv2D(32, (3, 3), activation='relu', padding='same', kernel_constraint=maxnorm(3))) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Flatten()) 
model.add(Dense(512, activation='relu', kernel_constraint=maxnorm(3))) 
model.add(Dropout(0.5)) 
model.add(Dense(3, activation='softmax')) 

Generator Funktion-

def generator(save_dir_path, encoding_list, batch_size, image_size): 
    # Create empty arrays to contain batch of features and labels# 
    batch_features = np.zeros((batch_size, 3, image_size, image_size)) 
    batch_labels = np.zeros((batch_size,len(encoding_list))) 
    image_list= [file for file in os.listdir(save_dir_path) if (file.endswith('.jpeg') or file.endswith('.-'))] 
    while True: 
     for i in range(batch_size): 
      # choose random index in features 
      image_name= random.choice(image_list) 
      batch_features[i] = get_image_preprocessed(save_dir_path, image_name) 
      batch_labels[i] = np.asarray(get_encoding(encoding_list, image_name.split('_')[0])) 
     yield batch_features, batch_labels 
+0

Das sieht wie ein 'transpose' Problem, nicht eine' reshape' ein. Die '3' sollte weiterhin die Kanäle und die' 224,224' die Bildform darstellen. – hpaulj

+0

Ich tat, das Problem wurde nicht gelöst. Ich habe hier mehr Informationen hinzugefügt. – sjishan

+0

Das Problem ist das Backend. Sie müssen die Dokumentation für die korrekte Verwendung dieses Modells lesen. – Nain

Antwort

1

Sie .transpose hierfür mit verwenden:

im = im.transpose(2,0,1) 

Von nun an, das alte dritte Index (2) ist der erste Index, der alte erster Index (0) ist der zweite Index und der alte zweite Index (1) ist der dritte Index.

Also, wenn Sie Zugriff auf im[i,j,k] ist, ist wie Sie im[j,k,i]vor der transpose zugegriffen haben.

+0

Ich habe gerade transponiert, das Problem ist immer noch da. Bei Verwendung von 224.224,3 sind es etwa 300 MB, aber bei 3.224.224 4,4 GB. Das ist verrückt. – sjishan

+0

@sjishan: Das ist fast unmöglich, da 'transpose' * kein * Array erstellt, erstellt es eine * Sicht *. Normalerweise würde das ungefähr 100 Bytes dauern. –

+0

Hallo, ja.Ich habe es herausgefunden, das ist nicht das Problem mit "transpose" oder "reshape". 224,224,3 erstellt 1.910.851 Parameter. 3,224,224 schafft 205.533.091 Parameter. Das überfließt die Erinnerung. – sjishan

0

Andere als reshape und transpose, eine andere ähnliche Lösung: swapaxes in der Numpy-Bibliothek. Die folgende Zeile tauscht die erste Achse mit der dritten in einem Array im.

im.swapaxes(0,2) 

wenn ein ein ndarray ist, dann eine Ansicht eines zurückgegeben; andernfalls wird ein neues Array erstellt. --Quoted von numpy-1.13.0 Docs

Referenz

How does numpy.swapaxes work?

Verwandte Themen