Python tensorflow feature_列尝试重塑特征
我正在尝试使用自定义估计器为MNIST数据集实现一个网络。 这是我的输入函数:Python tensorflow feature_列尝试重塑特征,python,tensorflow,mnist,tensorflow-estimator,Python,Tensorflow,Mnist,Tensorflow Estimator,我正在尝试使用自定义估计器为MNIST数据集实现一个网络。 这是我的输入函数: def input_train_fn(): train, test = tf.keras.datasets.mnist.load_data() mnist_x, mnist_y = train mnist_y = tf.cast(mnist_y, tf.int32) mnist_x = tf.cast(mnist_x, tf.int32) features = {'image': mnist_x}
def input_train_fn():
train, test = tf.keras.datasets.mnist.load_data()
mnist_x, mnist_y = train
mnist_y = tf.cast(mnist_y, tf.int32)
mnist_x = tf.cast(mnist_x, tf.int32)
features = {'image': mnist_x}
labels = mnist_y
dataset = tf.data.Dataset.from_tensor_slices((features, labels))
return dataset
feature_columns = [tf.feature_column.numeric_column('image', shape=[28, 28], dtype=tf.int32), ]
classifier = tf.estimator.Estimator(model_fn=my_model,
params={
'feature_columns': feature_columns,
'hidden_units': [10, 10],
'n_classes': 10,
}, model_dir='/model')
classifier.train(input_fn=input_train_fn, steps=10)
以下是我如何定义我的模型:
def my_model(features, labels, mode, params):
# create net
net = tf.feature_column.input_layer(features, params['feature_columns'])
# create hidden layers
for unit in params['hidden_units']:
net = tf.layers.dense(net, unit, tf.nn.relu)
# create output layer
legits = tf.layers.dense(net, params['n_classes'], activation=None)
# predict (if in predict mode)
predicted_classes = tf.arg_max(legits, 1)
if mode == tf.estimator.ModeKeys.PREDICT:
predictions = {
'class_ids': predicted_classes,
'probabilities': tf.nn.softmax(legits),
'logits': legits
}
return tf.estimator.EstimatorSpec(mode, predictions=predictions)
# define loss function
loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=legits)
# evaluation metrics
accuracy = tf.metrics.accuracy(labels=labels,
predictions=predicted_classes,
name='acc_op')
metrics = {'accuracy': accuracy}
tf.summary.scalar('accuracy', accuracy[1])
if mode == tf.estimator.ModeKeys.EVAL:
return tf.estimator.EstimatorSpec(mode, loss=loss, eval_metric_ops=metrics)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step())
return tf.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op)
这就是我对火车功能的称呼:
def input_train_fn():
train, test = tf.keras.datasets.mnist.load_data()
mnist_x, mnist_y = train
mnist_y = tf.cast(mnist_y, tf.int32)
mnist_x = tf.cast(mnist_x, tf.int32)
features = {'image': mnist_x}
labels = mnist_y
dataset = tf.data.Dataset.from_tensor_slices((features, labels))
return dataset
feature_columns = [tf.feature_column.numeric_column('image', shape=[28, 28], dtype=tf.int32), ]
classifier = tf.estimator.Estimator(model_fn=my_model,
params={
'feature_columns': feature_columns,
'hidden_units': [10, 10],
'n_classes': 10,
}, model_dir='/model')
classifier.train(input_fn=input_train_fn, steps=10)
就我所知,我做的一切都是照本宣科,但我得到了错误:
ValueError:无法将包含784个元素的张量整形为[28784]21952个元素的“输入层/图像/整形”op:“整形”具有输入形状:[28,28],且输入张量计算为部分形状:输入=[28784]
我有什么遗漏吗?
感谢您的帮助。首先,您需要批量生产。有关更多详细信息,请参阅 然后重塑你的形象,使其漂浮-1表示批量大小,将在培训期间替换。根据提供的数据类型,将标签强制转换为浮动是可选的
net = tf.cast(tf.reshape(features, [-1, 28*28]), tf.float32)
labels = tf.cast(labels, tf.int64)
net = tf.layers.dense(net, 10, tf.nn.relu)
legits = tf.layers.dense(net, 10, activation=None)
predicted_classes = tf.arg_max(legits, 1)
if mode == tf.estimator.ModeKeys.PREDICT:
predictions = {
'class_ids': predicted_classes,
'probabilities': tf.nn.softmax(legits),
'logits': legits
}
return tf.estimator.EstimatorSpec(mode, predictions=predictions)
loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=legits)
if mode == tf.estimator.ModeKeys.EVAL:
return tf.estimator.EstimatorSpec(mode, loss=loss)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step())
return tf.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op)
classifier = tf.estimator.Estimator(model_fn=my_model)
classifier.train(input_fn=lambda: input_train_fn(), steps=10)
为什么要在dataset api旁边使用功能列?@Sharky tensorflows教程在“我应该不使用功能列吗?”中这样做,而不是在图像中。这里是什么创建了网络?@Sharky我正在定义我的网络层,第一个是输入层,这就是错误发生的地方,我没有把其余的代码放进去,因为它看起来不相关。但它后面是两个密集的层。那么,如何定义没有要素列的输入图层?我看到的每一个例子都有这样的功能。添加解决这个问题的模型代码,尽管我在第一行中也将功能更改为feature['image'],以供将来的读者阅读。非常感谢。