Изменение числа Tensorflow сверточных и пулирующих слоев с использованием набора данных MNIST
Я использую Windows 10 pro, python 3.6.2rc1, Visual Studio 2017 и Tensorflow. Я работаю с примером Tensorflow в его учебнике по следующей ссылке:
https://www.tensorflow.org/tutorials/layers
Я добавил еще один слой свертки и объединения перед сглаживанием последнего слоя (3-го слоя), чтобы увидеть, изменяется ли точность.
Код, который я добавил, выглядит следующим образом:
## Input Tensor Shape: [batch_size, 7, 7, 64]
## Output Tensor Shape: [batch_size, 7, 7, 64]
conv3 = tf.layers.conv2d(
inputs=pool2,
filters=64,
kernel_size=[3, 3],
padding=1,
activation=tf.nn.relu)
pool3 = tf.layers.max_pooling2d(inputs=conv3, pool_size=[2, 2], strides=1)
pool3_flat = tf.reshape(pool3, [-1, 7* 7 * 64])
Причина, по которой я изменил отступы на 1 и шаг 1, заключается в том, чтобы убедиться, что размер вывода совпадает с размером ввода. Но после добавления этого нового слоя я получаю следующие предупреждения и без показа результата программа заканчивается:
Estimator отделен от интерфейса Scikit Learn, перейдя в отдельный класс SKCompat. Аргументы x, y и batch_size доступны только в классе SKCompat, Estimator будет принимать только input_fn. Пример преобразования: est = Estimator(...) -> est = SKCompat(Estimator(...)) ПРЕДУПРЕЖДЕНИЕ:tenorflow:From E:\Apps\DA2CNNTest\TFHWDetection с дополнительными слоями \TFClassification\TFClassification\TFClassification.py:179: вызов BaseEstimator.fit (из tenorflow.contrib.learn.python.learn.estimators.estimator) с batch_size устарел и будет удален после 2016-12-01. Инструкции по обновлению: Estimator отделен от интерфейса Scikit Learn, перейдя в отдельный класс SKCompat. Аргументы x, y и batch_size доступны только в классе SKCompat, Estimator будет принимать только input_fn. Пример преобразования: est = Estimator(...) -> est = SKCompat(Estimator(...)) Поток MainThread (0x5c8) завершился с кодом 0 (0x0). Программа '[13468] python.exe' вышла с кодом 1 (0x1).
Без добавления этого слоя он работает правильно. Чтобы решить эту проблему, я изменил conv3 и pool3 следующим образом:
conv3 = tf.layers.conv2d(
inputs=pool2,
filters=64,
kernel_size=[5, 5],
padding="same",
activation=tf.nn.relu)
# Input Tensor Shape: [batch_size, 7, 7, 64]
# Output Tensor Shape: [batch_size, 3, 3, 64]
pool3 = tf.layers.max_pooling2d(inputs=conv3, pool_size=[2, 2], strides=2)
pool3_flat = tf.reshape(pool3, [-1, 3* 3 * 64])
но потом я получил другую ошибку в
nist_classifier.fit(
x=train_data,
y=train_labels,
batch_size=100,
steps=20000,
monitors=[logging_hook])
что следующим образом:
tenorflow.python.framework.errors_impl.NotFoundError: Ключ conv2d_2/ смещение не найдено в контрольной точке [[Узел: save/RestoreV2_5 = RestoreV2[dtypes=[DT_FLOAT], _device="/job:localhost/replica:0/task:0/ task: 0 / task: 0 / процессор:0"](_arg_save/Const_0_0, сохранить / восстановить V2_5/ тензор_имений, сохранить / восстановить V2_5/shape_and_slices)]]
Ошибка точно относится к мониторам =[logging_hook].
Весь мой код выглядит следующим образом, и, как вы видите, я прокомментировал предыдущий с padding=1.
Я очень признателен, если вы сможете объяснить мне, в чем заключается моя ошибка и почему это так. Кроме того, я правильно с размером моих входов и выходов в 3-м слое?
Полный код:
"""Convolutional Neural Network Estimator for MNIST, built with tf.layers."""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import numpy as np
import tensorflow as tf
from tensorflow.contrib import learn
from tensorflow.contrib.learn.python.learn.estimators import model_fn as model_fn_lib
tf.logging.set_verbosity(tf.logging.INFO)
def cnn_model_fn(features, labels, mode):
"""Model function for CNN."""
input_layer = tf.reshape(features, [-1, 28, 28, 1])
# Input Tensor Shape: [batch_size, 28, 28, 1]
# Output Tensor Shape: [batch_size, 28, 28, 32]
conv1 = tf.layers.conv2d(
inputs=input_layer,
filters=32,
kernel_size=[5, 5],
padding="same",
activation=tf.nn.relu)
# Input Tensor Shape: [batch_size, 28, 28, 32]
# Output Tensor Shape: [batch_size, 14, 14, 32]
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
# Convolutional Layer #2
# Input Tensor Shape: [batch_size, 14, 14, 32]
# Output Tensor Shape: [batch_size, 14, 14, 64]
conv2 = tf.layers.conv2d(
inputs=pool1,
filters=64,
kernel_size=[5, 5],
padding="same",
activation=tf.nn.relu)
# Pooling Layer #2
# Input Tensor Shape: [batch_size, 14, 14, 64]
# Output Tensor Shape: [batch_size, 7, 7, 64]
pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)
'''Adding a new layer of conv and pool'''
## Input Tensor Shape: [batch_size, 7, 7, 32]
## Output Tensor Shape: [batch_size, 7, 7, 64]
#conv3 = tf.layers.conv2d(
# inputs=pool2,
# filters=64,
# kernel_size=[3, 3],
# padding=1,
# activation=tf.nn.relu)
## Input Tensor Shape: [batch_size, 7, 7, 64]
## Output Tensor Shape: [batch_size, 7, 7, 64]
#pool3 = tf.layers.max_pooling2d(inputs=conv3, pool_size=[2, 2], strides=1)
#pool3_flat = tf.reshape(pool3, [-1, 7* 7 * 64])
# Input Tensor Shape: [batch_size, 7, 7, 64]
# Output Tensor Shape: [batch_size, 7, 7, 64]
conv3 = tf.layers.conv2d(
inputs=pool2,
filters=64,
kernel_size=[5, 5],
padding="same",
activation=tf.nn.relu)
# Input Tensor Shape: [batch_size, 7, 7, 64]
# Output Tensor Shape: [batch_size, 3, 3, 64]
pool3 = tf.layers.max_pooling2d(inputs=conv3, pool_size=[2, 2], strides=2)
'''End of manipulation'''
# Input Tensor Shape: [batch_size, 3, 3, 64]
# Output Tensor Shape: [batch_size, 3 * 3 * 64]
pool3_flat = tf.reshape(pool3, [-1, 3* 3 * 64])
# Input Tensor Shape: [batch_size, 3 * 3 * 64]
# Output Tensor Shape: [batch_size, 1024]
# dense(). Constructs a dense layer. Takes number of neurons and activation function as arguments.
dense = tf.layers.dense(inputs=pool3_flat, units=1024, activation=tf.nn.relu)
# Add dropout operation; 0.6 probability that element will be kept
dropout = tf.layers.dropout(
inputs=dense, rate=0.4, training=mode == learn.ModeKeys.TRAIN)
logits = tf.layers.dense(inputs=dropout, units=10)
loss = None
train_op = None
# Calculate Loss (for both TRAIN and EVAL modes)
if mode != learn.ModeKeys.INFER:
onehot_labels = tf.one_hot(indices=tf.cast(labels, tf.int32), depth=10)
loss = tf.losses.softmax_cross_entropy(
onehot_labels=onehot_labels, logits=logits)
# Configure the Training Op (for TRAIN mode)
if mode == learn.ModeKeys.TRAIN:
train_op = tf.contrib.layers.optimize_loss(
loss=loss,
global_step=tf.contrib.framework.get_global_step(),
learning_rate=0.001,
optimizer="SGD")
# Generate Predictions
# The logits layer of our model returns our predictions as raw values in a [batch_size, 10]-dimensional tensor.
predictions = {
"classes": tf.argmax(
input=logits, axis=1),
"probabilities": tf.nn.softmax(
logits, name="softmax_tensor")
}
# Return a ModelFnOps object
return model_fn_lib.ModelFnOps(
mode=mode, predictions=predictions, loss=loss, train_op=train_op)
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
#change metrics variable name
metricss = {
"accuracy":
learn.MetricSpec(
metric_fn=tf.metrics.accuracy, prediction_key="classes"),
}
#Evaluate the model and print results
#for i in range(100)
eval_results = mnist_classifier.evaluate(
x=eval_data[0:100], y=eval_labels[0:100], metrics=metricss)
print(eval_results)
if __name__ == "__main__":
tf.app.run()
2 ответа
Ошибка выглядит как обученная модель, которая доступна в model_dir
конфликтует с текущими изменениями графика. Оценщик загружает контрольные точки из каталога сохраненной модели и продолжает обучение с предыдущей сохраненной модели. Поэтому, когда вы вносите изменения в модель, вам нужно удалить старую модель и начать обучение заново.
Простым решением этой проблемы будет определение пользовательского каталога контрольных точек для модели следующим образом.
tf.train.generate_checkpoint_state_proto("/tmp/","/tmp/mnist_convnet_model")
Это устраняет проблему с примером MNIST, а также дает вам доступ к местоположению, где вы можете контролировать контрольные точки.