Deep learning CNN回归预测每个测试图像的相同值。

Deep learning CNN回归预测每个测试图像的相同值。,deep-learning,keras,conv-neural-network,convolution,Deep Learning,Keras,Conv Neural Network,Convolution,所以,这只是我试图解决的问题的一部分。我有大约200k 64x64x3 RGB图像,这些图像是机器人驾驶过的地形。每个面片都有一个相应的标签,标明该图像面片的粗糙度。粗糙度值的范围为0-160。数据是在机器人以不同速度行驶的情况下收集的,因此粗糙度值的范围也是如此。我的目标是能够预测补丁的粗糙度。我使用的是VGG-16网络,最后一层经过修改以进行回归。我的批量大小是1024,损失是平均误差,优化是rmsprop。网络如下所示。我的问题是,在训练之后,网络对每个测试图像的预测值完全相同。另一点需要

所以,这只是我试图解决的问题的一部分。我有大约200k 64x64x3 RGB图像,这些图像是机器人驾驶过的地形。每个面片都有一个相应的标签,标明该图像面片的粗糙度。粗糙度值的范围为0-160。数据是在机器人以不同速度行驶的情况下收集的,因此粗糙度值的范围也是如此。我的目标是能够预测补丁的粗糙度。我使用的是VGG-16网络,最后一层经过修改以进行回归。我的批量大小是1024,损失是平均误差,优化是rmsprop。网络如下所示。我的问题是,在训练之后,网络对每个测试图像的预测值完全相同。另一点需要注意的是,训练损失总是高于奇数验证损失。最后,我尝试了其他优化器,如SGD和Adam,以及不同的批量大小。现在,我正试图从头开始训练网络,但它似乎不太有希望。我不确定这里出了什么问题,我真的很感激能得到的任何帮助。谢谢

 if input_tensor is None:
    img_input = Input(shape=input_shape)
else:
    if not K.is_keras_tensor(input_tensor):
        img_input = Input(tensor=input_tensor, shape=input_shape)
    else:
        img_input = input_tensor
# Block 1
x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1')(img_input)
x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2')(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x)

# Block 2
x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1')(x)
x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv2')(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool')(x)

# Block 3
x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1')(x)
x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2')(x)
x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv3')(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(x)

# Block 4
x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1')(x)
x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv2')(x)
x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv3')(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(x)

# Block 5
x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1')(x)
x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv2')(x)
x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv3')(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool')(x)

x = Flatten(name='flatten')(x)
x = Dense(4096, activation='relu', name='fc1')(x)
x = Dense(4096, activation='relu', name='fc2')(x)
x = Dense(1,name='regression_dense')(x) 

根据您的解释,粗糙度值在0到160之间。在[-1,1]中规范化这些值。你可以在最后一层坚持你的线性激活函数。 但总的来说,我认为你可以用一个更浅的架构来解决这个问题,只需要一小部分的参数

干杯