首页 > 解决方案 > Keras,编译:ValueError:您必须指定“轴”

问题描述

我才刚刚开始使用 DNN,我使用https://r2rt.com/binary-stochastic-neurons-in-tensorflow.html中的代码为二进制编码器构建了这个作为家庭作业:

def res_layer_enc(x):
    res =x
    #out = tf.contrib.layers.batch_norm(x, decay=0.9)
    out = BatchNormalization()(x)
    out = Dense(39*150, activation="tanh")(out)

    #out = tf.contrib.layers.batch_norm(x, decay=0.9)
    out = BatchNormalization()(out)
    out = Dense(39*150, activation="tanh")(out)

    out = Add()([res,out])
    out = Activation("tanh")(out)

    return out

def res_layer_dec(x):
    res =x
    #out = tf.contrib.layers.batch_norm(x, decay=0.9)
    out = BatchNormalization()(x)
    out = Dense(13*150, activation="tanh")(out)

    #out = tf.contrib.layers.batch_norm(x, decay=0.9)
    out = BatchNormalization()(out)
    out = Dense(13*150, activation="tanh")(out)

    out = Add()([res,out])
    out = Activation("tanh")(out)

    return out


## ENCODER #############################

## Initial dense layer
input_layer = Input(shape=(1,39,150), name="Input")
flat = Flatten(name="flatten")(input_layer)
enc_init_dense = Dense(39*150, activation="tanh", name="initial_dense_ENC")(flat)

## Residual layers (2 dense layers each)
net = res_layer_enc(enc_init_dense)
net = res_layer_enc(net)
net = res_layer_enc(net)

## Final dense layer
net = Dense(8, activation="tanh", name="final_dense_ENC")(net)

#########################################
## BINARY STOCHASTIC NEURONS ############
bsen = Lambda(binary_wrapper, output_shape=(8,))(net)
#########################################

## DECODER ##############################

## Initial dense layer
net = Dense(13*150, activation="tanh", name="initial_dense_DEC")(bsen)

## Residual layers (2 dense layers each)
net = res_layer_dec(net)
net = res_layer_dec(net)
net = res_layer_dec(net)

## Final dense layer
out = Dense(13*150, activation="tanh", name="final_dense_DEC")(net)


model = tf.keras.Model(inputs=input_layer, outputs=[out, bsen])

model.compile("Adam", loss=tf.losses.cosine_distance, metrics=["accuracy", "categorical_accuracy"])

一切正常,直到我尝试编译模型并收到以下错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-149-8db88edd7c07> in <module>
----> 1 model.compile("Adam", loss=tf.losses.cosine_distance, metrics=["accuracy", "categorical_accuracy"])

~\Anaconda3\lib\site-packages\tensorflow\python\training\checkpointable\base.py in _method_wrapper(self, *args, **kwargs)
    440     self._setattr_tracking = False  # pylint: disable=protected-access
    441     try:
--> 442       method(self, *args, **kwargs)
    443     finally:
    444       self._setattr_tracking = previous_value  # pylint: disable=protected-access

~\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py in compile(self, optimizer, loss, metrics, loss_weights, sample_weight_mode, weighted_metrics, target_tensors, distribute, **kwargs)
    447             else:
    448               weighted_loss = training_utils.weighted_masked_objective(loss_fn)
--> 449               output_loss = weighted_loss(y_true, y_pred, sample_weight, mask)
    450 
    451           if len(self.outputs) > 1:

~\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\training_utils.py in weighted(y_true, y_pred, weights, mask)
    645     """
    646     # score_array has ndim >= 2
--> 647     score_array = fn(y_true, y_pred)
    648     if mask is not None:
    649       mask = math_ops.cast(mask, y_pred.dtype)

~\Anaconda3\lib\site-packages\tensorflow\python\util\deprecation.py in new_func(*args, **kwargs)
    505                 'in a future version' if date is None else ('after %s' % date),
    506                 instructions)
--> 507       return func(*args, **kwargs)
    508 
    509     doc = _add_deprecated_arg_notice_to_docstring(

~\Anaconda3\lib\site-packages\tensorflow\python\ops\losses\losses_impl.py in cosine_distance(labels, predictions, axis, weights, scope, loss_collection, reduction, dim)
    322   axis = deprecated_argument_lookup("axis", axis, "dim", dim)
    323   if axis is None:
--> 324     raise ValueError("You must specify 'axis'.")
    325   if labels is None:
    326     raise ValueError("labels must not be None.")

ValueError: You must specify 'axis'.

我已经检查了好几次(即使是用笔和纸:D)所有层的形状和大小,我不明白“轴”在这种情况下应该是什么意思。

标签: pythontensorflowlambdakerasdeep-learning

解决方案


似乎tf.losses.cosine_distance无法自行确定要应用哪个轴,您应该指定轴,为此您需要使用 lambda 函数:

my_cosine = lambda y_true, y_pred: tf.losses.cosine_distance(y_true, y_pred, axis=...)

model.compile("Adam", loss=my_cosine, metrics=["accuracy", "categorical_accuracy"])

您应该根据您要学习的问题确定将余弦距离损失应用到哪个轴。它很可能是最后一个维度。


推荐阅读