Python - 功能应该是具有高级tf API的“张量”字典



我想训练,评估准确性并最终用我的模型进行预测。这是我第一次使用高级API,如tf.estimator。

我收到来自estimator.train(train_input_fn)的值错误:

'ValueError:特征应该是'Tensor'的字典。给定类型: '

我不确定这里发生了什么。我的模型采用 3 个输入并从一个神经元产生二进制输出。

在此错误之前,我收到有关请求的形状不等于实际形状或类似内容的错误。我通过将 batchSize 减少到 1 而不是 100 来修复它。我敢肯定,在训练方面,这不会做得那么好。

有什么想法吗?这是我的代码:

import tensorflow as tf
import numpy as np
import sys
sys.path.insert(0, '/Users/blairburns/Documents/DeepLearning/BackgroundColourPredictor/Dataset/Testing/')
sys.path.insert(0, '/Users/blairburns/Documents/DeepLearning/BackgroundColourPredictor/Dataset/Training/')
#other files
from TestDataNormaliser import *
from TrainDataNormaliser import *
learning_rate = 0.01
trainingIteration = 15
batchSize = 1
displayStep = 2
#Layers using tf.layers
def get_logits(features):
    l1 = tf.layers.dense(features, 3, activation=tf.nn.relu)
    l2 = tf.layers.dense(l1, 4, activation=tf.nn.relu)
    l3 = tf.layers.dense(l2, 1, activation=None)
    a = l3
    return a

#cost function
def get_loss(a, labels):
    #cross_entropy = tf.reduce_mean(-tf.reduce_sum(y * tf.log(a)))
    return tf.nn.sigmoid_cross_entropy_with_logits(logits=a, labels=labels)
    #cross_entropy = tf.reduce_mean((l3 - y)**2)
    #cross_entropy = -tf.reduce_sum(y*tf.log(a))-tf.reduce_sum((1-y)*tf.log(1-a))

#optimizer
def get_train_op(loss):
    learning_rate = 1e-3
    optimizer = tf.train.RMSPropOptimizer(learning_rate)
    return optimizer.minimize(loss, global_step=tf.train.get_global_step())

#training
####
def get_inputs(feature_data, label_data, batch_size, n_epochs=None, shuffle=True):
    dataset = tf.data.Dataset.from_tensor_slices(
        (feature_data, label_data))
    dataset = dataset.repeat(n_epochs)
    if shuffle:
        dataset = dataset.shuffle(len(feature_data))
    dataset = dataset.batch(batch_size)
    features, labels = dataset.make_one_shot_iterator().get_next()
    return features, labels
def model_fn(features, labels, mode):
    a = get_logits(features)
    loss = get_loss(a, labels)
    train_op = get_train_op(loss)
    predictions = tf.greater(a, 0)
    accuracy = tf.metrics.accuracy(labels, predictions)
    return tf.estimator.EstimatorSpec(
    mode=mode,
    loss=loss,
    train_op=train_op,
    eval_metric_ops={'Accuracy': accuracy},
    predictions=predictions
    )
def train_input_fn():
    return get_inputs(
    trainArrayValues,
    trainArrayLabels,
    batchSize
    )
def eval_input_fn():
    return get_inputs(
    testArrayValues,
    testArrayLabels,
    batchSize,
    n_epochs=1,
    shuffle=False
    )
model_dir = './savedModel'
estimator = tf.estimator.LinearRegressor(feature_columns=[model_fn, model_dir])
#estimator.train(train_input_fn, max_steps=1)
estimator.train(train_input_fn)
estimator.evaluate(eval_input_fn)

你的问题是这一行:

estimator = tf.estimator.LinearRegressor(feature_columns=[model_fn, model_dir])

您需要将 feature_columns 参数设置为功能列数组。特征列告诉估算器您正在提供给它的数据。

看起来您的所有输入数据都是数字,因此我会调用tf.feature_column.numeric_column来创建您的功能列。文档在这里。例如,以下代码创建一个包含 x 坐标的数字特征列:

xcol = tf.feature_column.numeric_column('x')

如果您只需要 x 坐标,则可以使用以下代码创建估算器:

estimator = tf.estimator.LinearRegressor(feature_columns=[xcol])

最新更新