这是main.py:
# pylint: disable=missing-docstring
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import time
from six.moves import xrange # pylint: disable=redefined-builtin
import tensorflow as tf
from pylab import *
import cnn
# Basic model parameters as external flags.
flags = tf.app.flags
FLAGS = flags.FLAGS
flags.DEFINE_float('learning_rate', 0.01, 'Initial learning rate.')
flags.DEFINE_integer('max_steps', 2000, 'Number of steps to run trainer.')
flags.DEFINE_integer('batch_size', 1000, 'Batch size. Must divide evenly into the dataset sizes.')
def placeholder_inputs(batch_size):
images_placeholder = tf.placeholder(tf.float32, shape=(batch_size, cnn.IMAGE_WIDTH, cnn.IMAGE_HEIGHT, 1))
labels_placeholder = tf.placeholder(tf.int32, shape=(batch_size))
return images_placeholder, labels_placeholder
def fill_feed_dict(data_set, images_pl, labels_pl):
data_set = loadtxt("../dataset/images")
images = data_set[:,:115*25]
labels_feed = data_set[:,115*25:]
images_feed = tf.reshape(images, [batch_size, cnn.IMAGE_WIDTH, cnn.IMAGE_HEIGHT, 1])
feed_dict = {
images_pl: images_feed,
labels_pl: labels_feed,
}
return feed_dict
def run_training():
with tf.Graph().as_default():
images_placeholder, labels_placeholder = placeholder_inputs(FLAGS.batch_size)
logits = cnn.inference(images_placeholder)
loss = cnn.loss(logits, labels_placeholder)
train_op = cnn.training(loss, FLAGS.learning_rate)
eval_correct = cnn.evaluation(logits, labels_placeholder)
summary_op = tf.merge_all_summaries()
init = tf.initialize_all_variables()
saver = tf.train.Saver()
sess = tf.Session()
summary_writer = tf.train.SummaryWriter(FLAGS.train_dir, sess.graph)
sess.run(init)
feed_dict = fill_feed_dict(data_sets.train, images_placeholder, labels_placeholder)
# Start the training loop.
for step in xrange(FLAGS.max_steps):
start_time = time.time()
_, loss_value = sess.run([train_op, loss], feed_dict=feed_dict)
duration = time.time() - start_time
# Write the summaries and print an overview fairly often.
if step % 100 == 0:
# Print status to stdout.
print('Step %d: loss = %.2f (%.3f sec)' % (step, loss_value, duration))
# Update the events file.
summary_str = sess.run(summary_op, feed_dict=feed_dict)
summary_writer.add_summary(summary_str, step)
summary_writer.flush()
predictions = sess.run(logits, feed_dict=feed_dict)
savetxt("predictions", predictions)
def main(_):
run_training()
if __name__ == '__main__':
tf.app.run()
然后,cnn.py:
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import math
import tensorflow as tf
NUM_OUTPUT = 4
IMAGE_WIDTH = 115
IMAGE_HEIGHT = 25
IMAGE_PIXELS = IMAGE_WIDTH * IMAGE_HEIGHT
def inference(images):
# Conv 1
with tf.name_scope('conv1'):
kernel = tf.Variable(tf.truncated_normal(stddev = 1.0 / math.sqrt(float(IMAGE_PIXELS)), name='weights', shape=[5, 5, 1, 10]))
conv = tf.nn.conv2d(images, kernel, [1, 1, 1, 1], padding='VALID')
biases = tf.Variable(tf.constant(0.0, name='biases', shape=[10]))
bias = tf.nn.bias_add(conv, biases)
conv1 = tf.nn.relu(bias, name='conv1')
# Pool1
pool1 = tf.nn.max_pool(conv1, ksize=[1, 3, 3, 1], strides=[1, 3, 3, 1], padding='VALID', name='pool1')
# Conv 2
with tf.name_scope('conv2'):
kernel = tf.Variable(tf.truncated_normal(stddev = 1.0 / math.sqrt(float(IMAGE_PIXELS)), name='weights', shape=[5, 5, 10, 20]))
conv = tf.nn.conv2d(images, kernel, [1, 1, 1, 1], padding='VALID')
biases = tf.Variable(tf.constant(0.1, name='biases', shape=[20]))
bias = tf.nn.bias_add(conv, biases)
conv2 = tf.nn.relu(bias, name='conv2')
# Pool2
pool2 = tf.nn.max_pool(conv2, ksize=[1, 3, 3, 1], strides=[1, 3, 3, 1], padding='VALID', name='pool2')
# Identity
with tf.name_scope('identity'):
weights = tf.Variable(tf.truncated_normal([11, NUM_OUTPUT], stddev=1.0 / math.sqrt(float(11))), name='weights')
biases = tf.Variable(tf.zeros([NUM_OUTPUT], name='biases'))
logits = tf.matmul(pool2, weights) + biases
return output
def loss(outputs, labels):
rmse = tf.sqrt(tf.reduce_mean(tf.square(tf.sub(targets, outputs))), name="rmse")
return rmse
def training(loss, learning_rate):
tf.scalar_summary(loss.op.name, loss)
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
global_step = tf.Variable(0, name='global_step', trainable=False)
train_op = optimizer.minimize(loss, global_step=global_step)
return train_op
我收到此错误:
Traceback (most recent call last):
File "main.py", line 84, in <module>
tf.app.run()
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/platform/app.py", line 30, in run
sys.exit(main(sys.argv))
File "main.py", line 81, in main
run_training()
File "main.py", line 47, in run_training
logits = cnn.inference(images_placeholder)
File "/home/andrea/test/python/cnn.py", line 31, in inference
conv = tf.nn.conv2d(images, kernel, [1, 1, 1, 1], padding='VALID')
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_nn_ops.py", line 394, in conv2d
data_format=data_format, name=name)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/op_def_library.py", line 704, in apply_op
op_def=op_def)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2262, in create_op
set_shapes_for_outputs(ret)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1702, in set_shapes_for_outputs
shapes = shape_func(op)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/common_shapes.py", line 230, in conv2d_shape
input_shape[3].assert_is_compatible_with(filter_shape[2])
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/tensor_shape.py", line 108, in assert_is_compatible_with
% (self, other))
ValueError: Dimensions 1 and 10 are not compatible
不明白为什么。尺寸似乎对我来说都很好。输入图像是115个(宽度)x25(高度)x1(颜色)的1000个样本。我正在使用&#39; VALID&#39;作为填充,我双手检查计算。不确定不匹配的来源。有人可以帮忙吗? Ubuntu 14.04上的TensorFlow rc0.9(注意:代码中可能还有其他我不知道的错误,请忘记它们)
答案 0 :(得分:3)
Easy Typo:
在你的第二次卷积中:
conv = tf.nn.conv2d(images, kernel, [1, 1, 1, 1], padding='VALID')
将images
更改为pool1
:
conv = tf.nn.conv2d(pool1, kernel, [1, 1, 1, 1], padding='VALID')