我试图(重新)训练AlexNet(基于代码found here)来解决特定的二进制分类问题。由于我的GPU功能不是很强大,因此我决定批量大小为8用于培训。此大小决定输入张量的形状(8,227,227,3)。但是,可以在测试过程中使用更大的批量大小,因为不涉及backprop。
我的问题是,我如何重用已经训练过的隐藏层,在同一个图上专门为测试创建不同的网络?
这是我尝试做的事情的片段:
NUM_TRAINING_STEPS = 200
BATCH_SIZE = 1
LEARNING_RATE = 1e-1
IMAGE_SIZE = 227
NUM_CHANNELS = 3
NUM_CLASSES = 2
def main():
graph = tf.Graph()
trace = Tracer()
train_data = readImage(filename1)
test_data = readImage(filename2)
train_labels = np.array([[0.0,1.0]])
with graph.as_default():
batch_data = tf.placeholder(tf.float32, shape=(BATCH_SIZE, IMAGE_SIZE, IMAGE_SIZE, NUM_CHANNELS) )
batch_labels = tf.placeholder(tf.float32, shape=(BATCH_SIZE, NUM_CLASSES) )
logits_training = createNetwork(batch_data)
loss = lossLayer(logits_training, batch_labels)
train_prediction = tf.nn.softmax(logits_training)
print 'Prediction shape: ' + str(train_prediction.get_shape())
optimizer = tf.train.GradientDescentOptimizer(learning_rate=LEARNING_RATE).minimize(loss)
test_placeholder = tf.placeholder(tf.float32, shape=(1, IMAGE_SIZE, IMAGE_SIZE, NUM_CHANNELS) )
logits_test = createNetwork(test_placeholder)
test_prediction = tf.nn.softmax(logits_test)
with tf.Session(graph=graph) as session:
tf.initialize_all_variables().run()
for step in range(NUM_TRAINING_STEPS):
print 'Step #: ' + str(step+1)
feed_dict = {batch_data: train_data, batch_labels : train_labels}
_, l, predictions = session.run([optimizer, loss, train_prediction], feed_dict=feed_dict)
feed_dict = {batch_data:test_data, test_placeholder:test_data}
logits1, logits2 = session.run([logits_training,logits_test],feed_dict=feed_dict)
print (logits1 - logits2)
return
我只训练单个图像,只是为了评估网络是否实际被训练以及logits1和logits2的值是否相同。它们不是几个数量级。
createNetwork是一个函数,它根据我链接到的页面上的myalexnet.py脚本的代码加载AlexNet的权重并构建模型。
我试图复制关于深度学习的Udacity课程的例子,特别是作业3和4。
如果有人能弄明白我如何使用相同的层进行培训和测试,我将非常感激。
答案 0 :(得分:0)
使用shape=None
作为占位符:placeholder doc
这样您就可以提供任何形状的数据。另一个(更糟)的选择是重新创建用于测试所需形状的图形,并加载训练期间创建的ckpt。