(泰迪云)tensorflow2实战

目录

一、tensorflow2简单运用

二、构建一个线性模型

三、使用高阶API-keras训练神经网络模型

四、minist手写数字识别


一、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)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值