Tensorflow 微调DNN,在最后一层连续输出

Tensorflow 微调DNN,在最后一层连续输出,tensorflow,computer-vision,deep-learning,keras,conv-neural-network,Tensorflow,Computer Vision,Deep Learning,Keras,Conv Neural Network,如果有人能在这里帮助我,我将不胜感激: 我试图在回归任务上做一些微调——我的输入是200X200RGB图像,我的预测输出/标签是一组真实值(比如说,在[0,10]中,尽管在这里缩放不是什么大问题…?)——在InceptionV3体系结构之上。以下是我的函数,它们采用预先训练的Inception模型,删除最后一层并添加一个新层,为微调设置 """ Fine-tuning functions """ IM_WIDTH, IM_HEIGHT = 299, 299 #fixed size for Inc

如果有人能在这里帮助我,我将不胜感激:

我试图在回归任务上做一些微调——我的输入是
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\u x
是一个
(168435,3200200)
numpy
数组,
train\u y
是一个
(168435,)
numpy
数组。同样的情况也适用于
test_x
test_y
,但观察次数为
42509

我得到了
TypeError:Tensor object not iterable
错误,该错误发生在
predicts=Lambda(eucl\u dist,output\u shape=(1,)(x)')中,在执行
add\u new\u last\u continuous\u layer()``函数时。你能不能给我一些指导,让我避开这个问题,问题是什么?非常感谢,节日快乐

编辑: 将功能更改为:

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

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])

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])

可能重复的可能重复的可能重复的非常感谢Nain!:DExcuse我的n00b问题:输入1和输入2是来自基本_模型,还是我的训练样本?如果我没有错,那么您在这里使用欧几里德距离作为相似性度量。然后,
input1和input2
可以是两个训练样本,甚至是两个数据点。这取决于你如何设计你的问题非常感谢Nain如此迅速的回答!!请再次原谅我的新手性>\u在这种情况下,为什么不使用
mse
本身作为损失函数呢?非常感谢Nain!:DExcuse我的n00b问题:输入1和输入2是来自基本_模型,还是我的训练样本?如果我没有错,那么您在这里使用欧几里德距离作为相似性度量。然后,
input1和input2
可以是两个训练样本,甚至是两个数据点。这取决于你如何设计你的问题非常感谢Nain如此迅速的回答!!请再次原谅我的生疏>\u在这种情况下,为什么不使用
mse
本身作为损失函数呢?