動態(tài)圖
動態(tài)圖對應(yīng)的是命令式編程:
可以不用事先定義神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)龄毡,將神經(jīng)網(wǎng)絡(luò)的定義和執(zhí)行同步進行
與之相反的便是靜態(tài)圖橡淑,靜態(tài)圖和聲明式編程相關(guān):
需要事先定義好神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),然后再執(zhí)行整個圖結(jié)構(gòu)闷堡。
對比
如果想要實現(xiàn)如下功能。
如果inp1各元素之和小于inp2各元素之和,那么執(zhí)行inp1與 inp2各元素對應(yīng)相加桥爽。
如果inp1各元素之和大于等于inp2各元素之和,那么執(zhí)行inp1與 inp2各元素對應(yīng)相減昧识。
使用動態(tài)圖進行訓(xùn)練
import paddle.fluid asfluid
import numpy as np
inp1 = np.random.rand(4, 3, 3)
inp2 = np.random.rand(4, 3, 3)
# dynamic graph
with fluid.dygraph.guard():
if np.sum(inp1) <np.sum(inp2):
x =fluid.layers.elementwise_add(inp1, inp2)
else:
x =fluid.layers.elementwise_sub(inp1, inp2)
dygraph_result = x.numpy()
核心代碼只有6行钠四,而如果使用靜態(tài)圖的話便至少需要20行的核心代碼,
So
優(yōu)勢
- 動態(tài)圖與靜態(tài)圖的最大區(qū)別是采用了命令式的編程方式跪楞,任務(wù)不用在區(qū)分組網(wǎng)階段和執(zhí)行階段缀去。代碼運行完成之后,可以立馬獲取結(jié)果甸祭。由于采用與我們書寫大部分Python和c++的方式是一致的命令式編程方式缕碎,程序的編寫和調(diào)試會非常的容易。
- 能夠使用Python的控制流池户,例如for,if else, switch等咏雌,對于rnn等任務(wù)的支持更方便。
- 動態(tài)圖能夠與numpy更好的交互煞檩。
一句話總結(jié)
思想簡單处嫌,代碼量少!
使用方法
import paddle.fluid as fluid
import numpy as np
x = np.ones([10, 2, 2], np.float32)
with fluid.dygraph.guard():
inputs = []
seq_len = x.shape[0]
for i in range(seq_len):
inputs.append(fluid.dygraph.to_variable(x[i]))
ret =fluid.layers.sums(inputs)
print(ret.numpy())
output
[[10. 10.]
[10. 10.]]
loss =fluid.layers.reduce_sum(ret)
loss.backward()
print(loss.gradient())
output
[1.]
本次項目的實戰(zhàn)代碼:
用動態(tài)圖進行模型訓(xùn)練
use_cuda = True
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
with fluid.dygraph.guard():
model=MyDNN()
model.train()
opt=fluid.optimizer.SGDOptimizer(learning_rate=0.005, parameter_list=model.parameters())
epochs_num=20 #迭代次數(shù)
for pass_num in range(epochs_num):
for batch_id,data in enumerate(train_reader()):
images=np.array([x[0].reshape(3,100,100) for x in data],np.float32)
labels = np.array([x[1] for x in data]).astype('int64')
labels = labels[:, np.newaxis]
# print(images.shape)
image=fluid.dygraph.to_variable(images)
label=fluid.dygraph.to_variable(labels)
predict=model(image)#預(yù)測
# print(predict)
loss=fluid.layers.cross_entropy(predict,label)
avg_loss=fluid.layers.mean(loss)#獲取loss值
acc=fluid.layers.accuracy(predict,label)#計算精度
if batch_id!=0 and batch_id%50==0:
print("train_pass:{},batch_id:{},train_loss:{},train_acc:{}".format(pass_num,batch_id,avg_loss.numpy(),acc.numpy()))
avg_loss.backward()
opt.minimize(avg_loss)
model.clear_gradients()
fluid.save_dygraph(model.state_dict(),'MyDNN')#保存模型
如果想了解圖像識別實戰(zhàn)的全過程斟湃,請務(wù)必點擊博主名字熏迹,進入主頁查看全部。
別忘了留下凝赛,你的點贊注暗、評論和關(guān)注偶~