tensorflow 1.0 学习:参数和特征的提取

在tf中,参与训练的参数可用 tf.trainable_variables()提取出来,如:

#取出所有参与训练的参数
params=tf.trainable_variables()
print("Trainable variables:------------------------")

#循环列出参数
for idx, v in enumerate(params):
     print("  param {:3}: {:15}   {}".format(idx, str(v.get_shape()), v.name))

这里只能查看参数的shape和name,并没有具体的值。如果要查看参数具体的值的话,必须先初始化,即:

sess=tf.Session()
sess.run(tf.global_variables_initializer())

同理,我们也可以提取图片经过训练后的值。图片经过卷积后变成了特征,要提取这些特征,必须先把图片feed进去。

具体看实例:

# -*- coding: utf-8 -*-
"""
Created on Sat Jun  3 12:07:59 2017

@author: Administrator
"""

import tensorflow as tf
from skimage import io,transform
import numpy as np

#-----------------构建网络----------------------
#占位符
x=tf.placeholder(tf.float32,shape=[None,100,100,3],name='x')
y_=tf.placeholder(tf.int32,shape=[None,],name='y_')

#第一个卷积层(100——>50)
conv1=tf.layers.conv2d(
      inputs=x,
      filters=32,
      kernel_size=[5, 5],
      padding="same",
      activation=tf.nn.relu,
      kernel_initializer=tf.truncated_normal_initializer(stddev=0.01))
pool1=tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)

#第二个卷积层(50->25)
conv2=tf.layers.conv2d(
      inputs=pool1,
      filters=64,
      kernel_size=[5, 5],
      padding="same",
      activation=tf.nn.relu,
      kernel_initializer=tf.truncated_normal_initializer(stddev=0.01))
pool2=tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)

#第三个卷积层(25->12)
conv3=tf.layers.conv2d(
      inputs=pool2,
      filters=128,
      kernel_size=[3, 3],
      padding="same",
      activation=tf.nn.relu,
      kernel_initializer=tf.truncated_normal_initializer(stddev=0.01))
pool3=tf.layers.max_pooling2d(inputs=conv3, pool_size=[2, 2], strides=2)

#第四个卷积层(12->6)
conv4=tf.layers.conv2d(
      inputs=pool3,
      filters=128,
      kernel_size=[3, 3],
      padding="same",
      activation=tf.nn.relu,
      kernel_initializer=tf.truncated_normal_initializer(stddev=0.01))
pool4=tf.layers.max_pooling2d(inputs=conv4, pool_size=[2, 2], strides=2)

re1 = tf.reshape(pool4, [-1, 6 * 6 * 128])

#全连接层
dense1 = tf.layers.dense(inputs=re1, 
                      units=1024, 
                      activation=tf.nn.relu,
                      kernel_initializer=tf.truncated_normal_initializer(stddev=0.01),
                      kernel_regularizer=tf.nn.l2_loss)
dense2= tf.layers.dense(inputs=dense1, 
                      units=512, 
                      activation=tf.nn.relu,
                      kernel_initializer=tf.truncated_normal_initializer(stddev=0.01),
                      kernel_regularizer=tf.nn.l2_loss)
logits= tf.layers.dense(inputs=dense2, 
                        units=5, 
                        activation=None,
                        kernel_initializer=tf.truncated_normal_initializer(stddev=0.01),
                        kernel_regularizer=tf.nn.l2_loss)

#---------------------------网络结束---------------------------
#%%
#取出所有参与训练的参数
params=tf.trainable_variables()
print("Trainable variables:------------------------")

#循环列出参数
for idx, v in enumerate(params):
     print("  param {:3}: {:15}   {}".format(idx, str(v.get_shape()), v.name))

#%%
#读取图片
img=io.imread('d:/cat.jpg')
#resize成100*100
img=transform.resize(img,(100,100))
#三维变四维(100,100,3)-->(1,100,100,3)
img=img[np.newaxis,:,:,:]
img=np.asarray(img,np.float32)
sess=tf.Session()
sess.run(tf.global_variables_initializer()) 

#提取最后一个全连接层的参数 W和b
W=sess.run(params[26])
b=sess.run(params[27])

#提取第二个全连接层的输出值作为特征    
fea=sess.run(dense2,feed_dict={x:img})

最后一条语句就是提取某层的数据输出作为特征。

注意:这个程序并没有经过训练,因此提取出的参数只是初始化的参数。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LSTM特征提取的源码可以有很多种,具体取决于使用的框架和数据集。以下是使用PythonTensorFlow框架进行LSTM特征提取的示例代码: ```python import tensorflow as tf # 定义LSTM模型 def lstm_model(x, n_hidden, n_classes): # 定义LSTM单元 lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(n_hidden, forget_bias=1.0) # 初始化LSTM状态 initial_state = lstm_cell.zero_state(tf.shape(x)[0], dtype=tf.float32) # 将输入数据转换为LSTM输入格式 x = tf.transpose(x, [1, 0, 2]) x = tf.reshape(x, [-1, n_inputs]) x = tf.split(x, n_steps, 0) # 运行LSTM模型 outputs, states = tf.nn.static_rnn(lstm_cell, x, initial_state=initial_state) # 提取LSTM的最后一个状态作为特征向量 features = states[-1].h # 添加全连接层进行分类 logits = tf.layers.dense(features, n_classes) return logits # 定义模型参数 learning_rate = 0.001 n_epochs = 1000 n_hidden = 128 n_inputs = 28 n_steps = 28 n_classes = 10 # 加载数据集 from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("/tmp/data/", one_hot=True) # 定义输入和输出 x = tf.placeholder(tf.float32, [None, n_steps, n_inputs]) y = tf.placeholder(tf.float32, [None, n_classes]) # 构建模型 logits = lstm_model(x, n_hidden, n_classes) # 定义损失函数和优化器 loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y)) optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(loss) # 定义评估指标 correct_pred = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1)) accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) # 运行模型 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for epoch in range(n_epochs): batch_x, batch_y = mnist.train.next_batch(batch_size) batch_x = batch_x.reshape((batch_size, n_steps, n_inputs)) sess.run(optimizer, feed_dict={x: batch_x, y: batch_y}) if epoch % 100 == 0: acc = sess.run(accuracy, feed_dict={x: batch_x, y: batch_y}) print("Epoch %d, accuracy = %.2f%%" % (epoch, acc * 100)) test_x = mnist.test.images.reshape((-1, n_steps, n_inputs)) test_y = mnist.test.labels acc = sess.run(accuracy, feed_dict={x: test_x, y: test_y}) print("Test accuracy = %.2f%%" % (acc * 100)) ``` 此代码使用LSTM模型对MNIST数据集进行特征提取和分类。LSTM模型的输出是最后一个状态的隐藏状态,即特征向量。该代码使用TensorFlow中的静态RNN函数`tf.nn.static_rnn`来运行LSTM模型。LSTM模型的输出被传递给一个全连接层,以进行分类。在训练过程中,使用Adam优化器进行优化,同时计算损失和准确度。在测试集上进行评估时,将测试数据传递到LSTM模型中,提取特征并进行分类,最后计算准确度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值