Я пытаюсь реализовать CNN, упомянутый в статье «Более богатые сверточные функции для обнаружения кромок».И это мой код тензорного потока:
Сначала я определяю функцию для удобного создания ядра для conv-layer:
def CreateFilter(str, x, y, z, k):
return tf.get_variable(str, shape=[x, y, z, k], initializer=tf.contrib.layers.xavier_initializer())
вычислительный граф RCF, но я только строюпервый этап:
g1 = tf.Graph()
with g1.as_default():
x = tf.placeholder(tf.float32, shape=[None, None, None, 3], name="x-input")
y = tf.placeholder(tf.float32, shape=[None, None, None, 3], name="y-input")
## stage 1
layer1 = tf.nn.conv2d(x, CreateFilter('filter1', 3, 3, 3, 64), strides=[1, 1, 1, 1], padding='SAME', name='stage1_layer1')
layer2 = tf.nn.conv2d(layer1, CreateFilter('filter2', 3, 3, 64, 64), strides=[1, 1, 1, 1], padding='SAME', name='stage1_layer2')
layer1_side = tf.nn.conv2d(layer1, CreateFilter('side_filter1', 1, 1, 64, 21), strides=[1, 1, 1, 1], padding='SAME', name='stage1_layer1')
layer2_side = tf.nn.conv2d(layer2, CreateFilter('side_filter2', 1, 1, 64, 21), strides=[1, 1, 1, 1], padding='SAME', name='stage1_layer1')
eltwise_layer1 = tf.add(layer1_side, layer2_side, name='eltwise_layer1')
# deconv1 = tf.nn.conv2d_transpose(eltwise_layer1, ,name='deconv1')
y_output = tf.nn.conv2d(eltwise_layer1, CreateFilter('Output_filter1', 1, 1, 21, 3), strides=[1, 1, 1, 1], padding='SAME',
name='stage1_output_layer')
pool_layer1 = tf.nn.max_pool(layer2, ksize=[1, 2, 2, 1], strides=[1, 1, 1, 1], padding='SAME', name='pool_layer1')
## stage 2
## stage 3
## stage 4
## stage 5
## fusion stage
# loss function
loss_fn = tf.losses.sigmoid_cross_entropy(y_output, y)
#loss_fn_mean = tf.reduce_mean(loss_fn)
# train model
optimizer = tf.train.AdamOptimizer(1e-4)
train = optimizer.minimize(loss_fn) # 训练目标:最小化损失函数
# initialize
init = tf.initialize_all_variables()
затем обучаем модель, количество данных составляет 70 (рисунки), а размер пакета составляет 2:
steps = 1000
with tf.Session(graph=g1) as sess:
sess.run(init)
writer = tf.summary.FileWriter('./graph', sess.graph)
# training process
for i in range(steps):
X = np.array([cv2.imread('./Data/X' + str((i % 70)+1) + '.jpg'), cv2.imread('./Data/X' + str(((i + 1) % 70)+1) + '.jpg')]) / 255
Y = np.array([cv2.imread('./Data/Y' + str((i % 70)+1) + '.jpg'), cv2.imread('./Data/Y' + str(((i + 1) % 70)+1) + '.jpg')]) / 255
print('****************')
print(i)
sess.run(train, feed_dict={x: X, y: Y})
predict = sess.run(y_output, feed_dict={x: X})[0, :, :, :]*255
cv2.imwrite('./predict.png', predict)
Во время обучения вывод (прогноз) становится все больше и больше.После обучения я обнаружил, что выход (прогноз) сети пытается быть inf.Может быть, вес ядра пытается быть inf.В чем причина этой проблемы?Это сама сетевая архитектура?