首页 文章

Tensorflow或Keras中的深度学习实现会产生截然不同的结果

提问于
浏览
5

Context: 我正在使用完全卷积网络来执行图像分割 . 通常,输入是RGB图像 shape = [512, 256] ,目标是定义带注释区域的2通道二进制掩码(第二通道与第一通道相反) .

Question: 我使用Tensorflow和Keras实现了相同的CNN实现 . 但Tensorflow模型并没有开始学习 . 实际上, loss 甚至随着时代的数量而增长!这个Tensorflow实现有什么问题阻止它学习?

Setup: 数据集分为3个子集:训练(78%),测试(8%)和验证(14%)集合,这些集合由8个图像批量馈送到网络 . 图表显示了每个子集的 loss 的演变 . 图像显示了10个纪元后的两个不同图像的 prediction .


Tensorflow 实施和结果

import tensorflow as tf

tf.reset_default_graph()
x = inputs = tf.placeholder(tf.float32, shape=[None, shape[1], shape[0], 3])
targets = tf.placeholder(tf.float32, shape=[None, shape[1], shape[0], 2])

for d in range(4):
    x = tf.layers.conv2d(x, filters=np.exp2(d+4), kernel_size=[3,3], strides=[1,1], padding="SAME", activation=tf.nn.relu)
    x = tf.layers.max_pooling2d(x, strides=[2,2], pool_size=[2,2], padding="SAME")

x = tf.layers.conv2d(x, filters=2, kernel_size=[1,1])
logits = tf.image.resize_images(x, [shape[1], shape[0]], align_corners=True)
prediction = tf.nn.softmax(logits)

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=targets, logits=logits))
optimizer = tf.train.RMSPropOptimizer(learning_rate=0.001).minimize(loss)

sess = tf.Session()
sess.run(tf.global_variables_initializer())

def run(mode, x_batch, y_batch):
    if mode == 'TRAIN':
        return sess.run([loss, optimizer], feed_dict={inputs: x_batch, targets: y_batch})
    else:
        return sess.run([loss, prediction], feed_dict={inputs: x_batch, targets: y_batch})

Keras 实施和结果

import keras as ke

ke.backend.clear_session()
x = inputs = ke.layers.Input(shape=[shape[1], shape[0], 3])

for d in range(4):
    x = ke.layers.Conv2D(int(np.exp2(d+4)), [3,3], padding="SAME", activation="relu")(x)
    x = ke.layers.MaxPool2D(padding="SAME")(x)

x = ke.layers.Conv2D(2, [1,1], padding="SAME")(x)
logits = ke.layers.Lambda(lambda x: ke.backend.tf.image.resize_images(x, [shape[1], shape[0]], align_corners=True))(x)
prediction = ke.layers.Activation('softmax')(logits)

model = ke.models.Model(inputs=inputs, outputs=prediction)
model.compile(optimizer="rmsprop", loss="categorical_crossentropy")

def run(mode, x_batch, y_batch):
    if mode == 'TRAIN':
        loss = model.train_on_batch(x=x_batch, y=y_batch)
        return loss, None
    else:
        loss = model.evaluate(x=x_batch, y=y_batch, batch_size=None, verbose=0)
        prediction = model.predict(x=x_batch, batch_size=None)
        return loss, prediction

两者之间肯定存在差异,但我对文档的理解使我无处可去 . 我真的很想知道差异在哪里 . 提前致谢!

1 回答

  • 1

    答案是在softmax的Keras实现中,它们减去了意外的 max

    def softmax(x, axis=-1):
        # when x is a 2 dimensional tensor
        e = K.exp(x - K.max(x, axis=axis, keepdims=True))
        s = K.sum(e, axis=axis, keepdims=True)
        return e / s
    

    以下是使用 max hack更新的Tensorflow实现以及相关的良好结果

    import tensorflow as tf
    
    tf.reset_default_graph()
    x = inputs = tf.placeholder(tf.float32, shape=[None, shape[1], shape[0], 3])
    targets = tf.placeholder(tf.float32, shape=[None, shape[1], shape[0], 2])
    
    for d in range(4):
        x = tf.layers.conv2d(x, filters=np.exp2(d+4), kernel_size=[3,3], strides=[1,1], padding="SAME", activation=tf.nn.relu)
        x = tf.layers.max_pooling2d(x, strides=[2,2], pool_size=[2,2], padding="SAME")
    
    x = tf.layers.conv2d(x, filters=2, kernel_size=[1,1])
    logits = tf.image.resize_images(x, [shape[1], shape[0]], align_corners=True)
    # The misterious hack took from Keras
    logits = logits - tf.expand_dims(tf.reduce_max(logits, axis=-1), -1)
    prediction = tf.nn.softmax(logits)
    
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=targets, logits=logits))
    optimizer = tf.train.RMSPropOptimizer(learning_rate=0.001).minimize(loss)
    
    sess = tf.Session()
    sess.run(tf.global_variables_initializer())
    
    def run(mode, x_batch, y_batch):
        if mode == 'TRAIN':
            return sess.run([loss, optimizer], feed_dict={inputs: x_batch, targets: y_batch})
        else:
            return sess.run([loss, prediction], feed_dict={inputs: x_batch, targets: y_batch})
    

    非常感谢Simon指出 Keras 实施:-)

相关问题