重用相同的图层进行训练和测试,但创建不同的节点

时间:2016-09-13 14:19:54

标签: python tensorflow

我试图(重新)训练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。

如果有人能弄明白我如何使用相同的层进行培训和测试,我将非常感激。

1 个答案:

答案 0 :(得分:0)

使用shape=None作为占位符:placeholder doc

这样您就可以提供任何形状的数据。另一个(更糟)的选择是重新创建用于测试所需形状的图形,并加载训练期间创建的ckpt。