TensorFlow实现神经网络

这里,我们将实现一个单层神经网络,并在IRIS数据集上进行模型训练

输入数据:IRIS数据集的前三个特征

输出数据:IRIS数据集的第四个特征即花萼长度

神经网络大小:输入为batch_size*3,隐层为5个神经元,激活函数采用ReLU激活函数,一共需要训练(3*5+5+5+1)=26个变量

代码如下:

第1步:导入库以及相应的数据集,并对数据集按列(特征)进行归一化处理

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

sess = tf.Session()


#数据集
iris = datasets.load_iris()
x_vals = np.array(iris.data[:,0:3])
y_vals = np.array(iris.data[:,3])


def normalize_cols(m):
    col_max = m.max(axis = 0)
    col_min = m.min(axis = 0)
    return (m-col_min)/(col_max-col_min)

x_vals = np.nan_to_num(normalize_cols(x_vals))

第2步:声明数据集和目标值得占位符以及批量训练大小batch_size

#声明批量大小
batch_size = 50

#声明变量与占位符

x_data = tf.placeholder(shape=[None,3],dtype=tf.float32)
y_target = tf.placeholder(shape=[None,1],dtype=tf.float32)

第3步:声明神经网络层变量,这里设置隐藏层神经元个数为5

hidden_layer_nodes = 5 #隐藏层节点个数

a1 = tf.Variable(tf.random_normal(dtype=tf.float32,shape=[3,hidden_layer_nodes]))
b1 = tf.Variable(tf.random_normal(dtype=tf.float32,shape=[hidden_layer_nodes]))
a2 = tf.Variable(tf.random_normal(dtype=tf.float32,shape=[hidden_layer_nodes,1]))
b2 = tf.Variable(tf.random_normal(dtype=tf.float32,shape=[1]))

第4步:连接各层,构建模型

#声明训练模型
hidden_output = tf.nn.relu(tf.add(tf.matmul(x_data,a1),b1))
final_output = tf.nn.relu(tf.add(tf.matmul(hidden_output,a2),b2))

第5步:创建L2损失函数

loss = tf.reduce_mean(tf.square(tf.subtract(final_output,y_target)))

第6步:声明优化器和学习率并初始化模型变量

#初始化变量
init = tf.global_variables_initializer()
sess.run(init)

#声明优化器
opt = tf.train.GradientDescentOptimizer(learning_rate=0.05)
train_step = opt.minimize(loss)

第7步:遍历迭代训练模型,并记录损失值,画出Loss曲线

#迭代训练
Loss = []

for i in range(1000):
    rand_indices = np.random.choice(len(x_vals),size=batch_size)
    rand_x = x_vals[rand_indices]
    rand_y = np.transpose([y_vals[rand_indices]])

    sess.run(train_step,feed_dict={x_data:rand_x,y_target:rand_y})

    temp_Loss = sess.run(loss,feed_dict={x_data:rand_x,y_target:rand_y})
    Loss.append(temp_Loss)




fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(Loss,'k-',label = ' Loss')

handles , labels = ax.get_legend_handles_labels()
ax.legend(handles=handles,labels=labels)
ax.set_xlabel('Generation')
ax.set_ylabel('Loss')
fig.suptitle('Loss per Generation')

plt.show()


单层神经网络实现,实现多层同样可以实现

下面给出一个例子,内含三层隐藏层,神经元个数分别为25、10、3,大家可以自行找一些数据集进行训练,激活函数type=1为sigmoid,type=2为ReLU函数

import xlrd
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
sess = tf.Session()

#数据集

batch_size = 50
features = 13

dataset = xlrd.open_workbook('./aaa.xlsx')
table = dataset.sheets()[0]
nrows = table.nrows
ncols = table.ncols
data_head = table.row_values(0)
data = []
for i in range(1,nrows):
    temp = table.row_values(i)
    data.append([float(x) for x in temp]) #某一行数据
data = np.array(data)
print('数据示例:')
print(data_head)
print(data[1:5,:])
print('数据大小: ',np.shape(data))



x_vals = data[:,0:features]
y_vals = data[:,13]

#归一化
def normalize_cols(m):
    col_max = m.max(axis = 0)
    col_min = m.min(axis = 0)
    return (m-col_min)/(col_max-col_min)

x_vals = normalize_cols(x_vals)

print('x: ',x_vals[200:205,:])
print('y: ',y_vals[200:205])

#初始化权重
def init_weight(shape,st_dev):
    weight = tf.Variable(tf.random_normal(shape=shape,stddev=st_dev))
    return weight

#初始化偏置
def init_bias(shape,st_dev):
    bias = tf.Variable(tf.random_normal(shape=shape,stddev=st_dev))
    return bias

#初始化占位符

x_data = tf.placeholder(shape=[None,features],dtype=tf.float32)
y_target = tf.placeholder(shape=[None,1],dtype=tf.float32)

#全连接

def fully_connected(input_layer,weights,biases,type = 1):
    layer = tf.add(tf.matmul(input_layer,weights),biases)
    if type==1:
        return tf.sigmoid(layer)
    if type==2:
        return tf.nn.relu(layer)

#13*25*10*3*1

#创建第一层隐含层
weight_1 = init_weight([features,25],st_dev=10.0)
bias_1 = init_bias([25],st_dev=10.0)
layer_1 = fully_connected(x_data,weights=weight_1,biases=bias_1)

#创建第二层隐含层
weight_2 = init_weight([25,10],st_dev=10.0)
bias_2 = init_bias([10],st_dev=10.0)
layer_2 = fully_connected(layer_1,weights=weight_2,biases=bias_2)

#创建第三层隐含层
weight_3 = init_weight([10,3],st_dev=10.0)
bias_3 = init_bias([3],st_dev=10.0)
layer_3 = fully_connected(layer_2,weights=weight_3,biases=bias_3,type=1)

#输出层
weight_4 = init_weight([3,1],st_dev=10.0)
bias_4 = init_bias([1],st_dev=10.0)
output = fully_connected(layer_3,weights=weight_4,biases=bias_4,type=2)

#L1损失函数
loss = tf.reduce_mean(tf.abs(y_target-output))

#优化器
opt = tf.train.GradientDescentOptimizer(learning_rate=0.1)
train_step = opt.minimize(loss)

#初始化变量
init = tf.initialize_all_variables()
sess.run(init)

#迭代
Loss = []

for i in range(1000):
    rand_indices = np.random.choice(len(x_vals),size=batch_size)
    rand_x = x_vals[rand_indices]
    rand_y = np.transpose([y_vals[rand_indices]])

    sess.run(train_step,feed_dict={x_data:rand_x,y_target:rand_y})

    temp_Loss = sess.run(loss,feed_dict={x_data:rand_x,y_target:rand_y})
    Loss.append(temp_Loss)




fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(Loss,'k-',label = ' Loss')

handles , labels = ax.get_legend_handles_labels()
ax.legend(handles=handles,labels=labels)
ax.set_xlabel('Generation')
ax.set_ylabel('Loss')
fig.suptitle('Loss per Generation')

fit = []
for xx in range(len(x_vals)):
    temp_x = [x_vals[xx,0:features]]
    [get_data] = sess.run(output,feed_dict={x_data:temp_x})
    fit.append(get_data)

fig2 = plt.figure()
ax2 = fig2.add_subplot(111)
ax2.plot(y_vals,'o',label = ' data')
ax2.plot(fit,'k-',label = ' fit')

handles , labels = ax2.get_legend_handles_labels()
ax2.legend(handles=handles,labels=labels)
ax2.set_xlabel('Generation')
ax2.set_ylabel('Loss')
fig2.suptitle('Loss per Generation')

plt.show()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值