完全卷积网络

时间:2019-02-08 22:12:46

标签: tensorflow.js

TensorFlow.js版本

tfjs-node-gpu 0.2.1

描述问题或功能要求

我正在尝试建立一个受监管的全卷积网络,并且无法生成适当的输出。网络结构基于完成的几个FCN示例,尤其是以下示例:http://deeplearning.net/tutorial/fcn_2D_segm.html

我将蒙版放置在一个单点4d布尔向量中,其顺序为[batch,height,width,class],并且只有一个类。输入数据被更改为[batch,height,width,1]的float32张量(无RGB通道),范围为0到1。

数据在这里,来自上面的同一教程:https://drive.google.com/file/d/0B_60jvsCt1hhZWNfcW4wbHE5N3M/view

        const input = tf.input({ shape: [this._dims[1], this._dims[2], this._dims[3]], name: 'Input', });

        const batchNorm_0 = tf.layers.batchNormalization().apply(input);
        //**Begin A-Scan Net*/
        const fcn_1_0 = tf.layers.conv2d( { name: '', kernelSize: [3, 3], strides: [1, 1], activation: 'relu', padding: 'same', filters: 64,  } ).apply(input);
        const fcn_2 = tf.layers.maxPool2d( { kernelSize: [2, 2], strides: [2, 2] } ).apply(fcn_1_0);

        const fcn_3_0 = tf.layers.conv2d( { kernelSize: [3, 3], strides: [1, 1], activation: 'relu', padding: 'same', filters: 64 } ).apply(fcn_2);
        const fcn_3_1 = tf.layers.conv2d( { kernelSize: [3, 3], strides: [1, 1], activation: 'relu', padding: 'same', filters: 64 } ).apply(fcn_3_0);
        const fcn_3_2 = tf.layers.conv2d( { kernelSize: [3, 3], strides: [1, 1], activation: 'relu', padding: 'same', filters: 64 } ).apply(fcn_3_1);
        const fcn_4 = tf.layers.maxPool2d( { kernelSize: [2, 2], strides: [2, 2] } ).apply(fcn_3_2);

        const fcn_5_0 = tf.layers.conv2d( { kernelSize: [3, 3], strides: [1, 1], activation: 'relu', padding: 'same', filters: 64 } ).apply(fcn_4);
        const fcn_5_1 = tf.layers.conv2d( { kernelSize: [3, 3], strides: [1, 1], activation: 'relu', padding: 'same', filters: 64 } ).apply(fcn_5_0);
        const fcn_5_2 = tf.layers.conv2d( { kernelSize: [3, 3], strides: [1, 1], activation: 'relu', padding: 'same', filters: 64 } ).apply(fcn_5_1);
        const fcn_6 = tf.layers.maxPool2d( { kernelSize: [2, 2], strides: [2, 2] } ).apply(fcn_5_2);

        const fcn_7_0 = tf.layers.conv2d( { kernelSize: [3, 3], strides: [1, 1], activation: 'relu', padding: 'same', filters: 64 } ).apply(fcn_6);
        const fcn_7_1 = tf.layers.conv2d( { kernelSize: [3, 3], strides: [1, 1], activation: 'relu', padding: 'same', filters: 64 } ).apply(fcn_7_0);
        const fcn_7_2 = tf.layers.conv2d( { kernelSize: [3, 3], strides: [1, 1], activation: 'relu', padding: 'same', filters: 64 } ).apply(fcn_7_1);
        const fcn_8 = tf.layers.maxPool2d( { kernelSize: [2, 2], strides: [2, 2] } ).apply(fcn_7_2);

        const fcn_9_0 = tf.layers.conv2d( { kernelSize: [3, 3], strides: [1, 1], activation: 'relu', padding: 'same', filters: 64 } ).apply(fcn_8);
        const fcn_9_1 = tf.layers.conv2d( { kernelSize: [3, 3], strides: [1, 1], activation: 'relu', padding: 'same', filters: 64 } ).apply(fcn_9_0);
        const fcn_9_2 = tf.layers.conv2d( { kernelSize: [3, 3], strides: [1, 1], activation: 'relu', padding: 'same', filters: 64 } ).apply(fcn_9_1);
        const fcn_10 = tf.layers.maxPool2d( { kernelSize: [2, 2], strides: [2, 2] } ).apply(fcn_9_2);

        const fcn_11 = tf.layers.conv2d({ kernelSize: [1, 1], strides: [1, 1], activation: 'relu', padding: 'same', filters: 2048 }).apply(fcn_10);

        const fcn_12 = tf.layers.conv2d({ kernelSize: [1, 1], strides: [1, 1], activation: 'relu', padding: 'same', filters: this._classes }).apply(fcn_11);

        const upsample_5 = tf.layers.conv2dTranspose( { kernelSize: [32, 32], strides: [32, 32], filters: this._classes, activation: 'relu', padding: 'same' } ).apply(fcn_12);
        const upsample_6 = tf.layers.conv2d( { kernelSize: [1, 1], strides: [1, 1], filters: this._classes, activation: 'softmax', padding: 'same' } ).apply(upsample_5);

        var model = tf.model( { name: 'AdvancedCNN', inputs: [input], outputs: [upsample_6] } );

损耗/计量/优化器是:

        const LEARNING_RATE = .00001;
        const optimizer = tf.train.adam(LEARNING_RATE)
        model.compile({
            optimizer,
            loss: tf.losses.logLoss,
            metrics: tf.metrics.categoricalCrossentropy,
        });

问题是网络无法学习,并且输出类为全0或全1,即使经过多个时期也是如此。我尝试了有无批处理规范和改变了学习率。数据听起来不错,所以我可能是格式化错误的数据,或者丢失功能,标签结构等出现了问题。

还有其他人使用TensorFlow.js构建FCN吗?

2 个答案:

答案 0 :(得分:1)

在完全CNN卷积神经网络中,最后一层是密集层或完全连接层。从该密集层计算softmax激活。当前,您的NN神经网络体系结构缺少这一层,因此您无法正确获得分类。

实际上这是最后一层,即使用卷积层学习到的不同特征执行分类的密集层。

唯一要指出的是,您可能需要在密集层的入口处使用一个扁平层-仅用于匹配尺寸的

更新: 在最后一层使用上采样层可能会导致损失减少。我认为问题与转置层有关。此article解释了什么是上采样

答案 1 :(得分:0)

我能够解决问题。我将<img />换为conv2dTransposeupSampling2d层。掩码的一键编码就足够了,conv2d就是损失函数。

最后,将我的图片缩小为256x512有助于加快训练时间。起作用的最终网络结构(超级原始网络,请尽可能使用它):

tf.losses.softmaxCrossEntropy