Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TypeError:类型为'的对象;张量';在Tensorflow中使用自定义度量时没有len()_Python_Tensorflow_Machine Learning_Keras_Scikit Learn - Fatal编程技术网

Python TypeError:类型为'的对象;张量';在Tensorflow中使用自定义度量时没有len()

Python TypeError:类型为'的对象;张量';在Tensorflow中使用自定义度量时没有len(),python,tensorflow,machine-learning,keras,scikit-learn,Python,Tensorflow,Machine Learning,Keras,Scikit Learn,我正在使用Keras和Tensorflow后端开发一个多类分类问题(4类)模型。y_test的值具有2D格式: 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,

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

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="categorical_crossentropy",
              metrics = [my_metric],
              optimizer='adadelta')
运行此代码时,会出现以下错误:

---------------------------------------------------------------------------TypeError回溯(最近的调用 最后)在() 30模型。编译(loss=“categorical\u crossentropy”, 31指标=[my#u指标],#“准确性”, --->32优化器='adadelta')

~/anaconda3/lib/python3.6/site-packages/keras/engine/training.py in 编译(自我、优化器、损失、度量、损失权重、, 样本权重模式、加权度量、目标张量、**kwargs) 449输出度量=嵌套度量[i] 450输出加权度量=嵌套加权度量[i] -->451处理度量(输出度量) 452处理度量(输出加权度量,权重=权重) 453

~/anaconda3/lib/python3.6/site-packages/keras/engine/training.py in 处理度量(度量、权重) 418度量结果=加权度量fn(y_真,y_pred, 419重量=重量, -->420掩码=掩码[i]) 421 422#将self.metrics_名称、self.metric_张量

~/anaconda3/lib/python3.6/site-packages/keras/engine/training\u utils.py 加权中(y_真、y_pred、权重、掩码) 402 """ 403#分数_数组的ndim>=2 -->404分数数组=fn(y_真,y_pred) 405如果掩码不是无: 406#将遮罩投射到floatX,以避免float64向上投射

在my_度量中(目标、预测) 22 val_predict=预测 23 val_targ=tf.math.argmax(targ,轴=1) --->24个返回指标。平衡的准确性得分(val\U targ,val\U predict) 25#返回5 二十六

~/anaconda3/lib/python3.6/site-packages/sklearn/metrics/classification.py 在平衡的精度评分中(y_真、y_pred、样本重量、调整)
1431 1432 """ ->1433 C=混淆矩阵(y_真,y_pred,样本重量=样本重量)1434 np.errstate(divide='ignore',invalid='ignore'):1435
每类=np.图(C)/C.和(轴=1)

~/anaconda3/lib/python3.6/site-packages/sklearn/metrics/classification.py 混淆矩阵(y_真、y_pred、标签、样本重量) 251 252 """ -->253 y_类型,y_真,y_pred=_检查_目标(y_真,y_pred) 254如果y_类型不在(“二进制”、“多类”): 255提升值错误(“%s不受支持”%y\u类型)

~/anaconda3/lib/python3.6/site-packages/sklearn/metrics/classification.py in_check_目标(y_true,y_pred) 69 y_pred:阵列或指示符矩阵 70 """ --->71检查长度是否一致(y_true,y_pred) 72 type_true=_目标的类型(y_true) 73类型_pred=类型_目标(y_pred)

~/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py in 检查长度是否一致(*数组) 229 """ 230 -->231长度=[[如果X不是无,则数组中X的样本数(X)] 232唯一性=np.唯一性(长度) 233如果len(uniques)>1:

~/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py in (.0) 229 """ 230 -->231长度=[[如果X不是无,则数组中X的样本数(X)] 232唯一性=np.唯一性(长度) 233如果len(uniques)>1:

~/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py in _样本数(x) 146返回x.shape[0] 147.其他: -->148返回透镜(x) 149其他: 150回程透镜(x)

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


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

在每一列中定义并获得平衡精度分数。检查精确性和召回率的实施情况。至于
平衡的\u准确性\u分数
,您可以按如下方式实施:

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
尝试:


pip安装——升级tensorflow

指标。平衡的精度评分是从sklearn获得的吗?@Primusa:是的<代码>来自sklearn import metrics
虽然这可能会解决问题,但最好解释升级该软件包解决错误的原因。否则,这就像是一个服务台问“你试过重启你的电脑了吗?”(应该是一个评论),特别是因为长期以来被接受的答案表明这是由其他原因引起的。