Python Tensorflow:提取训练模型的特征

Python Tensorflow:提取训练模型的特征,python,machine-learning,computer-vision,tensorflow,Python,Machine Learning,Computer Vision,Tensorflow,我有一个AlexNet的实现。我感兴趣的是在完全连接的分类层之前提取训练模型的特征向量 我想首先训练模型(下面我包括了训练和测试的评估方法) 在分类之前,如何获取训练/测试集中所有图像的最终输出特征向量列表(在前向传递期间) 以下是代码(提供完整版本): 权重={ “wc1”:tf.Variable(tf.random_normal([3,3,1,64]), “wc2”:tf.Variable(tf.random_normal([3,3,64,128]), “wc3”:tf.Variable(t

我有一个AlexNet的实现。我感兴趣的是在完全连接的分类层之前提取训练模型的特征向量

  • 我想首先训练模型(下面我包括了训练和测试的评估方法)

  • 在分类之前,如何获取训练/测试集中所有图像的最终输出特征向量列表(在前向传递期间)

  • 以下是代码(提供完整版本):

    权重={
    “wc1”:tf.Variable(tf.random_normal([3,3,1,64]),
    “wc2”:tf.Variable(tf.random_normal([3,3,64,128]),
    “wc3”:tf.Variable(tf.random_normal([3,3,128,256]),
    'wd1':tf.变量(tf.random_normal([4*4*256,1024]),和,
    'wd2':tf.Variable(tf.random_normal([10241024,1024]),
    'out':tf.Variable(tf.random_normal([1024,10]))
    }
    偏差={
    “bc1”:tf.Variable(tf.random_normal([64]),
    “bc2”:tf.Variable(tf.random_normal([128]),
    “bc3”:tf.Variable(tf.random_normal([256]),
    'bd1':tf.Variable(tf.random_normal([1024]),
    'bd2':tf.Variable(tf.random_normal([1024]),
    'out':tf.Variable(tf.random\u normal([n\u类]))
    }
    def alex_净值(_X,_权重,_偏差,_辍学):
    #重塑输入图片
    _X=tf.重塑(X,shape=[-1,28,28,1])
    #卷积层
    conv1=conv2d('conv1','X','u权重['wc1'],'u偏差['bc1'])
    #最大池(下采样)
    池1=最大池('pool1',conv1,k=2)
    #应用规范化
    norm1=norm('norm1',pool1,lsize=4)
    #申请退学
    norm1=tf.nn.辍学(norm1,_辍学)
    #卷积层
    conv2=conv2d('conv2',norm1,_权重['wc2'],_偏差['bc2'])
    ...
    #在输送完全连接的分类层之前
    #我对权重之后的向量感兴趣
    #在经过训练的模型向前传球时应用。
    dense1=tf.restrape(norm3,[-1,_-weights['wd1'].获取_-shape().作为_-list()[0]]))
    #Relu激活
    dense1=tf.nn.relu(tf.matmul(dense1,权重['wd1'])++偏差['bd1'],name='fc1')
    #Relu激活
    dense2=tf.nn.relu(tf.matmul(dense1,权重['wd2'])++偏差['bd2'],name='fc2')
    #输出,类预测
    out=tf.matmul(密度2,_权重['out'])+_偏差['out']
    返回
    pred=alex_净值(x、权重、偏差、保持概率)
    成本=tf.reduce\u均值(tf.nn.softmax\u交叉\u熵\u与逻辑(pred,y))
    优化器=tf.train.AdamOptimizer(学习率=学习率)。最小化(成本)
    #评价模型
    正确的pred=tf.equal(tf.argmax(pred,1),tf.argmax(y,1))
    准确度=tf.reduce_平均值(tf.cast(correct_pred,tf.float32))
    #启动图表
    使用tf.Session()作为sess:
    sess.run(初始化)
    步骤=1
    #继续训练直到达到最大迭代次数
    summary_writer=tf.train.summary writer('/tmp/tensorflow_logs',graph_def=sess.graph_def)
    步骤*批量大小<培训内容:
    批次X,批次Y=mnist.train.next批次(批次大小)
    #使用批处理数据进行拟合训练
    run(优化器,feed_dict={x:batch_xs,y:batch_ys,keep_prob:dropout})
    如果步骤%display\u步骤==0:
    #计算批次精度
    acc=sess.run(准确度,进给量={x:batch\xs,y:batch\ys,keep\u prob:1.})
    #计算批量损失
    loss=sess.run(成本,feed_dict={x:batch_xs,y:batch_ys,keep_prob:1.})
    打印“Iter”+str(步长*批量大小)+”,小批量损耗=”\
    +“{.6f}”。格式(丢失)+”,训练精度=“+”{.5f}。格式(acc)
    步骤+=1
    打印“优化完成!”
    #计算256 mnist测试图像的精度
    打印“Testing accurity:”,sess.run(accurity,feed_dict={x:mnist.test.images[:256],
    y:mnist.test.labels[:256],
    保持(问题1)
    
    听起来您想从alex_net()获得dense2的值?如果是这样,除了out之外,还需要从alex_net()返回它,所以

    return out
    
    变成

    return dense2, out
    
    before_classification_layer, pred = alex_net(...)
    

    变成

    return dense2, out
    
    before_classification_layer, pred = alex_net(...)
    
    然后,当调用
    sess.run()。请参阅中的
    tf.Session.run
    。请注意,回迁可能是一个列表,因此为了避免在示例代码中对图形进行两次计算,您可以这样做

    # Calculate batch accuracy and loss
    acc, loss = sess.run([accuracy, cost], feed_dict={...})
    
    而不是

    # Calculate batch accuracy
    acc = sess.run(accuracy, feed_dict={...})
    # Calculate batch loss
    loss = sess.run(cost, feed_dict={...})
    

    (如果需要,在分类层之前添加

    问题在哪里?您需要定义一个符号变量,对应于您感兴趣的加权激活,然后在给定一组输入的情况下对其进行评估。想想你是如何评估其他符号变量的,比如
    成本
    精度