import matplotlib.pyplot as plt
import numpy as np
import csv
import tensorflow as tf
sess=tf.Session()
birth_weight_file = 'birth.csv'
birth_data = []
with open(birth_weight_file, newline='') as csvfile:
csv_reader = csv.reader(csvfile) # 使用csv.reader读取csvfile中的文件
birth_header = next(csv_reader) # 读取第一行每一列的标题
for row in csv_reader: # 将csv 文件中的数据保存到birth_data中
birth_data.append(row)
birth_data = [[float(x) for x in row] for row in birth_data] # 将数据转换为float格式
# 对于每组数据而言,第8列(序号从0开始)即为标签序列-体重
y_vals = np.array([x[10] for x in birth_data])
# 特征序列
cols_of_interest = ['AGE', 'LWT', 'RACE', 'SMOKE', 'PTL', 'HT', 'UI','PTV']
x_vals = np.array(
[[x[ix] for ix, feature in enumerate(birth_header) if feature in cols_of_interest] for x in birth_data])
# 数组一维使用for x in birth_data遍历整个数组
# enumerate(birth_header)函数返回ix索引和feature特征,用读取的feature和cols_of_interest进行匹配
# 使x[ix]数据存入数组中
# 设置种子使得可以复现
seed=3
tf.set_random_seed(seed)
batch_size=100
# 分割数据集为80-20的训练集和测试集,后使用min-max方法归一化输入特征数据为0到1之间
train_indices=np.random.choice(len(x_vals),round(len(x_vals)*0.8),replace=False)
test_indices=np.array(list(set(range(len(x_vals)))-set(train_indices)))
x_vals_train=x_vals[train_indices]
x_vals_test=x_vals[test_indices]
y_vals_train=y_vals[train_indices]
y_vals_test=y_vals[test_indices]
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_train=np.nan_to_num(normalize_cols(x_vals_train))
x_vals_test=np.nan_to_num(normalize_cols(x_vals_test))
def init_weight(shape,st_dev):
weight=tf.Variable(tf.random_normal(shape,stddev=st_dev))
return(weight)
def init_bias(shape,st_dev):
bias=tf.Variable(tf.random_normal(shape,stddev=st_dev))
return(bias)
# 初始化占位符,这里有8个输入特征和1个输出结果
x_data=tf.placeholder(shape=[None,8],dtype=tf.float32)
y_target=tf.placeholder(shape=[None,1],dtype=tf.float32)
# 全连接层将在三个隐藏层中使用三次,为避免重复,使用层函数来初始化算法模型
def fully_connected(input_layer,weights,biases):
layer=tf.add(tf.matmul(input_layer,weights),biases)
return(tf.nn.relu(layer))
weight_1=init_weight(shape=[8,25],st_dev=10.0)
bias_1=init_bias(shape=[25],st_dev=10.0)
layer_1=fully_connected(x_data,weight_1,bias_1)
weight_2=init_weight(shape=[25,10],st_dev=10.0)
bias_2=init_bias(shape=[10],st_dev=10.0)
layer_2=fully_connected(layer_1,weight_2,bias_2)
weight_3=init_weight(shape=[10,3],st_dev=10.0)
bias_3=init_bias(shape=[3],st_dev=10.0)
layer_3=fully_connected(layer_2,weight_3,bias_3)
weight_4=init_weight(shape=[3,1],st_dev=10.0)
bias_4=init_bias(shape=[1],st_dev=10.0)
final_output=fully_connected(layer_3,weight_4,bias_4)
loss=tf.reduce_mean(tf.abs(y_target - final_output ))
my_opt=tf.train.AdamOptimizer(0.05)
train_step=my_opt.minimize(loss)
init=tf.global_variables_initializer()
sess.run(init)
loss_vec=[]
test_loss=[]
for i in range(200):
rand_index=np.random.choice(len(x_vals_train),size=batch_size)
rand_x=x_vals_train[rand_index]
rand_y=np.transpose([y_vals_train[rand_index]])
# rand_x = x_vals_train[rand_index] # shape=[batch_size,8]
# rand_y = y_vals_train[rand_index].reshape([batch_size, 1])
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_vec.append(temp_loss)
test_temp_loss=sess.run(loss,feed_dict={x_data:x_vals_test,y_target:np.transpose([y_vals_test])})
test_loss.append(test_temp_loss)
if(i+1)%25==0:
print("Generation : "+str(i+1) +' Loss = '+str(temp_loss))
07-29
07-29
07-29