简单粗暴 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编码。
其中每一张图是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个类别的的概率,概率最大的,对应就是预测的结果呗。
-
那么这就是一个输入是784个特征,神经网络中间来几层(佛性的想整几层整几层),这些层就是隐层,全部都是全连接,y=wx+b的形式,最后输出就是10个类别的概率。
-
在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))
跑起来,跑起来啦,数据集小,跑的次数也不多,我这小破电脑很快就成了。
最后瞅瞅模型啥样子, `model.summary` 就可以
评估
数据集没有测试接,拿个验证集来看看效果吧, model.predict
一下,将概率最大的作为输出就好,这个预测的还可以。
如果有测试集,用 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')