python - 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)所有层的形状和大小,我不明白“轴”在这种情况下应该是什么意思。
解决方案
似乎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"])
您应该根据您要学习的问题确定将余弦距离损失应用到哪个轴。它很可能是最后一个维度。
推荐阅读
- python - TF 2.0 中使用 Keras 的自定义损失函数
- aws-cdk - 将 RDS DatabaseCluster 从一个堆栈传递到另一个堆栈的正确方法是什么?
- python - Creating a file of max length characters, with a word inserted at random locations x amount of times
- python - Django 似乎不适用于某些 python 标志
- gradle - 如何在 Gradle 中启用 QueryDSL 的空间配置?
- openshift - 无法在 RHEL8 上安装 cdk-minishift(免费 RHEL 开发人员订阅)
- javascript - 用 require 加载 scss 会导致 bootstrap 4 变量被覆盖
- node.js - 将多个图像添加到画布中
- postgresql - 用于从外部 AKS 访问 postgres 的 Port-foward 命令在 kubectl 中由于 & 符号而无法工作
- postgresql - 创建一个序列实际上是创建一个大序列