Tensorflow 3-Kanal, um der Farbe Eingänge
Ich bin mit tensor-flow-Prozess Farbbilder mit einer convolutional neural network. Ein code-snippet unten.
Mein code läuft so, ich glaube, ich habe die Anzahl der Kanäle rechts. Meine Frage ist, wie kann ich mich richtig, um die rgb-Daten? Ist es in der form rgbrgbrgb oder wäre es rrrgggbbb? Derzeit bin ich mit der letzteren. Danke. Jede Hilfe würde geschätzt werden.
c_output = 2
c_input = 784 * 3
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial)
def bias_variable(shape):
initial = tf.constant(0.1, shape=shape)
return tf.Variable(initial)
def conv2d(x, W):
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
def max_pool_2x2(x):
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
strides=[1, 2, 2, 1], padding='SAME')
self.c_x = tf.placeholder(tf.float32, shape=[None, c_input])
self.c_y_ = tf.placeholder(tf.float32, shape=[None, c_output])
self.W_conv1 = weight_variable([5, 5, 3, 32])
self.b_conv1 = bias_variable([32])
self.x_image = tf.reshape(self.c_x, [-1, 28, 28 , 3])
self.h_conv1 = tf.nn.relu(conv2d(self.x_image, self.W_conv1) + self.b_conv1)
self.h_pool1 = max_pool_2x2(self.h_conv1)
self.W_conv2 = weight_variable([5, 5, 32, 64])
self.b_conv2 = bias_variable([64])
self.h_conv2 = tf.nn.relu(conv2d(self.h_pool1, self.W_conv2) + self.b_conv2)
self.h_pool2 = max_pool_2x2(self.h_conv2)
self.W_fc1 = weight_variable([7 * 7 * 64, 1024])
self.b_fc1 = bias_variable([1024])
self.h_pool2_flat = tf.reshape(self.h_pool2, [-1, 7 * 7 * 64 ])
self.h_fc1 = tf.nn.relu(tf.matmul(self.h_pool2_flat, self.W_fc1) + self.b_fc1)
self.keep_prob = tf.placeholder(tf.float32)
self.h_fc1_drop = tf.nn.dropout(self.h_fc1, self.keep_prob)
self.W_fc2 = weight_variable([1024, c_output])
self.b_fc2 = bias_variable([c_output])
self.y_conv = tf.matmul(self.h_fc1_drop, self.W_fc2) + self.b_fc2
self.c_cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(self.y_conv, self.c_y_))
self.c_train_step = tf.train.AdamOptimizer(1e-4).minimize(self.c_cross_entropy)
self.c_correct_prediction = tf.equal(tf.argmax(self.y_conv, 1), tf.argmax(self.c_y_, 1))
self.c_accuracy = tf.reduce_mean(tf.cast(self.c_correct_prediction, tf.float32))
Du musst angemeldet sein, um einen Kommentar abzugeben.
TL;DR: Mit Ihrem aktuellen Programm, die in-memory-layout der Daten sollte sein sollte die R-G-B-R-G-B-R-G-B-R-G-B...
Davon gehe ich aus dieser Linie, die Sie übergeben, in RGB-Bilder mit 28x28 Pixel:
Können wir die Dimensionen der
self.x_image
sind "charge", "Höhe", "Breite" und "Kanal". Dies entspricht der Standard-Daten-format fürtf.nn.conv_2d()
undtf.nn.max_pool()
.In TensorFlow, die in-memory-Darstellung eines Tensors ist row-major-Reihenfolge (oder "C" bestellen, denn das ist die Darstellung von arrays in der Programmiersprache C). Im wesentlichen bedeutet dies, dass die am weitesten rechts stehenden dimension ist die am schnellsten ändern, und die Elemente des Tensors werden zusammen verpackt in Speicher in der folgenden Reihenfolge (wo
?
steht für das unbekannte batch-Größe minus 1):Daher Ihr Programm wahrscheinlich nicht die Interpretation der Bild-Daten korrekt. Es gibt mindestens zwei Möglichkeiten:
Verändern Sie Ihre Daten, um dessen wahre Ordnung ("batch", "Kanäle", "Höhe", "Breite"):
In der Tat, dieses format ist manchmal effizienter für die Faltung. Sie können anweisen
tf.nn.conv2d()
undtf.nn.max_pool()
nutzen ohne Umsetzung durch die übergabe der optionale argumentdata_format="NCHW"
, aber Sie müssen auch zu ändern Sie die Form Ihres bias-Variablen übereinstimmen.Transponieren Sie Ihre Bild-Daten übereinstimmt, das Ergebnis Ihres Programms mit
tf.transpose()
:[i, j, k, l]
in einem 4-D-tensor in NHWC-format ist das pixel für die batch-elementi
-, y-Koordinatej
x-Koordinatek
- und Kanall
.tf.image.resize_image_with_crop_or_pad()
für Sie arbeiten würde?