如何减少损失?

时间:2019-09-06 14:12:18

标签: tensorflow regression conv-neural-network

这应该是一个回归问题。

我希望神经网络能够从一张图像(如这3张图像)估计一条线的长度(以像素为单位),每张图像为200 x 200个:

a)Train_1 b)Train_2 c)Train_3

培训图片为6000张,验证图片为1000张。

标签是以像素为单位的距离:

a)1.205404496424333018e + 02

b)1.188780888137086436e + 02

c)1.110180165558725918e + 02

这是我的训练代码:

img_size = 200

def preprocess_image(image):
  image = tf.image.decode_jpeg(image, channels=3)
  image = tf.image.resize(image, [img_size, img_size])
  image /= 255.0  # normalize to [0,1] range

  return image

def load_and_preprocess_image(path):
  image = tf.read_file(path)
  return preprocess_image(image)

AUTOTUNE = tf.data.experimental.AUTOTUNE
BATCH_SIZE = 16

train_labels = np.loadtxt("train_labels.txt")
val_labels = np.loadtxt("test_labels.txt")

train_images = sorted(glob.glob("train_img/img_*.jpg"))
val_images = sorted(glob.glob("test_img/img_*.jpg"))

steps_per_epoch_count=tf.ceil(len(train_images)/BATCH_SIZE)

train_path_ds = tf.data.Dataset.from_tensor_slices(train_images)
val_path_ds = tf.data.Dataset.from_tensor_slices(val_images)

train_image_ds = train_path_ds.map(load_and_preprocess_image, 
num_parallel_calls = AUTOTUNE)
train_label_ds = 
tf.data.Dataset.from_tensor_slices(tf.cast(train_labels, tf.float32))
train_image_label_ds = tf.data.Dataset.zip((train_image_ds, 
train_label_ds))

val_image_ds = val_path_ds.map(load_and_preprocess_image, 
num_parallel_calls = AUTOTUNE)
val_label_ds = tf.data.Dataset.from_tensor_slices(tf.cast(val_labels, tf.float32))
val_image_label_ds = tf.data.Dataset.zip((val_image_ds, val_label_ds))


model = tf.keras.models.Sequential([
    tf.keras.layers.Convolution2D(16,3,3, input_shape=(img_size, 
img_size, 3), activation = 'relu'),

tf.keras.layers.MaxPooling2D(pool_size=(2,2)),
tf.keras.layers.Convolution2D(32,3,3, activation = 'relu'),
tf.keras.layers.MaxPooling2D(pool_size=(2,2)),
# tf.keras.layers.Convolution2D(64,3,3, activation = 'relu'),
# tf.keras.layers.MaxPooling2D(pool_size=(2,2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(400, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(200, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.1),
tf.keras.layers.Dense(100, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.05),
tf.keras.layers.Dense(1, activation=tf.nn.relu)
])

model.compile(optimizer=tf.keras.optimizers.RMSprop(0.01),
    loss = "mean_squared_error",
    metrics = ["mean_absolute_error", "mean_squared_error"]
    )

train_ds = train_image_label_ds.apply(tf.data.experimental.shuffle_and_repeat(buffer_size=len(train_images)))
train_ds = train_ds.batch(BATCH_SIZE)
train_ds = train_ds.prefetch(buffer_size=AUTOTUNE)


val_ds = val_image_label_ds.apply(
  tf.data.experimental.shuffle_and_repeat(buffer_size=len(val_images)))
val_ds = val_ds.batch(BATCH_SIZE)
val_ds = val_ds.prefetch(buffer_size=AUTOTUNE)

history = model.fit(
    train_ds, 
    epochs = 80, 
    validation_data = val_ds,
    steps_per_epoch = 374,
    validation_steps = 62
    )

但是,这是火车vs均值均方误差图: Plot

问题:

  1. 为什么验证损失不稳定?
  2. 在训练中,平均均方误差约为400,这似乎过高。我可以做些什么修改来改善估计?

编辑:

这是我最新的型号:

学习率= 0.01

批量大小= 16

model = tf.keras.models.Sequential([
    tf.keras.layers.Convolution2D(16,3,3, input_shape=(img_size, img_size, 3), activation = 'relu'),
    tf.keras.layers.MaxPooling2D(pool_size=(2,2)),
    tf.keras.layers.Convolution2D(32,3,3, activation = 'relu'),
    tf.keras.layers.MaxPooling2D(pool_size=(2,2)),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(2, activation=tf.nn.relu),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(2, activation=tf.nn.relu), #, kernel_regularizer = tf.keras.regularizers.l2(0.001)
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(2, activation=tf.nn.relu), #, kernel_regularizer = tf.keras.regularizers.l2(0.001)
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(2, activation=tf.nn.relu), #, kernel_regularizer = tf.keras.regularizers.l2(0.001)
    tf.keras.layers.Dense(1, activation="linear")
])

输出看起来像这样: Very closed train and validation loss

如您所见,训练和验证损失几乎相同。毫秒损耗都稳定在2393左右,平方根达到48.91像素误差,相当高。

有什么建议可以进一步降低?正常吗?

0 个答案:

没有答案