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

Posted

技术标签:

【中文标题】TensorFlow/Sklearn 深度神经网络分类器类型错误【英文标题】:TensorFlow/Sklearn Deep Neural Network classifier type error 【发布时间】:2016-10-12 16:44:54 【问题描述】:

我正在尝试构建一个以 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: Target 的 dtype 应该是 int32、int64 或兼容的。而是得到了 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。所以我很困惑我做错了什么。有什么建议或明显的错误吗?

【问题讨论】:

您的Target 列被解释为float 类型。您可以执行 data[['Target']] = data[['Target']].astype(int) 将它们转换为int 类型。 我已经试过了。如您所见,y_train 是我的目标,我将其转换为 int 类型,但我得到了一个我不理解的不同错误。 【参考方案1】:

经过一番挖掘,我找到了解决方案。如果您查看 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 检查签名时看起来不兼容。我的代码现在可以工作了=。如果您有任何问题或可以进一步澄清这一点,请随时这样做!

【讨论】:

以上是关于TensorFlow/Sklearn 深度神经网络分类器类型错误的主要内容,如果未能解决你的问题,请参考以下文章

Keras快速搭建深度残差收缩网络(及深度残差网络)

深度学习简介

30分钟讲清楚深度神经网络

深度神经网络具体的工作流程是啥样的?

深度神经网络dnn怎么调节参数

对比《动手学深度学习》 PDF代码+《神经网络与深度学习 》PDF