当前位置: 首页 > 知识库问答 >
问题:

TypeError:在Tensorflow中使用自定义度量时,类型为“Tensor”的对象没有len()

帅博简
2023-03-14

我正在开发一个多类分类问题(4类)的模型使用Keras和Tensorflow后端。y_test的值具有二维格式:

0 1 0 0
0 0 1 0
0 0 1 0
def my_metric(targ, predict):
    val_predict = predict
    val_targ = tf.math.argmax(targ, axis=1)
    return metrics.balanced_accuracy_score(val_targ, val_predict)
hidden_neurons = 50
timestamps = 20
nb_features = 18

model = Sequential()

model.add(LSTM(
                units=hidden_neurons,
                return_sequences=True, 
                input_shape=(timestamps,nb_features),
                dropout=0.15
                #recurrent_dropout=0.2
              )
         )

model.add(TimeDistributed(Dense(units=round(timestamps/2),activation='sigmoid')))

model.add(Dense(units=hidden_neurons,
               activation='sigmoid'))


model.add(Flatten())

model.add(Dense(units=nb_classes,
               activation='softmax'))

model.compile(loss="catehtml" target="_blank">gorical_crossentropy",
              metrics = [my_metric],
              optimizer='adadelta')

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

~/Anaconda3/lib/python3.6/site-packages/keras/engine/training.py in compile(self,optimizer,loss,metrics,loss_weights,sample_weight_mode,weighted_metrics,target_tensors,**kwargs)449 output_metrics=nested_metrics[i]450 output_weighted_metrics=nested_weighted_metrics[i]-->451 handle_metrics(output_metrics)452 handle_metrics(output_weighted_metrics,weights=weights)453

~/Anaconda3/lib/python3.6/site-packages/keras/engine/training.py in handle_metrics(metrics,weights)418 metric_result=weighted_metric_fn(y_true,y_pred,419 weights=weights,-->420 mask=masks[i])421 422#追加到self.metrics_names,self.metric_tensors,

~/Anaconda3/lib/python3.6/site-packages/keras/engine/training_utils.py in weighted(y_true,y_pred,weights,mask)402“”“403#score_array具有ndim>=2-->404 score_array=fn(y_true,y_pred)405如果mask不是none:406#将掩码转换为floatX以避免float64在Theano中向上转换

在my_metric(targ,predict)22 val_predict=predict 23 val_targ=tf.math.argmax(targ,axis=1)--->24返回metric.balanced_accuracy_score(val_targ,val_predict)25#return 5 26

~/Anaconda3/lib/python3.6/site-packages/sklearn/metrics/classification.py in balanced_accuracy_score(y_true,y_pred,sample_weight,adjusted)
1431 1432“”->1433 C=confusion_matrix(y_true,y_pred,sample_weight=sample_weight)1434 with np.errstate(Divide='ignore',invalid='ignore'):1435
per_class=np.diag(C)/C.sum(axis=1)

~/Anaconda3/lib/python3.6/site-packages/sklearn/metrics/classification.py in confusion_matrix(y_true,y_pred,labels,sample_weight)251 252“”-->253 y_type,y_true,y_pred=_check_targets(y_true,y_pred)254如果y_type不在(“binary”,“multiclass”)中:255提高值错误(“%s不受支持”%y_type)

~/Anaconda3/lib/python3.6/site-packages/sklearn/metrics/classification.py in_check_targets(y_true,y_pred)69 y_pred:数组或指示器矩阵70“”--->71 check_consistent_length(y_true,y_pred)72 type_true=type_of_target(y_true)73 type_pred=type_of_target(y_pred)

~/Anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py in check_consistent_length(*arrays)229“”“230-->231 lengths=[_num_samples(X)for X in arrays(如果X不是None)]232 uniques=np.unique(长度)233如果len(uniques)>1:

~/Anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py in(.0)229“”“230-->231 lengths=[_num_samples(X)for X in arrays(如果X不是None)]232 uniques=np.unique(长度)233如果len(uniques)>1:

~/Anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py in_num_samples(x)146返回x.shape[0]147 else:-->148返回len(x)149 else:150返回len(x)

TypeError:类型为“Tensor”的对象没有len()

共有1个答案

欧阳楚
2023-03-14

不能在Keras张量上调用sklearn函数。您需要自己使用Keras的后端函数来实现该功能,如果您使用的是TF后端,则需要使用TensorFlow函数来实现该功能。

balanced_accuracy_score定义为在每列中获得的查全率的平均值。检查此链接以了解精度和召回的实现情况。对于balanced_accuracy_score,您可以按照以下方式实现它:

import keras.backend as K

def balanced_recall(y_true, y_pred):
    """
    Computes the average per-column recall metric
    for a multi-class classification problem
    """ 
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)), axis=0)  
    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)), axis=0)   
    recall = true_positives / (possible_positives + K.epsilon())    
    balanced_recall = K.mean(recall)
    return balanced_recall
 类似资料:
  • 下面是一节课: 这是我计划的一部分: 但是我在“cr12=cr.weave(cr2)”中得到了一个错误: 对于范围内的i(最小(长度,长度(其他)): TypeError:类型为“CoordinaterRow”的对象没有len()

  • 我得到这个错误: TypeError:类型为“Cursor”的对象没有len() 当我试图执行:

  • 如何修复此错误:typeerror:类型为“generator”的对象没有len()

  • 问题内容: 我尝试运行以下代码: 但是我在最后一行出现错误: 似乎我无法分配张量,如何解决? 问题答案: 通常,TensorFlow张量对象不可分配*,因此您不能在分配的左侧使用它。 做您想做的事情的最简单方法是构建张量的Python列表,并在循环结束时将它们在一起: *除对象外,使用etc.方法。但是,可能返回不支持此方法的对象。

  • 这是我的代码。 以下是想要工作的例子。 除了前两个,所有的都能工作。我到哪里去了 “TypeError:类型为'bool/int'的对象没有len” 我该如何解决这个问题?

  • 问题内容: 我必须怎么做才能将自定义类型的对象用作Python字典中的键(我不希望“对象id”用作键),例如 如果名称和位置相同,我想将MyThing用作相同的键。从C#/ Java开始,我习惯于重写并提供一个equals和hashcode方法,并保证不会突变该hashcode依赖的任何内容。 我必须在Python中做什么才能完成此任务?我应该吗? (在一个简单的例子中,就像这里一样,也许最好将一