目录
一、tensorflow2简单运用
#%%tensorflow2简单运用
import tensorflow as tf
#tf.__version__
a = tf.constant([1.0,2])
b = tf.constant([3.0,4])
#确保a和b都是浮点型数据
result = a+b
#print(type(result.numpy()))
#print(result)
#print(tf.reduce_mean(a)) #打印a的均值
#print(tf.reduce_mean(tf.square(a-b))) #均方误差
#均方误差S={[(x1-x)^2+(x2-x)^2+......(xn-x)^2]/N}^0.5(x为平均数,N为样本个数)
va = tf.Variable(2.0)
print(va)
va.numpy()
二、构建一个线性模型
#%%构建一个线性模型
#初始化模型
import tensorflow as tf
import pandas as pd
import matplotlib.pyplot as plt
#数据读取
learning_rate = 0.5 #学习速率的设置
data = pd.read_csv(r"D:\上课文件\python\泰迪杯\tensorflow2实战PPT&数据&代码\tensorflow2实战PPT&数据&代码\数据&代码\line_fit_data.csv").values
x = data[:,0]
target_y = data[:,1]
#构建一个线性模型 y=wx+b
w = tf.Variable(-1.0) #初始化一个参数,并且这个参数是在不断变化的
b = tf.Variable(-1.0) #前后的数据的类型都是一致的,都是浮点型
def model(x,w,b):
return w*x+b #这里返回的是tensor数据类型
'''
#先画一个图看一下没有修正时的差距的大小
plt.figure(figsize=(10,5)) #画布的大小
plt.axis([-0.01,1,-3,10])
plt.scatter(x,target_y)
plt.plot(x,
model(x, w, b).numpy(), #原来是tensor数据类型,需要转为numpy型
color='red')
plt.legend(['predicted_y','target_y'])
'''
#构建损失函数:利用均方误差
def loss(predicted_y,target_y):
return tf.reduce_mean(tf.square(predicted_y-target_y))
#最小化方差(训练)
#用于可视化效果
plt.figure(figsize=(10,5)) #画布的大小
plt.axis([-0.01,1,-3,10])
plt.scatter(x,target_y)
for i in range(100): #训练100次
plt.plot(x,model(x,w,b).numpy(),color='red',alpha=0.3) #alpha表示透明度
plt.pause(0.2) #间隔0.2s做一次动态的更新
print('第 ', i ,'轮训练的损失值:',loss(model(x, w, b),target_y).numpy(),'w=',w.numpy(),'b=',b.numpy())
with tf.GradientTape() as t:#梯度带的含义
dw,db = t.gradient(loss(model(x,w,b),target_y),[w,b]) #w,b表示变量
#这一步在求导,前面那个是函数,后面两个是变量
w.assign_sub(learning_rate*dw) #更新模型的参数
b.assign_sub(learning_rate*db)
#可视化一下最终结果
plt.figure(figsize=(10,5)) #画布的大小
plt.axis([-0.01,1,-3,10])
plt.scatter(x,target_y)
plt.plot(x,
model(x, w, b).numpy(), #原来是tensor数据类型,需要转为numpy型
color='red')
plt.legend(['predicted_y','target_y'])
三、使用高阶API-keras训练神经网络模型
#%% 使用高阶API-keras训练神经网络模型
import tensorflow as tf
import pandas as pd
import matplotlib.pyplot as plt
#数据读取
learning_rate = 0.5 #学习速率的设置
data = pd.read_csv(r"D:\上课文件\python\泰迪杯\tensorflow2实战PPT&数据&代码\tensorflow2实战PPT&数据&代码\数据&代码\line_fit_data.csv").values
x = data[:,0]
target_y = data[:,1]
#搭建模型(网络)
model_net = tf.keras.models.Sequential() #实例化一个网络序列
model_net.add(tf.keras.layers.Dense(1,input_shape=(1, ))) #添加一层全连接神经网络(Dense),还有CNN,LSN等
#第一个1表示输出层,第二个表示输入层
#模型编译
model_net.compile(loss='mse',optimizer=tf.keras.optimizers.SGD(learning_rate=0.5))
#模型训练
model_net.fit(x,target_y,verbose=2,epochs=20,validation_split=0.2)
# verbose:有0,1,2三种取值;epochs:训练的轮数; validation_split:测试集比例
四、minist手写数字识别
照片是28×28的二维数据,需要作拉伸操作(flaten),转化为一维数组;经过实践,当隐藏层为128层时,训练效果较好,输出层有十个,是因为照片的类别有十个,用十个神经元去表达一个类别。
y'表示的实际值,y表示的是预测值。
#%% mnist 手写数字识别
import numpy as np
import tensorflow as tf
#读取数据
data = np.load(r'D:\上课文件\python\泰迪杯\tensorflow2实战PPT&数据&代码\tensorflow2实战PPT&数据&代码\数据&代码\mnist.npz')
#这是一个二进制文件,所以无法直接看
#print(data.files)
train_images, train_labels, test_images, test_labels = data['x_train'],data['y_train'],data['x_test'],data['y_test']
#这是一个灰度图片
#交叉熵
'''
target_y = np.array([1,0,0,0,0,0,0,0,0,0]) #表示的是真实值
predicted_y1 = np.array([0.4,0.5,0.1,0,0,0,0,0,0,0]) #表示的是预测值
predicted_y2 = np.array([0.1,0.2,0.7,0,0,0,0,0,0,0]) #表示的是预测值
#打印交叉熵的值
print(-np.sum(target_y*np.log(predicted_y1+0.00000001)))
print(-np.sum(target_y*np.log(predicted_y2+0.00000001)))
'''
#模型构建与训练
#搭建网络结构
model = tf.keras.models.Sequential() #model的序列化,是一个实例化的操作
#第一步是输入层,是一个拉伸的操作
model.add(tf.keras.layers.Flatten(input_shape=(28,28))) #一个图片的形式
#接下来添加一个隐藏层(全连接层)
model.add(tf.keras.layers.Dense(128,activation='relu'))
#最后添加一个输出层
model.add(tf.keras.layers.Dense(10,activation='softmax'))
#编译模型
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
#优化器:adam; 损失函数:交叉熵; 评价指标:准确度
#模型的训练
model.fit(train_images,train_labels,verbose=1,epochs=5,batch_size=1,validation_data=(test_images,test_labels))
#模型的保存
model.save('model_mnist.h5') #保存为后缀为.h5 的文件
#%% 调用保存好模型进行预测
import tensorflow as tf
import matplotlib.pyplot as plt
image = plt.imread(r'D:\上课文件\python\泰迪杯\tensorflow2实战PPT&数据&代码\tensorflow2实战PPT&数据&代码\数据&代码\testimages\0.jpg')
image_new = image.reshape([1,28,28]) #与原模型的输入格式要相同
model = tf.keras.models.load_model(r'C:\Users\HuXiang\model_mnist.h5')
#print(model.summary()) #查看模型的结构信息
'''
print(model.predict(image_new)[0].argmax())
#输出的是一个二维数组,[0]取其中的一维数组,argmax()表示取位置
'''
#使用一个循环来完成所有照片的预测
for i in range(30):
#使用循环读取30张照片
image = plt.imread('D:/上课文件/python/泰迪杯/tensorflow2实战PPT&数据&代码/tensorflow2实战PPT&数据&代码/数据&代码/testimages/'+str(i)+'.jpg')
image_new = image.reshape([1,28,28]) #与原模型的输入格式要相同
result = model.predict(image_new)[0].argmax()
print('第',i,'张照片的数字是:',result)