Python TypeError:类型为'的对象;张量';在Tensorflow中使用自定义度量时没有len()
我正在使用Keras和Tensorflow后端开发一个多类分类问题(4类)模型。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,
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
虽然这可能会解决问题,但最好解释升级该软件包解决错误的原因。否则,这就像是一个服务台问“你试过重启你的电脑了吗?”(应该是一个评论),特别是因为长期以来被接受的答案表明这是由其他原因引起的。