首页 文章

TensorFlow / Sklearn深度神经网络分类器类型错误

提问于
浏览
2

我正在尝试构建一个以TensorFlow目录中的示例为模型的深度神经网络分类器 . 该示例的代码如下所示:

def main(unused_argv):
  # Load dataset.
  iris = learn.datasets.load_dataset('iris')
  x_train, x_test, y_train, y_test =     cross_validation.train_test_split(
      iris.data, iris.target, test_size=0.2, random_state=42)

  # Build 3 layer DNN with 10, 20, 10 units respectively.
  classifier = learn.DNNClassifier(hidden_units=[10, 20, 10], n_classes=3)

  # Fit and predict.
  classifier.fit(x_train, y_train, steps=200)
  score = metrics.accuracy_score(y_test, classifier.predict(x_test))
  print('Accuracy: {0:f}'.format(score))

我正在做同样的事情,除了我正在使用我的数据,这与虹膜数据(连续特征值和离散0或1目标值)相同 . 我的数据样本如下所示:

G1           G2          G3         G4        Target
7.733347    6.933914    6.493334    5.31336         0
6.555225    6.924448    6.353376    5.568334        1
7.515558    6.326627    6.197123    5.565245        0
7.132243    6.733111    7.107221    5.681575        1

我正在使用以下代码阅读我的数据:

def extract_examples_labels(filepath):
    data = pd.read_csv(filepath).as_matrix()
    num_inputs = len(data[0])-1
    data_examples = data[:,range(num_inputs)]
    data_labels= data[:,len(data[0])-1]
    return data_examples, data_labels

然后,我执行与TensorFlow示例中完全相同的操作,但我使用的是数据 . 但是,我不断收到一条错误消息:

ValueError:目标's dtype should be int32, int64 or compatible. Instead got dtype: ' float64'

所以我认为这意味着因为我的y_train是一个浮点数,我需要将它转换为int所以我这样做使用:

y_train = y_train.astype(int)

我确认它的类型为int64并再次运行分类器但得到以下错误:

ValueError:目标与给定信息不兼容 . 给定目标:Tensor("output:0",shape =(?,),dtype = int64),必需的签名:TensorSignature(dtype = tf.float64,shape = TensorShape([Dimension(None)]),is_sparse = False) .

现在它说它想要一个float64 . 所以我很困惑我做错了什么 . 有什么建议或明显的错误吗?

1 回答

  • 2

    经过一番挖掘后,我找到了解决方案 . 如果查看TensorFlow包中的以下目录:

    tensorflow.contrib.learn.python.learn.datasets
    

    你可以找到一个名为base.py的文件,它有csv文件加载函数 . 基本上,我刚刚修改了名为load_csv的函数来接收我的文件 . 代码如下所示:

    Dataset = collections.namedtuple('Dataset', ['data', 'target'])
    Datasets = collections.namedtuple('Datasets', ['train', 'validation', 'test'])
    
    def load_csv(filename, target_dtype, target_column=-1,    has_header=True):
       """Load dataset from CSV file."""
      with gfile.Open(filename) as csv_file:
        data_file = csv.reader(csv_file)
        if has_header:
           header = next(data_file)
           n_samples = int(header[0])
           n_features = int(header[1])
           data = np.empty((n_samples, n_features))
           target = np.empty((n_samples,), dtype=np.int)
           for i, ir in enumerate(data_file):
                target[i] = np.asarray(ir.pop(target_column), dtype=target_dtype)
                data[i] = np.asarray(ir, dtype=np.float64)
        else:
           data, target = [], []
           for ir in data_file:
           target.append(ir.pop(target_column))
           data.append(ir)
      return Dataset(data=data, target=target)
    

    所以如果你看到上面的代码,我认为我遇到的问题是target_dtype属性 . 即使我更改了目标数组的dtype,我也没有更改target_dtype属性,这使得它在TensorFlow检查签名时看起来不兼容 . 我的代码现在工作= . 如果您有任何疑问或可以进一步澄清,请随时这样做!

相关问题