评估tf.keras模型输出之间的成对距离

我正在尝试在TensorFlow中创建一个自定义损失函数。我使用的是TensorFlow v2.0.rc0来运行代码。以下是代码,其中min_dist_loss函数计算神经网络输出之间的成对损失。以下是代码:

def min_dist_loss(_, y_pred):    distances = []    for i in range(0, 16):        for j in range(i + 1, 16):            distances.append(tf.linalg.norm(y_pred[i] - y_pred[j]))    return -tf.reduce_min(distances)

模块的初始化和编译如下所示:

import tensorflow as tffrom tensorboard.plugins.hparams import api as hpHP_NUM_UNITS = hp.HParam('num_units', hp.Discrete([6, 7]))HP_OPTIMIZER = hp.HParam('optimizer', hp.Discrete(['adam', 'sgd']))METRIC_ACCURACY = 'accuracy'with tf.summary.create_file_writer('logs\hparam_tuning').as_default():    hp.hparams_config(        hparams=[HP_NUM_UNITS, HP_OPTIMIZER],        metrics=[hp.Metric(METRIC_ACCURACY, display_name='Accuracy')]    )def train_test_model(logdir, hparams):    weight1 = np.random.normal(loc=0.0, scale=0.01, size=[4, hparams[HP_NUM_UNITS]])    init1 = tf.constant_initializer(weight1)    weight2 = np.random.normal(loc=0.0, scale=0.01, size=[hparams[HP_NUM_UNITS], 7])    init2 = tf.constant_initializer(weight2)    model = tf.keras.models.Sequential([        # tf.keras.layers.Flatten(),        tf.keras.layers.Dense(hparams[HP_NUM_UNITS], activation=tf.nn.sigmoid, kernel_initializer=init1),        tf.keras.layers.Dense(7, activation=tf.nn.sigmoid, kernel_initializer=init2) if hparams[HP_NUM_UNITS] == 6 else        None,    ])    model.compile(        optimizer=hparams[HP_OPTIMIZER],        loss=min_dist_loss,        # metrics=['accuracy'],    )    x_train = [list(k) for k in itertools.product([0, 1], repeat=4)]    shuffle(x_train)    x_train = 2 * np.array(x_train) - 1    model.fit(        x_train, epochs=1, batch_size=16,        callbacks=[            tf.keras.callbacks.TensorBoard(logdir),            hp.KerasCallback(logdir, hparams)        ],    )

现在,由于min_dist_loss函数中的y_pred张量对象的形状为[?, 7],使用i进行索引时会抛出以下错误:

Traceback (most recent call last):  File "/home/pc/Documents/user/code/keras_tensorflow/src/try1.py", line 95, in <module>    run('logs\hparam_tuning' + run_name, hparams)  File "/home/pc/Documents/user/code/keras_tensorflow/src/try1.py", line 78, in run    accuracy = train_test_model(run_dir, hparams)  File "/home/pc/Documents/user/code/keras_tensorflow/src/try1.py", line 66, in train_test_model    hp.KerasCallback(logdir, hparams)  File "/home/pc/Documents/user/code/keras_tensorflow/venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training.py", line 734, in fit    use_multiprocessing=use_multiprocessing)  File "/home/pc/Documents/user/code/keras_tensorflow/venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_v2.py", line 324, in fit    total_epochs=epochs)  File "/home/pc/Documents/user/code/keras_tensorflow/venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_v2.py", line 123, in run_one_epoch    batch_outs = execution_function(iterator)  File "/home/pc/Documents/user/code/keras_tensorflow/venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_v2_utils.py", line 86, in execution_function    distributed_function(input_fn))  File "/home/pc/Documents/user/code/keras_tensorflow/venv/lib/python3.6/site-packages/tensorflow_core/python/eager/def_function.py", line 427, in __call__    self._initialize(args, kwds, add_initializers_to=initializer_map)  File "/home/pc/Documents/user/code/keras_tensorflow/venv/lib/python3.6/site-packages/tensorflow_core/python/eager/def_function.py", line 370, in _initialize    *args, **kwds))  File "/home/pc/Documents/user/code/keras_tensorflow/venv/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py", line 1847, in _get_concrete_function_internal_garbage_collected    graph_function, _, _ = self._maybe_define_function(args, kwargs)  File "/home/pc/Documents/user/code/keras_tensorflow/venv/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py", line 2147, in _maybe_define_function    graph_function = self._create_graph_function(args, kwargs)  File "/home/pc/Documents/user/code/keras_tensorflow/venv/lib/python3.6/site-packages/tensorflow_core/python/eager/function.py", line 2038, in _create_graph_function    capture_by_value=self._capture_by_value),  File "/home/pc/Documents/user/code/keras_tensorflow/venv/lib/python3.6/site-packages/tensorflow_core/python/framework/func_graph.py", line 915, in func_graph_from_py_func    func_outputs = python_func(*func_args, **func_kwargs)  File "/home/pc/Documents/user/code/keras_tensorflow/venv/lib/python3.6/site-packages/tensorflow_core/python/eager/def_function.py", line 320, in wrapped_fn    return weak_wrapped_fn().__wrapped__(*args, **kwds)  File "/home/pc/Documents/user/code/keras_tensorflow/venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_v2_utils.py", line 73, in distributed_function    per_replica_function, args=(model, x, y, sample_weights))  File "/home/pc/Documents/user/code/keras_tensorflow/venv/lib/python3.6/site-packages/tensorflow_core/python/distribute/distribute_lib.py", line 760, in experimental_run_v2    return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)  File "/home/pc/Documents/user/code/keras_tensorflow/venv/lib/python3.6/site-packages/tensorflow_core/python/distribute/distribute_lib.py", line 1787, in call_for_each_replica    return self._call_for_each_replica(fn, args, kwargs)  File "/home/pc/Documents/user/code/keras_tensorflow/venv/lib/python3.6/site-packages/tensorflow_core/python/distribute/distribute_lib.py", line 2132, in _call_for_each_replica    return fn(*args, **kwargs)  File "/home/pc/Documents/user/code/keras_tensorflow/venv/lib/python3.6/site-packages/tensorflow_core/python/autograph/impl/api.py", line 292, in wrapper    return func(*args, **kwargs)  File "/home/pc/Documents/user/code/keras_tensorflow/venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_v2_utils.py", line 264, in train_on_batch    output_loss_metrics=model._output_loss_metrics)  File "/home/pc/Documents/user/code/keras_tensorflow/venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_eager.py", line 311, in train_on_batch    output_loss_metrics=output_loss_metrics))  File "/home/pc/Documents/user/code/keras_tensorflow/venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_eager.py", line 252, in _process_single_batch    training=training))  File "/home/pc/Documents/user/code/keras_tensorflow/venv/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_eager.py", line 166, in _model_loss    per_sample_losses = loss_fn.call(targets[i], outs[i])IndexError: list index out of range

在这种情况下,我如何计算最小距离?任何帮助都将不胜感激。此外,如果代码的其他部分有任何错误,请随时指出。我是第一次使用kerastensorflow上进行操作。


回答:

Keras 期望你提供真实标签。由于你定义了自己的损失函数并且没有使用真实标签,你可以传递一些无关紧要的标签。例如:np.arange(16)

修改你的model.fit如下,它应该可以工作:

model.fit(    x_train, np.arange(x_train.shape[0]), epochs=1, batch_size=16,    callbacks=[        tf.keras.callbacks.TensorBoard(logdir),        hp.KerasCallback(logdir, hparams)    ],)

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注