Python Tensorflow:提取训练模型的特征
我有一个AlexNet的实现。我感兴趣的是在完全连接的分类层之前提取训练模型的特征向量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
权重={
“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={...})
(如果需要,在分类层之前添加。问题在哪里?您需要定义一个符号变量,对应于您感兴趣的加权激活,然后在给定一组输入的情况下对其进行评估。想想你是如何评估其他符号变量的,比如成本
和精度
。