tensorflow学习笔记:基本过程

tensorflow学习笔记:基本过程

记录下使用Tensorflow构建模型并实现具体目标的过程,方便回顾,基本步骤主要分为6步:

  1. 载入数据
  2. 数据预处理
  3. 设计网络结构
  4. 定义损失函数
  5. 网络训练与超参数更新
  6. 验证预测与性能评估

1. 载入数据

R m × n 的矩阵形式,m为样本个数,n为属性数。数据是从Matlab里产生的,因此载入的数据是.mat格式,需要用到scipy.io的sio。

import scipy.io import sio

def load_data(filename):
    # 注意更改路径
    x = sio.loadmat('路径' + filename + '.mat')
    return x[filename]

x_train = load_data('training_data')
y_train = load_data('training_label')
x_test = load_data('test_data')
y_test = load_data('test_label')
# x_train是67200*576的数组,x_test是270*576的数组

2. 数据预处理:

有多种预处理方式,常见的为标准化处理、PCA与白化处理等。

标准化处理时要注意,不能将全部数据处理完再分为训练集、验证集和测试集,应该要先分好训练集、验证集和测试集,再在训练集上进行处理,最后用相同的方式(均值和方差)对验证集和测试集进行处理。

这里使用的sklearn中的标准化处理方法。

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.fit_transform(x_test)

3. 设计网络结构

从数据的reshape开始,根据选用方法有不同的结构,分为全连接层,卷积层,池化层,批标准化层等,单独的层叠加组合到一起就能组成各种经典网络。

具体内容见代码块

import tensorflow as tf

def weight_variable(shape):
    '''
    定义卷积核
    '''
    initial = tf.truncated_normal(shape, stddv=0.1)
    return tf.Variable(initial)

def bias_variable(shape):
    '''
    定义偏置
    '''
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)

def conv2d(x, W):
    '''
    卷积层
    strides为每个维数的步长
    padding="SAME"表示最后补齐边缘
    '''
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding="SAME")

def max_pool_2x2(x):
    '''
    池化层
    ksize表示每个池化核的大小
    strides和padding的意思相同
    '''
    return tf.nn.max_pool(x, ksiz=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")

def norm(x):
    '''
    批规范化BN层
    '''
    mean, var = tf.nn.moments(x, axes=0)
    return tf.nn.batch_normalization(x, mean, var, 0, 1, 0.001)

sess = tf.InteractiveSession()

# 准备好每一个batch的数据要占的坑位,注意维数
x = tf.placeholder(tf.float32, [None, 576])
y_ = tf.placeholder(tf.float32, [None, 100])
keep_prob = tf.placeholder(tf.float32)#训练和测试用的dropout率不同,因此也要喂进流中

# 将每一批的样本reshape为[样本数,行数,列数,通道数]的形式
x_image = tf.reshape(x, [-1, 24, 24, 1])

# 构建第一个卷积层
W_conv1 = weight_variable([3, 3, 1, 64])#卷积核大小3*3,输入通道为1,输出通道为64
b_conv1 = bias_variance([64])#偏置为64
h_norm1 = norm(conv2d(x_image, W_conv1) + b_conv1)#卷积之后,激活之前进行规范化
h_conv1 = tf.nn.relu(h_norm1)#非线性激活
h_pool1 = max_pool_2x2(h_conv1)#池化

# 全连接层
W_fc1 = weight_variable([12 * 12 * 64, 256])#一次步长为2的最大池化,行列数减半为12,卷积输出及当前输入通道为64
b_fc1 = bias_variable([256])
h_pool1_flat = tf.reshape(h_pool1, [-112 * 12 * 64])#将卷积输出张开,作为全连接层的输入
h_fc1 = tf.nn.relu(tf.matmul(h_pool1, W_fc1) + b_fc1)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

# softmax回归
W_fc2 = weight_variable(256, 100)
b_fc2 = bial_variable(100)
y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2
y = tf.nn.softmax(y_conv)

4. 定义损失函数

通常而言,对于分类问题,损失函数为交叉熵;对于回归问题,损失函数为均方误差mse。

这里是100类的分类问题,直接调用tf的内置函数。

cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=y_, logits=y_conv))#y_为样本标签,y_conv为预测标签进入softmax函数之前的线性变化量

5. 网络训练与参数更新

tensorflow中的flow最好的体现,数据按批次流入网络,通过梯度下降修改参数。

通过代码更好的理解这部分内容:

扫描二维码关注公众号,回复: 3231942 查看本文章
train_step = tf.train.AdamOptimizer(0.0001).minimize(cross_entropy)
batch_size = 32
sess.run(tf.global_variables_initializer())

for i in range(100):
    X, Y = shuffle(x_train, y_train)#打散样本
    for j in range(x_train.shape[0]/batch_size):
        batch_xs, batch_ys = X[0:batch_size, :], Y[0:batch_size, :]#mini_batch
        sess.run(train_step, feed_dict={x:batch_xs, y_:batch_ys, keep_prob:0.5})#一个batch的数据流入train_step中
        X = np.delete(X, range(batch_size, axis=0))#取下一个batch
        Y = np.delete(Y, range(batch_size, axis=0))

6. 性能评估

不同问题有不同的评估方式,一般分类问题用准确率,而回归问题可以通过mae或者mse判断,评估函数和损失函数基本相同。这里利用分类做定位,相比准确率更关心类别标签对应距离的mape,因此将标签映射到距离后计算mape作为评估指标。

y_out = sess.run(y, feed_dict={x:x_test, keep_prob=1})#用测试样本,同时利用率为1
indx = tf.argmax(y_out)#判断最大值对应的位置
distance = ranging_mapping[sess.run(indx)]#ranging_mapping一维向量,不同位置对应不同距离

mape = 100 * np.mean(np.abs((distance - y_test) / y_test))

猜你喜欢

转载自blog.csdn.net/qq_38290475/article/details/82684418