Keras中的y参数拟合和评估函数

时间:2018-07-06 04:23:30

标签: machine-learning keras

Keras文档说,fit和valuate函数中的y参数可以设置为None,这实际上是默认值。 (我在下面缩短了功能定义,以节省一些空间。)

fit(self, x=None, **y=None**,  ...)

evaluate(self, x=None, **y=None**, ...)

文档将值 的动机如下: “如果从框架本机张量(例如TensorFlow数据张量)馈送,则y可以为None(默认)。”

这并不能告诉我太多。谁能解释这到底意味着什么?如果可以举一个简短的例子,将不胜感激。

提前谢谢!

ADDENDUM1

例如,假设以下代码段

model = ResNet50(weights='imagenet')
x = model.get_layer('flatten_1').output # layer 'flatten_1' is the last layer of the "model"
model_out = Dense(128, activation='relu',  name='model_out')(x)
model_out = Lambda(lambda  x: K.l2_normalize(x,axis=-1))(model_out)

new_model = Model(inputs=model.input, outputs=model_out)

anchor_input = Input(shape=(224, 224, 3), name='anchor_input')
pos_input = Input(shape=(224, 224, 3), name='pos_input')
neg_input = Input(shape=(224, 224, 3), name='neg_input')

encoding_anchor   = new_model(anchor_input)
encoding_pos      = new_model(pos_input)
encoding_neg      = new_model(neg_input)

loss = Lambda(triplet_loss)([encoding_anchor, encoding_pos, encoding_neg])

siamese_network = Model(inputs  = [anchor_input, pos_input, neg_input], 
                        outputs = loss)

siamese_network.compile(optimizer=Adam(lr=.00003), loss=identity_loss)

在此示例中,当我稍后运行Keras的fit和/或评估函数时,应如何设置 y 参数?

附录2:

这是上面的代码中提到的Triplet_loss函数:

def triplet_loss(inputs):
    anchor, positive, negative = inputs
    positive_distance = K.square(anchor - positive)
    negative_distance = K.square(anchor - negative)
    positive_distance = K.sqrt(K.sum(positive_distance, axis=-1, keepdims=True))
    negative_distance = K.sqrt(K.sum(negative_distance, axis=-1, keepdims=True))
    loss = K.maximum(0.0, 2 + loss)
    return K.mean(loss)

1 个答案:

答案 0 :(得分:3)

这是一个好问题。即使不经常使用,Keras允许提供框架本机张量,而不是通过占位符提供。考虑以下示例:

from keras.models import Model
from keras.layers import Dense, Input
import tensorflow as tf

# TensorFlow native tensors
a = tf.random_uniform(shape=(32, 1,), maxval=1)
b = 2*a

# Keras model
x = Input(shape=(1,), tensor=a)
h = Dense(1)(x)
model = Model(x, h)
model.compile('sgd', 'mse', target_tensors=[b])

# Train + evaluate
model.fit(steps_per_epoch=1000)
print('MSE: {}'.format(model.evaluate(steps=10)))

在这里,我们通过keras.layers.Input中的参数tensor指定模型的输入。在这种情况下,Keras没有定义占位符(通常会通过model.fit中的参数x来填充占位符)。相反,TensorFlow张量a直接连接到x。同样,可以通过model.compile中的target_tensors来定义目标。

从框架本机张量进给时,应将model.fit的参数steps_per_epoch设置为构成一个纪元的批数,而model.evaluate的参数steps然后是用于评估模型的批次数量。