Finetuning DNN在最后一层中具有连续输出

时间:2017-12-27 00:17:33

标签: tensorflow computer-vision deep-learning keras conv-neural-network

非常感谢有人可以帮助我:

我正在尝试对回归任务进行一些微调 - 我的输入是200X200 RGB图像,我的预测输出/标签是一组实际值(比方说,在[0,10]内虽然缩放在这里不是什么大问题......?)---在InceptionV3架构之上。以下是我的函数,它采用预训练的Inception模型,删除最后一层并添加一个新图层,设置为微调...

"""
Fine-tuning functions
"""
IM_WIDTH, IM_HEIGHT = 299, 299 #fixed size for InceptionV3
NB_EPOCHS = 3
BAT_SIZE = 32
FC_SIZE = 1024
NB_IV3_LAYERS_TO_FREEZE = 172

def eucl_dist(inputs):
    x, y = inputs
    return ((x - y)**2).sum(axis=-1)

def add_new_last_continuous_layer(base_model):
  """Add last layer to the convnet
  Args:
    base_model: keras model excluding top, for instance:
    base_model = InceptionV3(weights='imagenet',include_top=False)
  Returns:
    new keras model with last layer
  """
  x = base_model.output
  x = GlobalAveragePooling2D()(x)
  x = Dense(FC_SIZE, activation='relu')(x) 
  predictions = Lambda(eucl_dist, output_shape=(1,))(x)
  model = Model(input=base_model.input, output=predictions)
  return model

def setup_to_finetune_continuous(model):
   """Freeze the bottom NB_IV3_LAYERS and retrain the remaining top 
layers.
   note: NB_IV3_LAYERS corresponds to the top 2 inception blocks in 
     the inceptionv3 architecture
   Args:
     model: keras model
   """
   for layer in model.layers[:NB_IV3_LAYERS_TO_FREEZE]:
      layer.trainable = False
   for layer in model.layers[NB_IV3_LAYERS_TO_FREEZE:]:
      layer.trainable = True
   model.compile(optimizer=SGD(lr=0.0001, momentum=0.9),   
             loss='eucl_dist')

以下是我的实施:

base_model = InceptionV3(weights = "imagenet", 
include_top=False, input_shape=(3,200,200))
model0 = add_new_last_continuous_layer(base_model)

setup_to_finetune_continuous(model0)

history=model0.fit(train_x, train_y, validation_data = (test_x, test_y), nb_epoch=epochs, batch_size=32)
scores = model0.evaluate(test_x, test_y, verbose = 0)
features = model0.predict(X_train)

其中train_x(168435, 3, 200, 200) numpy数组,train_y(168435,) numpy数组。 test_xtest_y也是如此,但观察次数为42509

我在TypeError: Tensor object is not iterable add_new_last_continuous_layer()``函数中遇到了predictions = Lambda(eucl_dist, output_shape=(1,))(x)'' when going through the错误。你能不能给我一些指导来解决这个问题,问题是什么?非常感谢和节日快乐!

编辑: 将功能更改为:

def eucl_dist(inputs):
    x, y = inputs
    return ((x - y)**2).sum(axis=-1)

def add_new_last_continuous_layer(base_model):
  """Add last layer to the convnet
  Args:
    base_model: keras model excluding top, for instance:
    base_model = InceptionV3(weights='imagenet',include_top=False)
  Returns:
    new keras model with last layer
  """
  x = base_model.output
  x = GlobalAveragePooling2D()(x)
  x1 = Dense(FC_SIZE, activation='relu')(x) 
  x2 = Dense(FC_SIZE, activation='relu')(x) 
  predictions = Lambda(eucl_dist, output_shape=eucl_dist_shape)([x1,x2])
  model = Model(input=base_model.input, output=predictions)
  return model

1 个答案:

答案 0 :(得分:2)

lambda图层的输出形状是错误的。像这样定义你的函数:

from keras import backend as K

def euclidean_distance(vects):
    x, y = vects
    return K.sqrt(K.maximum(K.sum(K.square(x - y), axis=1, keepdims=True), K.epsilon()))


def eucl_dist_output_shape(shapes):
    shape1, shape2 = shapes
    return (shape1[0], 1)

predictions = Lambda(euclidean_distance, output_shape=eucl_dist_output_shape)([input1, input2])