【程序喵笔记】TF2.0实现简单的分类任务

简单粗暴 TensorFlow 2.0

​ 上学期整检测任务,神马RCNN,SSD, YOLO之类的,看着网络理论还是津津乐道,可是看着代码我的双眼迷离,一直感觉万恶的TensorFlow,整一个session,再来个placeholder,简直是降低生产力。直到,直到,我遇见了2.0版本的你,啊~~这个感觉,神清气爽酣畅淋漓,么么哒这个强大的API。

没有对比没有伤害,先来个1.x的矩阵乘法:
在这里插入图片描述

# 创建一个变量
w = tf.Variable([[0.5,1.0]])
x = tf.Variable([[2.0],[1.0]]) 
y = tf.matmul(w, x)  


#全局变量初始化
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_op)
    print (y.eval())

​ 再来一个2.0版本的矩阵乘法

w = [[0.5,1.0]]
x = [[2.0],[1.0]]
y = tf.matmul(w, x)
print(y)

​ 惊不惊喜?意不意外?神经网络搭建更是人性化奶妈级的友好啊!

整个分类任务瞅瞅

​ 神经网络四步走,数据、模型、训练、评估,TensorFlow2.0走你~

数据集

​ 来一个mnist数据集的神经网络分类任务~

mnist数据集一个手写的数据集,每张图片是28*28的,对应类别数字0到9,标签就是对应数字,并不是one-hot编码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rWpk6jvr-1585745900028)(.\image\1.mnist数据集.png)]

​ 其中每一张图是28*28的,并且是铺平了的就是784个特征,对应标签是0到9这十个数字

  • 训练集
    • 特征 x_train 维度为 (50000,784), 50000个样本,每个样本784个特征
    • 标签 y_train 维度为 (50000,1), 50000个样本,每个样本对应1个标签
  • 验证集
    • 特征 x_valid 维度为 (10000,784), 10000个样本,每个样本784个特征
    • 标签 y_vaild 维度为 (10000,1), 10000个样本,每个样本对应1个标签

搭建网络模型

  • 这个网络就是实现输入一个手写数字,然后输出一个对10个类别的的概率,概率最大的,对应就是预测的结果呗。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jscRd3aD-1585745900040)(.\image\2.模型.png)]

  • 那么这就是一个输入是784个特征,神经网络中间来几层(佛性的想整几层整几层),这些层就是隐层,全部都是全连接,y=wx+b的形式,最后输出就是10个类别的概率。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vf7XrvSg-1585745900041)(.\image\3.模型.png)]

  • 在TensorFlow2.0中,再也不需要啥placeholder繁琐的操作,只需要API中Keras模块解决就OK。

    API说明网址 :https://tensorflow.google.cn/versions/r2.0/api_docs/python/tf/keras

    • 创建模型。先按照顺序构造网络模型 tf.keras.Sequential(),实例化一个 对象,然后 model.add 一层一层的加入就成了。

      model = tf.keras.Sequential()
      model.add(layers.Dense(32, activation='relu', input_shape=(784,)))
      model.add(layers.Dense(32, activation='relu'))
      model.add(layers.Dense(10, activation='softmax'))
      

      每一层加入需要的层,layer. 下可用的层很多,其中 Dense 就是全连接层,运行操作就是 output = activation(dot(input, kernel) + bias),说白了就是 y=wx+b 。对应神经元的个数,激活函数,初始化自己定义就可,第一层需要加入输入的维度。

    • 网络配置。通过model.compile 指定优化器,损失函数,优化器,度量标准,从API中选择合适的成。

      model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
                   # loss=tf.losses.CategoricalCrossentropy()
                   # 上面交叉熵损失函数要求标签是one hot模式
                   loss=tf.keras.losses.SparseCategoricalCrossentropy(),
                   metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])
      

训练

​ 直接 model.fit 就可以,指定epoches(跑几轮),batch_size(一次跑多少个数据),训练集,验证集。

model.fit(x_train, y_train, epochs=5, batch_size=64,
          validation_data=(x_valid, y_valid))

​ 跑起来,跑起来啦,数据集小,跑的次数也不多,我这小破电脑很快就成了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mr11UjBs-1585745900043)(.\image\4.跑起来.png)]

最后瞅瞅模型啥样子, `model.summary` 就可以

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IyEWWyaG-1585745900044)(.\image\5.summary.png)]

评估

​ 数据集没有测试接,拿个验证集来看看效果吧, model.predict 一下,将概率最大的作为输出就好,这个预测的还可以。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R4dCYVNA-1585745900045)(.\image\6.预测.png)]

​ 如果有测试集,用 model.evaluate 来看看测试集的准确率

test_loss, test_acc = model.evaluate(test_images,  test_labels)
print('\nTest accuracy:', test_acc)

模型保存

保存权重参数和网络模型

model.save('model.h5')

保存模型结构

config = model.to_json()
with open('config.json', 'w') as json:
    json.write(config)
# 载入    
model = keras.models.model_from_json(json_config)

保存模型权重

weights = model.get_weights()
model.save_weights('weights.h5')
# 载入
model.load_weights('weights.h5')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值