我正在开发一个多类分类问题(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()
不能在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中做什么才能完成此任务?我应该吗? (在一个简单的例子中,就像这里一样,也许最好将一