1.动态学习率
global_step=tf.Variable(0,trainable=False) # 动态变化的学习轮数,初始值为0,且过程中不可被训练
learning_rate=tf.compat.v1.train.exponential_decay(0.45,global_step,10,0.96) # 动态学习速率
# 初始值0.45,每10轮调整一次,每次乘以0.96
2.调整优化器
cross_entropy=tf.reduce_mean(-tf.reduce_sum(y_data*tf.compat.v1.log(y),axis=1)) # 交叉熵
optimizer=tf.compat.v1.train.GradientDescentOptimizer(learning_rate) # 构建优化器,学习率是之前构建的
train=optimizer.minimize(cross_entropy,global_step=global_step) # 训练节点,更新学习的轮数
3.输出global_step
之前定义的是计算,需要启动会话sess.run一下,才能获得具体的数值
sess.run(global_step)
4.多层神经元
w0=tf.Variable(tf.zeros([4,6])) # 隐层神经元的权值矩阵
w1=tf.Variable(tf.zeros([6,3])) # 输出层神经元的权值矩阵
b0=tf.Variable(tf.zeros([6])) # 隐层神经元的阈值
b1=tf.Variable(tf.zeros([3])) # 输出层神经元的阈值
5.函数
函数模块不同
H=tf.sigmoid(tf.matmul(x_data,w0)+b0) # 隐层神经元的输出
y=tf.nn.softmax(tf.matmul(H,w1)+b1) # 网络的输出值
整体的代码
from sklearn.datasets import load_iris
import tensorflow as tf
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
tf.compat.v1.disable_eager_execution()
data, label=load_iris(True)
tf.one_hot(label,3) # 将标签转换成0-1编码的形式
with tf.compat.v1.Session() as sess: # 将样本标签转为独热编码的形式
label=sess.run(tf.one_hot(label,3))
global_step=tf.Variable(0,trainable=False) # 动态变化的学习轮数,初始值为0,且过程中不可被训练
learning_rate=tf.compat.v1.train.exponential_decay(0.45,global_step,10,0.96) # 动态学习速率
# 初始值0.45,每100轮调整一次,每次乘以0.96
data_tr,data_te,label_tr,label_te=train_test_split(data,label,test_size=0.2)
# 将数据集拆分成训练集合测试集
'''
搭建神经网络(定义计算)
'''
x_data=tf.compat.v1.placeholder(tf.float32,[None,4]) # 占位符:网络的输入
y_data=tf.compat.v1.placeholder(tf.float32,[None,3]) # 占位符:网络的目标输出
w0=tf.Variable(tf.zeros([4,6])) # 隐层神经元的权值矩阵
w1=tf.Variable(tf.zeros([6,3])) # 输出层神经元的权值矩阵
b0=tf.Variable(tf.zeros([6])) # 隐层神经元的阈值
b1=tf.Variable(tf.zeros([3])) # 输出层神经元的阈值
H=tf.sigmoid(tf.matmul(x_data,w0)+b0) # 隐层神经元的输出
y=tf.nn.softmax(tf.matmul(H,w1)+b1) # 网络的输出值
cross_entropy=tf.reduce_mean(-tf.reduce_sum(y_data*tf.compat.v1.log(y),axis=1)) # 交叉熵
optimizer=tf.compat.v1.train.GradientDescentOptimizer(learning_rate) # 构建优化器
train=optimizer.minimize(cross_entropy,global_step=global_step) # 训练节点
# 轮数是要迭代
acc=tf.reduce_mean(tf.cast(tf.equal(tf.argmax(y_data,1),tf.argmax(y,1)),dtype=tf.float32)) # 精度
sess=tf.compat.v1.Session()
sess.run(tf.compat.v1.global_variables_initializer())
learning=[]
for i in range(1000):
sess.run(train,feed_dict={x_data:data_tr,y_data:label_tr})
acc_tr=sess.run(acc,feed_dict={x_data:data_tr,y_data:label_tr})
print(i,'global_step',sess.run(global_step),acc_tr)
learning.append(sess.run(learning_rate))
acc_te=sess.run(acc,feed_dict={x_data:data_te,y_data:label_te})
print('测试集精度',acc_te)
sess.close()
plt.plot(learning)
plt.show()
最终运行的学习速率的图片,学习速率是随着轮数的增加逐渐减小的
感谢阅读!