Я новичок в tensoflow и хочу адаптировать учебник MNIST https://www.tensorflow.org/tutorials/layers с моими данными (изображения 40х40). Это моя модельная функция:
def cnn_model_fn(features, labels, mode):
# Input Layer
input_layer = tf.reshape(features, [-1, 40, 40, 1])
# Convolutional Layer #1
conv1 = tf.layers.conv2d(
inputs=input_layer,
filters=32,
kernel_size=[5, 5],
# To specify that the output tensor should have the same width and height values as the input tensor
# value can be "same" ou "valid"
padding="same",
activation=tf.nn.relu)
# Pooling Layer #1
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
# Convolutional Layer #2 and Pooling Layer #2
conv2 = tf.layers.conv2d(
inputs=pool1,
filters=64,
kernel_size=[5, 5],
padding="same",
activation=tf.nn.relu)
pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)
# Dense Layer
pool2_flat = tf.reshape(pool2, [-1, 10 * 10 * 64])
dense = tf.layers.dense(inputs=pool2_flat, units=1024, activation=tf.nn.relu)
dropout = tf.layers.dropout(
inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN)
# Logits Layer
logits = tf.layers.dense(inputs=dropout, units=2)
predictions = {
# Generate predictions (for PREDICT and EVAL mode)
"classes": tf.argmax(input=logits, axis=1),
# Add `softmax_tensor` to the graph. It is used for PREDICT and by the
# `logging_hook`.
"probabilities": tf.nn.softmax(logits, name="softmax_tensor")
}
if mode == tf.estimator.ModeKeys.PREDICT:
return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)
# Calculate Loss (for both TRAIN and EVAL modes)
loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)
# Configure the Training Op (for TRAIN mode)
if mode == tf.estimator.ModeKeys.TRAIN:
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
train_op = optimizer.minimize(
loss=loss,
global_step=tf.train.get_global_step())
return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)
# Add evaluation metrics (for EVAL mode)
eval_metric_ops = {
"accuracy": tf.metrics.accuracy(
labels=labels, predictions=predictions["classes"])}
return tf.estimator.EstimatorSpec(
mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)
У меня ошибка размера формы между метками и логитами:
InvalidArgumentError (трассировку см. выше): логиты и метки должны иметь одно и то же первое измерение, полученную форму логитов [3,2] и форму меток [1]
filenames_array - это массив из 16 строк
["file1.png", "file2.png", "file3.png", ...]
и labels_array - это массив из 16 целых чисел
[0,0,1,1,0,1,0,0,0,...]
Основная функция:
# Create the Estimator
mnist_classifier = tf.estimator.Estimator(model_fn=cnn_model_fn, model_dir="/tmp/test_convnet_model")
# Train the model
cust_train_input_fn = lambda: train_input_fn_custom(
filenames_array=filenames, labels_array=labels, batch_size=1)
mnist_classifier.train(
input_fn=cust_train_input_fn,
steps=20000,
hooks=[logging_hook])
Я безуспешно пытался переделать логиты:
logits = tf.reshape (logits, [1, 2])
Мне нужна твоя помощь спасибо
ИЗМЕНИТЬ
По прошествии большего количества времени на поиск в первой строке моей модели функции
input_layer = tf.reshape(features, [-1, 40, 40, 1])
«-1», означающее, что размер партии будет вычисляться динамически, имеет здесь значение «3». Та же цифра 3, что и в моей ошибке: логиты и метки должны иметь одно и то же первое измерение, форму логитов [3,2] и форму меток [1]
Если я установлю значение «1», у меня появится новая ошибка:
Входными данными для изменения формы является тензор с 4800 значениями, но запрошенная форма имеет 1600
Может проблема с моими функциями?
РЕДАКТИРОВАТЬ2:
полный код находится здесь: https://gist.github.com/geoffreyp/cc8e97aab1bff4d39e10001118c6322e
РЕДАКТИРОВАТЬ3
Я обновил суть
logits = tf.layers.dense(inputs=dropout, units=1)
https://gist.github.com/geoffreyp/cc8e97aab1bff4d39e10001118c6322e
Но я не совсем понимаю ваш ответ о размере партии, как здесь размер партии может быть 3, тогда как я выбираю размер партии 1?
Если я выберу batch_size = 3, у меня будет такая ошибка: логиты и метки должны иметь одно и то же первое измерение, форму логитов [9,1] и форму меток [3]
Я попытался изменить форму ярлыков:
labels = tf.reshape(labels, [3, 1])
и обновил структуру функций и меток:
filenames_train = [['blackcorner-data/1.png', 'blackcorner-data/2.png', 'blackcorner-data/3.png',
'blackcorner-data/4.png', 'blackcorner-data/n1.png'],
['blackcorner-data/n2.png',
'blackcorner-data/n3.png', 'blackcorner-data/n4.png',
'blackcorner-data/11.png', 'blackcorner-data/21.png'],
['blackcorner-data/31.png',
'blackcorner-data/41.png', 'blackcorner-data/n11.png', 'blackcorner-data/n21.png',
'blackcorner-data/n31.png']
]
labels = [[0, 0, 0, 0, 1], [1, 1, 1, 0, 0], [0, 0, 1, 1, 1]]
но безуспешно ...