我目前正在Tensorflow中开发一个程序,可以读取1750×1750像素的数据。我通过一个复杂的网络
import os
import sys
import tensorflow as tf
import Input
FLAGS = tf.app.flags.FLAGS
tf.app.flags.DEFINE_integer('batch_size', 100, "hello")
tf.app.flags.DEFINE_string('data_dir', '/Volumes/Machine_Learning_Data', "hello")
def inputs():
if not FLAGS.data_dir:
raise ValueError('Please supply a data_dir')
data_dir = os.path.join(FLAGS.data_dir, 'Data')
images, labels = Input.inputs(data_dir = data_dir, batch_size = FLAGS.batch_size)
return images, labels
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial)
def bias_variable(shape):
initial = tf.constant(0.1, shape = shape)
return tf.Variable(initial)
def conv2d(images, W):
return tf.nn.conv2d(images, W, strides = [1, 1, 1, 1], padding = 'SAME')
def max_pool_5x5(images):
return tf.nn.max_pool(images, ksize = [1, 5, 5, 1], strides = [1, 1, 1, 1], padding = 'SAME')
def forward_propagation(images):
with tf.variable_scope('conv1') as scope:
W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])
image_matrix = tf.reshape(images, [-1, 1750, 1750, 1])
h_conv1 = tf.nn.sigmoid(conv2d(image_matrix, W_conv1) + b_conv1)
h_pool1 = max_pool_5x5(h_conv1)
with tf.variable_scope('conv2') as scope:
W_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.sigmoid(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_5x5(h_conv2)
with tf.variable_scope('conv3') as scope:
W_conv3 = weight_variable([5, 5, 64, 128])
b_conv3 = bias_variable([128])
h_conv3 = tf.nn.sigmoid(conv2d(h_pool2, W_conv3) + b_conv3)
h_pool3 = max_pool_5x5(h_conv3)
with tf.variable_scope('local3') as scope:
W_fc1 = weight_variable([10 * 10 * 128, 256])
b_fc1 = bias_variable([256])
h_pool3_flat = tf.reshape(h_pool3, [-1, 10 * 10 * 128])
h_fc1 = tf.nn.sigmoid(tf.matmul(h_pool3_flat, W_fc1) + b_fc1)
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
W_fc2 = weight_variable([256, 4])
b_fc2 = bias_variable([4])
y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
return y_conv
def error(forward_propagation_results, labels):
labels = tf.cast(labels, tf.float32)
mean_squared_error = tf.square(tf.sub(labels, forward_propagation_results))
cost = tf.reduce_mean(mean_squared_error)
train = tf.train.GradientDescentOptimizer(learning_rate = 0.3).minimize(cost)
return train
print cost
不幸的是出现了一个错误
广播的不兼容形状:张量形状([尺寸(100)])和张量形状([尺寸(9187500),尺寸(4)])
但我无法调试这个。在
矩阵维数有什么问题?询问者说错误发生在转铁器行。在
编辑:
这是调用函数的代码的主要部分。在
^{pr2}$
我发现了以下问题:
您的
labels
输入是一个简单的一维标签标识符数组,但它必须是一个热编码的矩阵,其大小为[batch_size, 4]
,填充有1或0。最大池操作需要有与1不同的跨距,才能实际减小图像的宽度和高度。所以设置
strides=[1, 5, 5, 1]
应该可以。在解决了这个问题之后,最大池操作实际上并没有像您假设的那样将宽度/高度从1750降低到10,而是只降低到14(因为
1750 / 5 / 5 / 5 == 14
)。所以你可能想增加你的权重矩阵,但是还有其他的选择。你的图像有可能从3个频道开始吗?这里假设的是灰度,所以您应该重塑
image_matrix
以具有3个通道,或者将图像转换为灰度。应用这些修复后,网络输出和标签都应该是
[batch_size, 4]
的形状,并且您应该能够计算差异。在编辑:我在讨论了下面聊天中的代码后,对其进行了调整。在
一个热标签为其输入添加维度。例如,如果
labels
张量为[batch,1],使用tf.one_hot(batch_labels, depth=2, axis=-1)
返回一个[batch,1,2]维张量。对于labels
张量的size[batch\u size,1]的情况下,以下脚本可以作为消除额外维度的解决方案:tf.one_hot(tf.squeeze(batch_labels,[1]), depth=2, axis=-1)
基本上,
labels
张量的大小必须是[batch\u size,]。这个tf.挤压()功能,消除特定尺寸。参数[1]提示函数消除第二个维度1
。在相关问题 更多 >
编程相关推荐