TensorFlow总结

本文总结了TensorFlow2.0的关键变化,包括从1.0到2.0的代码升级,并展示了如何在TF2.0中实现批标准化。此外,还介绍了多层感知机(MLP)用于多分类任务,深入探讨了深度神经网络(DNN)和卷积神经网络(CNN)的应用,如手写数字识别。同时,文章也涉及强化学习(RL),以cartPole问题为例,讨论了马尔可夫决策过程(MDP)和Q-Learning算法。
摘要由CSDN通过智能技术生成

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出发,出发地即为目的地
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值