我想训练,评估准确性并最终用我的模型进行预测。这是我第一次使用高级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])