生成数据参见:
生成父母平均身高和孩子身高是否1.8的测试数据
读取数据
import numpy as np
count=700
data=np.loadtxt('./父母身高和孩子身高是否超过1.8cm.csv',delimiter=',')
print(data)
查看目标值是否二分类问题
import collections
# 查看目标值是否只有两个
collections.Counter(data[:,1])
打乱顺序(重要)
因为数据是根据父母身高从小到大排列,越往后面,父母身高越高,如果不打乱顺序,无法准确预测
np.random.shuffle(data)
生成训练数据和测试数据
# 前700条记录是训练集
x=data[:count,0]
y=data[:count,-1]
print(x)
print('-'*50)
print(y)
# 后300条是测试集
x2=data[count:,0]
y2=data[count:,-1]
print(x2)
print('-'*50)
print(y2)
显示训练数据图像 (注意)
import matplotlib.pyplot as plt
plt.scatter(x,y)
从图像可知,父母平均身高在1.77-1.85之间的,孩子即可能是 低于1.8,也可能 高于1.8,也就是说这个区间的数据很容易 不准确
显示训练测试数据图像(注意)
plt.scatter(x2,y2)

从图像可知,父母平均身高在1.77-1.89之间的,孩子即可能是 低于1.8,也可能 高于1.8,也就是说这个区间的数据很容易 不准确
建模
import tensorflow as tf
model=tf.keras.Sequential()
model.add(tf.keras.layers.Dense(8,input_shape=(1,)))
#model.add(tf.keras.layers.Dense(4))
model.add(tf.keras.layers.Dense(1,activation='sigmoid'))
model.summary()
编译和训练
# 获取准确率
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['acc'])
history=model.fit(x,y,epochs=500)
查看history的属性
history.__dict__
将损失函数画成图像
import matplotlib.pyplot as plt
plt.plot(history.epoch,history.history['loss'])
将准确率画成图像
plt.plot(history.epoch,history.history['acc'])
对测试集进行预测
prd=model.predict(x2).flatten()
prd
对预测结果做0,1转换
prd[prd>0.5]=1
prd[prd<0.5]=0
prd
将预测结果和测试集的目标值做对比
error_num=0
for item in range(len(y2)):
result=True
if y2[item]==prd[item]:
result=True
else:
result=False
error_num+=1
print(x2[item],'---',y2[item],'---',prd[item],'---',result)
print(error_num)
对模型优化
从损失函数图像可知,500次以后似乎还能下降,这说明:
当模型只有1个全连接层,有8个神经元时,需要更多的训练次数,或者需要更多的训练数据,才能达到更好的训练结果
1. 对原模型训练1000次
从图中可知,大约训练900次以后,达到极限
2. 使用更多的神经元
使用1个全连接层,16个神经元,训练1000次,如下代码
import tensorflow as tf
model=tf.keras.Sequential()
model.add(tf.keras.layers.Dense(16,input_shape=(1,)))
model.add(tf.keras.layers.Dense(1,activation='sigmoid'))
model.summary()
可知:使用更多的神经元后,损失下降的更快,大约在700次达到极限
3. 使用多个全连接层
使用2个全连接层,24个神经元,训练1000次,如下代码:
model=tf.keras.Sequential()
model.add(tf.keras.layers.Dense(16,input_shape=(1,)))
model.add(tf.keras.layers.Dense(8))
model.add(tf.keras.layers.Dense(1,activation='sigmoid'))
model.summary()
从图中可知,2个全连接层,24个神经元,损失下降的更快,大约训练300次时,就达到极限了
练习
尝试使用更多或更少的全连接层、神经元,测试对训练的影响





