文章目录
TensorFlow2.0
- scope_name
- 切片
1.0代码升级为2.0
- 单个文件
tf_upgrade_v2 --infile "1.x的代码文件" --outfile "2.x的代码文件"
- 升级目录中所有py文件(不递归生成)
tf_upgrade_v2 --intree foo/ --outtree foo-upgraded/
- 2.0适应1.0
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
简单例子
Tensorflow 2.0 实现MNIST数据集简单例子
import tensorflow as tf
mnist=tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
model = tf.keras.models.Sequential([tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
print(model.fit(x_train,y_train,epochs=5))
model.evaluate(x_test,y_test,verbose=2)
ANN(Artificial Neural Network,简称ANN)
MLP(Multilayer Perceptron)多分类
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation
from tensorflow.keras.optimizers import SGD
# Generate dummy data
import numpy as np
x_train = np.random.random((1000, 20))
y_train = tf.keras.utils.to_categorical(np.random.randint(10, size=(1000, 1)), num_classes=10)
x_test = np.random.random((100, 20))
y_test = tf.keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10)
model = Sequential()
# Dense(64) is a fully-connected layer with 64 hidden units.
# in the first layer, you must specify the expected input data shape:
# here, 20-dimensional vectors.
model.add(Dense(64, activation='relu', input_dim=20))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
#(stochastic gradient descendent)随机梯度下降
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
#train model
model.fit(x_train, y_train,
epochs=20,
batch_size=128)
#evaluate model
score = model.evaluate(x_test, y_test, batch_size=128)
DNN(Deep Neural Networks)
TF2.0 Batch Normalization实现方法¶
import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Flatten, Dense, BatchNormalization
from tensorflow.keras import datasets
# 1、加载数据
(train_images,train_labels),(test_images,test_labels) = datasets.mnist.load_data()
train_images1,test_images1=train_images/255.0,test_images/255.0
# 2、构建模型1
model = Sequential([Flatten(input_shape=(28,28)),
Dense(300, activation='relu'),
BatchNormalization(),
Dense(100, activation='relu'),
BatchNormalization(),
Dense(10, activation='softmax')])
model.summary()
# 3、编译模型
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['acc'])
# 对标签进行分类编码
print(train_labels.shape)
train_labels1 = tf.keras.utils.to_categorical(train_labels)
print(train_labels1.shape)
print(train_labels1[0])
test_labels1 = tf.keras.utils.to_categorical(test_labels)
# 4、拟合模型
history1 = model.fit(train_images1, train_labels1, epochs=10)
# 5、评估模型
model.evaluate(test_images1, test_labels1)
CNN(Convolutional Neural Networks)
手写数字识别例子
import os
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D
import numpy as np
(X_tarin, y_train), (X_test, y_test) = mnist.load_data()
X_train4D = X_tarin.reshape(X_tarin.shape[0], 28, 28, 1).astype('float32')
X_test4D = X_test.reshape(X_test.shape[0], 28, 28, 1).astype('float32')
X_train4D_Normalize = X_train4D / 255 # 归一化
X_test4D_Normalize = X_test4D / 255
y_trainOnehot = to_categorical(y_train)
y_testOnehot = to_categorical(y_test)
# 建立模型
model = Sequential()
# 一层卷积
model.add(Conv2D(filters=16,kernel_size=(5, 5),padding='same', input_shape=(28, 28, 1),activation='relu'))
# 池化层1
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
# 二层卷积
model.add(Conv2D(filters=32, kernel_size=(5, 5), padding='same', activation='relu'))
# 池化层2
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(filters=64, kernel_size=(5, 5), padding='same', activation='relu'))
model.add(Conv2D(filters=128, kernel_size=(5, 5), padding='same', activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(10, activation='softmax'))
model.summary()
# 编译模型
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
#训练模型
train_history = model.fit(x=X_train4D_Normalize,
y=y_trainOnehot,
validation_split=0.2,
batch_size=300,
epochs=10,
verbose=2)
#评估模型
model.evaluate(X_test4D_Normalize, y_testOnehot)[1]
#预测
prediction = model.predict_classes(X_test4D_Normalize)
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 28, 28, 16) 416
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 14, 14, 16) 0
_________________________________________________________________
dropout (Dropout) (None, 14, 14, 16) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 14, 14, 32) 12832
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 7, 7, 32) 0
_________________________________________________________________
dropout_1 (Dropout) (None, 7, 7, 32) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 7, 7, 64) 51264
_________________________________________________________________
conv2d_3 (Conv2D) (None, 7, 7, 128) 204928
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 3, 3, 128) 0
_________________________________________________________________
dropout_2 (Dropout) (None, 3, 3, 128) 0
_________________________________________________________________
flatten (Flatten) (None, 1152) 0
_________________________________________________________________
dense (Dense) (None, 128) 147584
_________________________________________________________________
dropout_3 (Dropout) (None, 128) 0
_________________________________________________________________
dense_1 (Dense) (None, 10) 1290
=================================================================
Total params: 418,314
Trainable params: 418,314
Non-trainable params: 0
_________________________________________________________________
Train on 48000 samples, validate on 12000 samples
Epoch 1/10
48000/48000 - 69s - loss: 0.4651 - accuracy: 0.8481 - val_loss: 0.0888 - val_accuracy: 0.9741
Epoch 2/10
48000/48000 - 66s - loss: 0.1176 - accuracy: 0.9635 - val_loss: 0.0563 - val_accuracy: 0.9824
Epoch 3/10
48000/48000 - 68s - loss: 0.0819 - accuracy: 0.9745 - val_loss: 0.0523 - val_accuracy: 0.9837
Epoch 4/10
48000/48000 - 64s - loss: 0.0641 - accuracy: 0.9800 - val_loss: 0.0402 - val_accuracy: 0.9883
Epoch 5/10
48000/48000 - 63s - loss: 0.0544 - accuracy: 0.9835 - val_loss: 0.0369 - val_accuracy: 0.9892
Epoch 6/10
48000/48000 - 65s - loss: 0.0463 - accuracy: 0.9851 - val_loss: 0.0351 - val_accuracy: 0.9898
Epoch 7/10
48000/48000 - 67s - loss: 0.0415 - accuracy: 0.9871 - val_loss: 0.0344 - val_accuracy: 0.9902
Epoch 8/10
48000/48000 - 63s - loss: 0.0366 - accuracy: 0.9883 - val_loss: 0.0276 - val_accuracy: 0.9920
Epoch 9/10
48000/48000 - 64s - loss: 0.0325 - accuracy: 0.9898 - val_loss: 0.0331 - val_accuracy: 0.9911
Epoch 10/10
48000/48000 - 65s - loss: 0.0316 - accuracy: 0.9902 - val_loss: 0.0321 - val_accuracy: 0.9908
10000/1 [===============================] - 3s 297us/sample - loss: 0.0117 - accuracy: 0.9928
RL(Reinforcement Learning)
cartPole简单策略带复位
import gym
env = gym.make('CartPole-v0')
def basic_policy(obs):
angle = obs[2]
return 0 if angle < 0 else 1
totals = []
for episode in range(500):
episode_rewards = 0
obs = env.reset()
for step in range(1000): # 最多1000 步
action = basic_policy(obs)
obs, reward, done, info = env.step(action)
env.render()
episode_rewards += reward
if done:
if((episode+1)%50==0): print("第%d次训练完成"%(episode+1))
break
totals.append(episode_rewards)
马尔可夫决策过程
nan = np.nan # repressents impossible actions
T = np.array([ # shape=[s, a, s']
[[0.7, 0.3, 0.0], [1.0, 0.0, 0.0], [0.8, 0.2, 0.0]], #0.8 (0 2 0) s0 a2 s0
[[0.0, 1.0, 0.0], [nan, nan, nan], [0.0, 0.0, 1.0]],
[[nan, nan, nan], [0.8, 0.1, 0.1], [nan, nan, nan]],
])
R = np.array([ # shape=[s, a, s']
[[10., 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]],
[[0.0, 0.0, 0.0], [nan, nan, nan], [0.0, 0.0, -50.]],
[[nan, nan, nan], [40., 0.0, 0.0], [nan, nan, nan]],
])
possible_actions = [[0, 1, 2], [0, 2], [1]] #shape = [s,a]
Q = np.full((3, 3), -np.inf) # -inf for impossible actions
for state, actions in enumerate(possible_actions): #(0,0) (0,1) (0,2)
Q[state, actions] = 0.0 # Initial value = 0.0, for all possible actions
learning_rate = 0.01
discount_rate = 0.95
n_iterations = 100
for iteration in range(n_iterations):
Q_prev = Q.copy()
for s in range(3):
for a in possible_actions[s]:
Q[s, a] = np.sum([
T[s, a, sp] * (R[s, a, sp] + discount_rate * np.max(Q_prev[sp]))
for sp in range(3)
])
当使用 0.95 的折扣率时,这为我们提供了此MDP的最优策略:在状态 𝑠0 中选择动作 𝑎0 ,在状态 𝑠1 中选择动作 𝑎2 (通过火场!),并在状态2中选择动作 𝑎1 (唯一可能的动作)。
Q-Learning示例
接下来我们将用一个简单的例子介绍Q-Learning算法的执行过程。
在一幢建筑里有6个房间,房间用编号0-5表示,房间之间通过门相连。房间5是建筑外围空间,可以看作是一个大的房间。
首先将Agent置于建筑中任意一个房间,其目标是从那个房间开始走到房间5。
import numpy as np
GAMMA = 0.8
Q = np.zeros((6,6))
R=np.asarray([
[-1,-1,-1,-1, 0, -1],
[-1,-1,-1,0 ,-1,100],
[-1,-1,-1,0 ,-1, -1],
[-1, 0, 0,-1, 0, -1],
[ 0,-1,-1, 0,-1,100],
[-1, 0,-1,-1, 0,100]])
def maxQ(state):
return max(Q[state, :])
def QLearning(state):
curAction = None
for action in range(6):
if(R[state][action] == -1):
Q[state, action] = 0
else:
curAction = action
Q[state,action] = R[state][action] + GAMMA * maxQ(curAction)
for episode in range(1000):
for i in range(6):
QLearning(i)
print(Q)
结果输出:
[[ 0. 0. 0. 0. 400. 0.]
[ 0. 0. 0. 320. 0. 500.]
[ 0. 0. 0. 320. 0. 0.]
[ 0. 400. 256. 0. 400. 0.]
[320. 0. 0. 320. 0. 500.]
[ 0. 400. 0. 0. 400. 500.]]
最佳路径:
- 假定从0出发,最佳路径为0->4->5
- 假定从1出发,最佳路径为1->5
- 假定从2出发,最佳路径为2->3->4->5或2->3->1->5
- 假定从3出发,最佳路径为3->4->5或3->1->5
- 假定从4出发,最佳路径为4->5
- 假定从5出发,出发地即为目的地