2017-05-19 3 views
0

Ich betreibe die tensorflow retrain tutorial, aber ich kann nicht verstehen, warum die Retrain-Bilder eine andere Größe als die Bilder sein können, auf denen das Modell ursprünglich trainiert wurde. Ich schaute in das retrain.py Skript, das die Bilder dem Modell zuführt, aber der Code macht keine Art von Bildgrößenänderung, es ist direkt reading the image from disk und sofort feeds it to the model.Wie funktioniert Tensorflow Umschulung letzte Schicht unterschiedliche Bildgrößen behandeln?

Weiß jemand, wie es beim Training der letzten Schicht Bilder unterschiedlicher Größe verwenden kann?

+0

Es könnte on the fly Bild Verkleinerung tun? – James

+0

was meinst du? Schlägst du vor, dass das Modell Bilder variabler Größe akzeptieren kann? – anthonybell

+0

nicht das Modell, aber der Code könnte eine Bildvorverarbeitung durchführen, um das Bild entweder zu skalieren oder zu unterteilen, bevor es an das Modell gesendet wird. Das ist nur eine Vermutung – James

Antwort

3

Technisch können die Inception-Modelle direkt auf eine Vielzahl von Bildgrößen angewendet werden. Dies ist möglich, weil die letzten durchschnittlichen Gemeinschaften vor der dichten Schicht ein globaler Durchschnitt-Pool ist (eher als 3x3 oder 2x2):

Von https://github.com/tensorflow/models/blob/master/inception/inception/slim/inception_model.py#L320:

 shape = net.get_shape() 
     net = ops.avg_pool(net, shape[1:3], padding='VALID', scope='pool') 

Dieses aus dem Fenster des Pooling gibt um das ganze Bild zu sein.

Mit anderen Worten, das Pooling Schicht mittelt die Merkmale über die räumlichen Abmessungen, so wird H x W x 20481 x 1 x 2048 unabhängig von H und W.


das gesagt ist, in meiner Erfahrung, die Anwendung NNs auf Skalen sehr unterschiedlich, wie sie in der Genauigkeit ausgebildet wurden einige Abnahme verursachen können (Aber das Netz funktionieren sollte)

1

@anthonybell Sie die richtigen sind Code macht keine Bildgrößenänderung. Aber wenn Sie das vortrainierte Netzwerk überprüfen gibt es eine Bild Resize-Schicht

<tf.Tensor 'DecodeJpeg/contents:0' shape=() dtype=string>, 
<tf.Tensor 'DecodeJpeg:0' shape=(?, ?, 3) dtype=uint8>, 
<tf.Tensor 'Cast:0' shape=(?, ?, 3) dtype=float32>, 
<tf.Tensor 'ExpandDims/dim:0' shape=(1,) dtype=int32>, 
<tf.Tensor 'ExpandDims:0' shape=(1, ?, ?, 3) dtype=float32>, 
<tf.Tensor 'ResizeBilinear/size:0' shape=(2,) dtype=int32>, 
<tf.Tensor 'ResizeBilinear:0' shape=(1, 299, 299, 3) dtype=float32>, 
<tf.Tensor 'Sub/y:0' shape=() dtype=float32>, 
<tf.Tensor 'Sub:0' shape=(1, 299, 299, 3) dtype=float32>, 
<tf.Tensor 'Mul/y:0' shape=() dtype=float32>, 
<tf.Tensor 'Mul:0' shape=(1, 299, 299, 3) dtype=float32>, 

Netzwerk werden die Bilder mit einer beliebigen Auflösung akzeptieren und intern wird es der Größe verändert 299x299

+0

Es scheint, als ob sie eine Art von Größe zu tun haben, denn wenn Sie auf die Faltungen schauen, wird das Bild auf jeder Ebene kleiner und kleiner .. Wenn mein Bild 8x8 war Was würde es tun, wenn es zu 1x1 kam. – anthonybell

+0

Das liegt daran, dass Pooling-Schichten zwischen Faltungsschichten liegen. Wenn die Eingabegröße 8x8 ist, wird die Größe des Bildes auf 299x299 geändert. –

Verwandte Themen