类型错误:where() 收到无效的参数组合

问题描述 投票:0回答:2

我想对神经网络预测的值进行判断。如果大于0.5,则为1,如果小于0.5,则为0。当我运行我的模型时,我遇到了这个问题。

Input In [73], in create_model(n_inputs)
     45 a = torch.ones(n_inputs,1)
     46 b = torch.zeros(n_inputs,1)
---> 48 indicator_output = torch.where(indicator_probability>0.5, a, b)

TypeError: where() received an invalid combination of arguments - got (Tensor, Tensor, Tensor), but expected one of:
 * (Tensor condition)
 * (Tensor condition, Tensor input, Tensor other, *, Tensor out)
 * (Tensor condition, Number self, Tensor other)
      didn't match because some of the arguments have invalid types: (Tensor, Tensor, Tensor)
 * (Tensor condition, Tensor input, Number other)
      didn't match because some of the arguments have invalid types: (Tensor, Tensor, Tensor)
 * (Tensor condition, Number self, Number other)
      didn't match because some of the arguments have invalid types: (Tensor, Tensor, Tensor)

我的代码:

import torch
import numpy as np
import pandas as pd

import tensorflow as tf

tf.get_logger().setLevel('ERROR')
import tensorflow.python.keras.backend as k
from tensorflow.python.keras import layers,Model,callbacks,Sequential
from tensorflow.python.keras.callbacks import EarlyStopping
from tensorflow.python.keras.layers import GRU,LSTM,Layer,LayerNormalization,Input,Conv1D,Embedding,Flatten,RepeatVector,GlobalAveragePooling1D,Masking,concatenate,TimeDistributed,Dense,Dropout
from tensorflow.python.keras.layers.core import Lambda
from tensorflow.python.keras import optimizers
from tensorflow.python.keras.optimizers import SGD
from tensorflow.python.keras.optimizers import Adam,rmsprop
from tensorflow.python.keras.losses import categorical_crossentropy
from tensorflow.python.keras.models import load_model
from tensorflow.python.keras.initializers import Constant
tf.compat.v1.disable_eager_execution()
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
print('Tensorflow version: {}'.format(tf.__version__))


def create_model(n_inputs):

  all_inputs = Input(shape=(n_inputs, 2),name = "all_inputs")
    
  dense1 = TimeDistributed(Dense(32, activation='relu'))
  dropout = TimeDistributed(Dropout(0.2))
  dense2 = TimeDistributed(Dense(1, activation='sigmoid'))  

  indicator_probability = dense2(dropout(dense1(outputs)))
  a = torch.ones(n_inputs,1)
  b = torch.zeros(n_inputs,1)

  indicator_output = torch.where(indicator_probability>0.5, a, b)
  
  model = Model(inputs=all_inputs, outputs=indicator_output)

  return model

prediction_model = create_model(n_inputs=11)
prediction_model.compile(optimizer='adam')

我不知道为什么会出现这个问题。希望得到解决方案

python deep-learning classification
2个回答
2
投票

第一个张量是冒名顶替者!

您正在混合 Tensorflow 和 Pytorch。 您使用

tensorflow.python.keras.layers.Dense
创建致密层。在条件中使用时,只有 PyTorch 张量才会转换为 TensorCondition。所以在这里你得到了一个
tensorflow.python.framework.ops.Tensor

  dense2 = TimeDistributed(Dense(1, activation='sigmoid')) 
  indicator_probability = dense2(dropout(dense1(outputs)))
  torch.where(indicator_probability>0.5, a, b) # HERE! Condition a > b

indicator_probability>0.5
dit 没有变成 TensorCondition

where() 期望

(TensorCondition, Tensor, Tensor)
但得到了
(TensorFlow Tensor, PyTroch Tensor, Pytorch Tensor)
,他继续将其显示为
(Tensor, Tensor, Tensor)
,隐藏了第一个属性的数据类型。


0
投票

如果我理解正确的话,你只想检查

indicator_probability>0.5
在哪里,那么它就是
1
,否则就是
0
。然后,你只需要简单的一行:

indicator_output = torch.where(indicator_probability>0.5, 1.0, 0.0)
© www.soinside.com 2019 - 2024. All rights reserved.