开篇

作为用tensorflow1.4一值没更新的人来讲,本来决定换pytorch,但是看了下tensorflow2的一些简单操作后,决定再次投入到tensorflow的怀抱。

基础操作

首先看一些基础操作

import tensorflow as tf
import numpy as np
tf.__version__
#'2.2.0'

x = [[1.]]
m = tf.matmul(x, x)
print(m)
tf.Tensor([[1.]], shape=(1, 1), dtype=float32)

竟然可以直接打印,之前debug提起session就崩溃,看到现在这么轻易的print简直不敢相信

x = tf.constant([[1,9],[3,6]])
x
#<tf.Tensor: shape=(2, 2), dtype=int32, numpy=
#array([[1, 9],
#       [3, 6]], dtype=int32)>

x = tf.add(x, 1)
x
#<tf.Tensor: shape=(2, 2), dtype=int32, numpy=
#array([[ 2, 10],
#       [ 4,  7]], dtype=int32)>

简直欣喜若狂

在看跟numpy的无缝隙转换

x.numpy()
#array([[ 2, 10],
#       [ 4,  7]], dtype=int32)

实例demo

回归

用一个简单的数据集演练回归

features = pd.read_csv('temps.csv')
#看看数据长什么样子
features.head()

tensorflow入门教程 下载 tensorflow 2.0 教程_tensorflow

字段解释:

  • year,moth,day,week分别表示的具体的时间
  • temp_2:前天的最高温度值
  • temp_1:昨天的最高温度值
  • average:在历史中,每年这一天的平均最高温度值
  • actual:这就是我们的标签值了,当天的真实最高温度
  • friend:这一列可能是凑热闹的,你的朋友猜测的可能值,咱们不管它就好了

数据需要做一些简单的处理

  • 对于星期独热编码
  • 建立好X和labels
  • 标准化
基于Keras构建网络模型

一些常用参数已经列出,如下所示:

  • activation:激活函数的选择,一般常用relu
  • kernel_initializer,bias_initializer:权重与偏置参数的初始化方法,有时候不收敛换种初始化就突然好使了。。。玄学
  • kernel_regularizer,bias_regularizer:要不要加入正则化,
  • inputs:输入,可以自己指定,也可以让网络自动选
  • units:神经元个数

按顺序构造网络模型

model = tf.keras.Sequential()
model.add(layers.Dense(16))
model.add(layers.Dense(32))
model.add(layers.Dense(1))
#compile相当于对网络进行配置,指定好优化器和损失函数等
model.compile(optimizer=tf.keras.optimizers.SGD(0.001),
             loss='mean_squared_error')
model.fit(input_features, labels, validation_split=0.25, epochs=10, batch_size=64)

看下最后一次训练结果

Epoch 100/100
 5/5 [==============================] - 0s 7ms/step - loss: 26.3111 - val_loss: 36.1550

看下模型参数

model.summary()

tensorflow入门教程 下载 tensorflow 2.0 教程_tensorflow入门教程 下载_02


tensorflow入门教程 下载 tensorflow 2.0 教程_tensorflow入门教程 下载_03

tensorflow入门教程 下载 tensorflow 2.0 教程_数据集_04

tensorflow入门教程 下载 tensorflow 2.0 教程_tensorflow_05

调参
model = tf.keras.Sequential()
model.add(layers.Dense(16,kernel_initializer='random_normal'))
model.add(layers.Dense(32,kernel_initializer='random_normal'))
model.add(layers.Dense(1,kernel_initializer='random_normal'))

model.compile(optimizer=tf.keras.optimizers.SGD(0.001),
             loss='mean_squared_error')
model.fit(input_features, labels, validation_split=0.25, epochs=100, batch_size=64)

Epoch 100/100
5/5 [==============================] - 0s 7ms/step - loss: 35.6163 - val_loss: 19.1636

加入正则化惩罚项
model = tf.keras.Sequential()
model.add(layers.Dense(16,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.03)))
model.add(layers.Dense(32,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.03)))
model.add(layers.Dense(1,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.03)))

model.compile(optimizer=tf.keras.optimizers.SGD(0.001),
             loss='mean_squared_error')
model.fit(input_features, labels, validation_split=0.25, epochs=100, batch_size=64)
预测模型结果
predict = model.predict(input_features)

tensorflow入门教程 下载 tensorflow 2.0 教程_正则化_06

完整代码github

分类

数据使用mnist数据集

import tensorflow as tf
from tensorflow.keras import layers

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

model.compile(optimizer=tf.keras.optimizers.Adam(0.005),
             loss=tf.keras.losses.SparseCategoricalCrossentropy(),
             metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])


model.fit(x_train, y_train, epochs=5, batch_size=64,
          validation_data=(x_valid, y_valid))
782/782 [==============================] - 2s 3ms/step - loss: 0.1102 - sparse_categorical_accuracy: 0.9666 - val_loss: 0.1491 - val_sparse_categorical_accuracy: 0.9585