我想对神经网络预测的值进行判断。如果大于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')
我不知道为什么会出现这个问题。希望得到解决方案
您正在混合 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)
,隐藏了第一个属性的数据类型。
如果我理解正确的话,你只想检查
indicator_probability>0.5
在哪里,那么它就是1
,否则就是0
。然后,你只需要简单的一行:
indicator_output = torch.where(indicator_probability>0.5, 1.0, 0.0)