我对在我自己的图像集上训练和评估卷积神经网络模型感兴趣。我想使用tf.layers
模块进行模型定义,并使用tf.learn.Estimator
对象分别使用fit()
和evaluate()
方法训练和评估模型。
Here是我一直关注的教程,有助于展示tf.layers
模块和tf.learn.Estimator
类。但是,它使用的数据集(MNIST)只是导入和加载(作为NumPy数组)。请参阅教程脚本中的以下主要功能:
def main(unused_argv):
# Load training and eval data
mnist = learn.datasets.load_dataset("mnist")
train_data = mnist.train.images # Returns np.array
train_labels = np.asarray(mnist.train.labels, dtype=np.int32)
eval_data = mnist.test.images # Returns np.array
eval_labels = np.asarray(mnist.test.labels, dtype=np.int32)
# Create the Estimator
mnist_classifier = learn.Estimator(
model_fn=cnn_model_fn, model_dir="/tmp/mnist_convnet_model")
# Set up logging for predictions
# Log the values in the "Softmax" tensor with label "probabilities"
tensors_to_log = {"probabilities": "softmax_tensor"}
logging_hook = tf.train.LoggingTensorHook(
tensors=tensors_to_log, every_n_iter=50)
# Train the model
mnist_classifier.fit(
x=train_data,
y=train_labels,
batch_size=100,
steps=20000,
monitors=[logging_hook])
# Configure the accuracy metric for evaluation
metrics = {
"accuracy":
learn.MetricSpec(
metric_fn=tf.metrics.accuracy, prediction_key="classes"),
}
# Evaluate the model and print results
eval_results = mnist_classifier.evaluate(
x=eval_data, y=eval_labels, metrics=metrics)
print(eval_results)
完整代码here
我有自己的图片,我在某个目录结构中以jpg
格式存在:
data
train
classA
1.jpg
2.jpg
...
classB
3.jpg
4.jpg
...
...
validate
classA
5.jpg
6.jpg
...
classB
...
...
我还将我的图像目录转换为TFRecord格式,其中一个TFRecord文件用于train
,另一个用于validation
。我遵循了this教程,该教程使用TensorFlow附带的Inception模型中的build_image_data.py脚本作为输出这些TFRecord文件的黑盒子。我承认我可能已经通过创建这些来将马车放在马前,但我想也许有一种方法可以使用这些作为tf.learn.Estimator
的{{1}} fit()
和{{1}的输入方法。
问题
如何格式化evaluate()
(或TFRecord)数据,以便我可以将它们用作jpg
对象函数的输入?
我假设我必须将我的图像和标签转换为NumPy数组,如上面的代码中所示,但是,不清楚Estimator
和mnist.train.images
是如何格式化的。< / p>
有没有人有将mnist.train.validation
文件和标签转换为此jpg
类期望作为输入的NumPy数组的经验?
非常感谢任何帮助。
答案 0 :(得分:2)
您引用的文件cnn_mnist.py
,特别是以下函数mnist_classifier.fit
,需要Numpy数组作为x
和y
的输入。因此,我将解决您的第二和第三个问题,因为TFRecords可能不容易纳入引用的代码。
然而,目前尚不清楚mnist.train.images和mnist.train.validation是如何格式化的
mnist.train.images
是具有形状(55000,784)的Numpy数组,其中55000是图像的数量,784是每个展平图像的尺寸(28 x 28)。 mnist.validation.images
也是一个具有形状(5000,784)的Numpy数组。
有没有人有将jpg文件和标签转换为此Estimator类预期作为输入的NumPy数组的经验?
以下代码将一个JPEG图像读入三维Numpy数组:
from scipy.misc import imread
filename = '1.jpg'
np_1 = imread(filename)
我认为所有这些图像大小相同或者您可以将它们调整为相同大小,考虑到您已经从此数据集生成了TFRecords文件。剩下要做的就是将图像展平,迭代读取其他图像并将它们展平,然后垂直堆叠所有图像。此对象可以输入Estimator
函数。
下面是展平和垂直堆叠两个三维Numpy数组的代码:
import numpy as np
np_1_2 = np.vstack((np_1.flatten(), np_2.flatten()))