Модель может не конвертировать, а взорваться до инф.Как я могу решить эту проблему - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь реализовать 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.В чем причина этой проблемы?Это сама сетевая архитектура?

...