Регрессионная модель CNN всегда подходит - PullRequest
0 голосов
/ 24 марта 2020

Я работаю над проблемой регрессии, которая связана с изображениями. В общем, я должен прогнозировать высоту сетки на основе информации и особенностей, извлеченных из изображений. Я пытался использовать сверточные слои в качестве экстракторов объектов, чтобы извлечь объекты для той части изображения, которую я хочу, подобной https://arxiv.org/abs/1504.06066

Однако я ничего не получу с моей сетью и он всегда подходит, даже если у меня есть только 1032 обучаемых параметра, которые достаточно малы для набора данных из 4k изображений.

Вот код для моей сети, который является адаптацией Dens enet: https://github.com/taki0112/Densenet-Tensorflow

 def buildNetwork(self):
        x = self.placeholders['imageInput']
        # x = tf.expand_dims(x, 0)
        stride = 1;
    with tf.variable_scope("ImageNetwork_"):
        x1 = self.conv_layer(x,7,2*self.growthRate,2,name="conv1");

        x=self.denseBlock(x1,name="dense1",size=1);
        x2=self.transitionLayer(x,name="transition1");

        x=self.denseBlock(x2,name="dense2",size=1);
        x3=self.transitionLayer(x,name="transition2");
        vertexFeatures = self.extractFeatures(
            features=[tf.squeeze(x1), tf.squeeze(x2), tf.squeeze(x3)]);
        self.features = vertexFeatures;
        mlp5 = self.fc_layer(vertexFeatures, 4, "_MLP5", True);
        mlp6 = self.fc_layer(mlp5, 1, "_MLP6", False);

        #tf.layers.dropout(mlp6, rate=Config.DROPOUT_RATIO, training=Config.IS_TRAINING);

        mlp6 = tf.squeeze(mlp6);

Вот мой экстрактор объектов, который извлекает объекты для координат, заданных из слоев x1, x2 и x3:

 currentFeatures = features[c];
                #Determine corordinate according to image size
                shape = currentFeatures.get_shape().as_list();
                batch = shape[0];
                coordstf33 = [shape[1]/2,shape[1]/2];
                #---------------------------------------------------------

            coords33floorStacked = np.zeros((batch, coordShape, 3), dtype=np.float);
            coords33floor = np.floor(coordstf33);

            for j in range(batch):
                for i in range(coordShape):
                    coords33floorStacked[j][i] = [j, coords33floor[0], coords33floor[1]];

            coordstf33floortf = tf.convert_to_tensor(value=coords33floorStacked, dtype=tf.float32);
            coordstf33floortf = tf.cast(coordstf33floortf, dtype=tf.int32);

            #Extract images
            v133 = tf.gather_nd(currentFeatures, [coordstf33floortf], name="_gather_{}33".format(i + 1));

            finalTemp = tf.squeeze([v133]);

А вот еще одна часть сеть, которая также может быть найдена в ссылке GitHub выше:

def bottleneckLayer(self,input,name):
    with tf.variable_scope(name):
        c = self.Batch_Normalization(input,training=Config.IS_TRAINING,name=name+"_Batch1");
        c = tf.nn.relu(c);
        c =  self.conv_layer(c,1,4*self.growthRate,1,"_conv1");
        c = tf.layers.dropout(c,rate = Config.DROPOUT_RATIO,training=Config.IS_TRAINING);

        c = self.Batch_Normalization(c,training=Config.IS_TRAINING,name=name+"_Batch2");
        c = tf.nn.relu(c);
        c = self.conv_layer(c, 3,  self.growthRate, 1, "_conv2");
        c = tf.layers.dropout(c, rate=Config.DROPOUT_RATIO, training=Config.IS_TRAINING);
        return  c;


def transitionLayer(self,input,name):
    with tf.variable_scope(name):
        c =  self.Batch_Normalization(input,training=Config.IS_TRAINING,name=name+"_Batch1");
        c = tf.nn.relu(c);
        inChannel = c.shape[-1];
        features = inChannel.value;
        if(features %2!=0):
            features -=1;
        c = self.conv_layer(c,1,0.5*int(features),1,name="_conv1");
        c = tf.layers.dropout(c,rate=Config.DROPOUT_RATIO,training=Config.IS_TRAINING);
        c = self.max_pool(c,2,2,name="_avgPool");
        return c;


def denseBlock(self,input,name,size):
    with tf.variable_scope(name):
        x =  self.bottleneckLayer(input,"_bottleneck" + str(0));
        x = tf.concat([input,x],axis = 3);
        for i in range(1,size):
            k = self.bottleneckLayer(x,"_bottleneck" + str(i));
            x = tf.concat([x,k],axis = 3);

        return x;

Теперь я только попытался предсказать высоту из пикселя 64x64 из изображения размером 128x128, которое находится в диапазоне от 0 до 500, но я нормализовал его до 0 1. Мои потери при проверке не достигают уровня 2.71, а точность всегда ниже 20 процентов, независимо от того, сколько у меня весов, и я подозреваю, что проблема должна быть в другом месте. * 1 020 *

Я должен упомянуть, что число элементов, которые я извлекаю из этой части изображения, составляет всего 9, которые я затем передаю полностью связному слою перед предсказанием. Кроме того, я использую MSE в качестве функции потери. Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...