我一直在努力使用估算器类在tensorflow中创建一个简单的分类器。 (学习张量流以利用一些高级功能,而不是使用Keras,这确实使这个问题变得简单,有时学习很难。我离题了。)
我在这里找到了MNIST数据的原始教程: https://github.com/aymericdamien/TensorFlow-Examples/blob/master/notebooks/3_NeuralNetworks/neural_network.ipynb
我为自己的数据写了一个新的输入函数(
Xtrain.shape =(595212,57)
target.shape =(595212):
import pandas as pd
train=pd.read_csv("../input/train.csv")
test=pd.read_csv("../input/train.csv")
target=train['target']
Xtrain=train.drop(['id','target'],axis=1)
# Define the input function for training
input_fn = tf.estimator.inputs.numpy_input_fn(
x={'data': Xtrain.as_matrix()}, y=target,
batch_size=batch_size, num_epochs=1, shuffle=True)
我终于得到了一个二进制分类器,用于我自己的数据工作。但是我不得不修改神经网络(我是通过反复试验来做到的,没有太多的理解和解释来破译错误代码)。
我不得不对下一个标签的输出进行重新整形。但我不知道为什么我需要这样做。我在整个晚上以张力维度挣扎,我真的很茫然(没有双关语),为什么需要这些修改。我认为它与底层数据流有关,但我似乎无法理解出错的原因或为什么需要这样做。
原始代码在' ####'描述的部分中注释掉了。 显然,对于二进制分类,我删除了softmax并切换到当前的损失。
我的模型定义为:
# Define the model function (following TF Estimator Template)
def model_fn(features, labels, mode):
# Build the neural network
logits = neural_net(features)
# Predictions
pred_classes = tf.argmax(logits, axis=1)
pred_probas = tf.nn.sigmoid(logits)
# If prediction mode, early return
if mode == tf.estimator.ModeKeys.PREDICT:
return tf.estimator.EstimatorSpec(mode, predictions=pred_probas)
# Define loss and optimizer
#############################################################
#loss_op = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(
# logits=logits, labels=tf.cast(labels, dtype=tf.int32)))
loss_op = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(
logits=tf.reshape(logits,[-1]), labels=tf.cast(labels, dtype=tf.float64)))
###########################################################
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)
train_op = optimizer.minimize(loss_op, global_step=tf.train.get_global_step())
# TF Estimators requires to return a EstimatorSpec, that specify
# the different ops for training, evaluating, ...
estim_specs = tf.estimator.EstimatorSpec(
mode=mode,
predictions=pred_probas,
loss=loss_op,
train_op=train_op)
return estim_specs