TensorFlow/Sklearn 深度神经网络分类器类型错误
TensorFlow/Sklearn Deep Neural Network classifier type error
我正在尝试构建一个以 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:目标的数据类型应为 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=假)。
现在它说它想要一个 float64。所以我很困惑我做错了什么。有什么建议或明显的错误吗?
经过一番挖掘,我找到了解决方案。如果您查看 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 目录中的示例为模型的深度神经网络分类器。示例代码如下:
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:目标的数据类型应为 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=假)。
现在它说它想要一个 float64。所以我很困惑我做错了什么。有什么建议或明显的错误吗?
经过一番挖掘,我找到了解决方案。如果您查看 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 检查签名时看起来不兼容。我的代码现在可以工作了 =。如果您有任何疑问或可以进一步澄清,请随时提出!