Следующая функция прогнозирования работает нормально в случае не сверточной модели прямого распространения,
def predict(X, parameters):
W1 = tf.convert_to_tensor(parameters["W1"])
b1 = tf.convert_to_tensor(parameters["b1"])
W2 = tf.convert_to_tensor(parameters["W2"])
b2 = tf.convert_to_tensor(parameters["b2"])
W3 = tf.convert_to_tensor(parameters["W3"])
b3 = tf.convert_to_tensor(parameters["b3"])
params = {"W1": W1,
"b1": b1,
"W2": W2,
"b2": b2,
"W3": W3,
"b3": b3}
x = tf.placeholder("float", [12288, 1])
z3 = forward_propagation_for_predict(x, params)
p = tf.argmax(z3)
sess = tf.Session()
prediction = sess.run(p, feed_dict = {x: X})
return prediction
def forward_propagation_for_predict(X, parameters):
W1 = parameters['W1']
b1 = parameters['b1']
W2 = parameters['W2']
b2 = parameters['b2']
W3 = parameters['W3']
b3 = parameters['b3']
Z1 = tf.add(tf.matmul(W1, X), b1)
A1 = tf.nn.relu(Z1)
Z2 = tf.add(tf.matmul(W2, A1), b2)
A2 = tf.nn.relu(Z2)
Z3 = tf.add(tf.matmul(W3, A2), b3)
return Z3
Я попытался изменить код для сверточного forward_propagation
и применил следующие изменения,
def predict(X, parameters):
X = np.reshape(X,(1,100,100,3))
W1 = tf.convert_to_tensor(parameters["W1"])
W2 = tf.convert_to_tensor(parameters["W2"])
params = {"W1": W1,
"W2": W2,
}
x = tf.placeholder("float", [1,100,100,3])
z3 = forward_propagation_for_predict(x, params)
p = tf.argmax(z3)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
prediction = sess.run(p, feed_dict = {x: X})
return prediction
def forward_propagation_for_predict(X, parameters): #altered implementation for convolutional NN
# Retrieve the parameters from the dictionary "parameters"
W1 = parameters['W1']
W2 = parameters['W2']
Z1 = tf.nn.conv2d(X, W1, strides = [1,1,1,1], padding = 'SAME')
# RELU
A1 = tf.nn.relu(Z1)
# MAXPOOL: window 8x8, sride 8, padding 'SAME'
P1 = tf.nn.max_pool(A1, ksize = [1,8,8,1], strides = [1,8,8,1], padding = 'SAME')
# CONV2D: filters W2, stride 1, padding 'SAME'
Z2 = tf.nn.conv2d(P1, W2, strides = [1,1,1,1], padding = 'SAME')
# RELU
A2 = tf.nn.relu(Z2)
# MAXPOOL: window 4x4, stride 4, padding 'SAME'
P2 = tf.nn.max_pool(A2, ksize = [1,4,4,1], strides = [1,4,4,1], padding = 'SAME')
# FLATTEN
P2 = tf.contrib.layers.flatten(P2)
# FULLY-CONNECTED without non-linear activation function (not not call softmax).
Z3 = tf.contrib.layers.fully_connected(P2, 6, activation_fn=None)
return Z3
У меня возникают следующие сомнения / проблемы,
Измененная реализация требует инициализации параметров tf
, тогда как в исходной реализации это не требовалось (если параметры tf
должныбыть инициализированным перед его использованием, тогда как получается, что он работает в исходной реализации)
После инициализации параметров ответом будет вектор всех нулей, а не один горячий.(Например, array([0, 0, 0, 0, 0, 0], dtype=int64)
)
Примечание. Я не использую смещения, поэтому я удалил эти параметры.