Я работаю над проблемой регрессии, которая связана с изображениями. В общем, я должен прогнозировать высоту сетки на основе информации и особенностей, извлеченных из изображений. Я пытался использовать сверточные слои в качестве экстракторов объектов, чтобы извлечь объекты для той части изображения, которую я хочу, подобной 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 в качестве функции потери. Заранее спасибо!