1. 程式人生 > 實用技巧 >pytorch和tensorflow的愛恨情仇之一元線性迴歸例子(keras插足啦)

pytorch和tensorflow的愛恨情仇之一元線性迴歸例子(keras插足啦)

直接看程式碼:

一、tensorflow

#tensorflow
import tensorflow as tf
import random
import numpy as np

x_data = np.random.randn(100).astype(np.float32)
y_data = x_data * 0.1 + 0.3
weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
biases = tf.Variable(tf.zeros([1]))

y = weights * x_data + biases
losses = tf.reduce_mean(tf.square(y - y_data))
optimizer 
= tf.train.GradientDescentOptimizer(0.5) train = optimizer.minimize(losses) init = tf.initialize_all_variables() with tf.Session() as sess: sess.run(init) for step in range(10): sess.run(train) print(step, sess.run(weights), sess.run(biases))

2、pytorch

#pytorch
import torch
import numpy as np x_data = np.random.randn(100).astype(np.float32) y_data = x_data * 0.3 + 0.1 x_data = torch.from_numpy(x_data) y_data = torch.from_numpy(y_data) weights = torch.rand(1,requires_grad=True) biases = torch.zeros(1,requires_grad=True) print("初始引數weights:{}, biases:{}".format(weights.data, biases.data)) parameters
= [weights, biases] criterion = torch.nn() optimizer = torch.optim.SGD(parameters, 0.5) for i in range(10): y = weights * x_data + biases losses = criterion(y_data, y) print(losses.data, weights.data, biases.data) optimizer.zero_grad() losses.backward() optimizer.step()

三、keras

#keras
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
import numpy as np

x_data = np.random.randn(100).astype(np.float32)
y_data = x_data * 0.3 + 0.1

model = Sequential()

model.add(Dense(input_dim=1, units=1))

model.compile(loss="mse", optimizer=SGD(lr=0.5))
for i in range(10):
    losses = model.train_on_batch(x_data, y_data)
    w, b = model.get_weights()
    print(losses, w, b)

接下來我們再細說他們各自的一些異同:

不同點:

  • pytorch要求輸入的是tensor,而tensorflow和keras可以是numpy;
  • tensorflow1.x是靜態圖,我們可以先定義好相關的操作,然後在session中執行即可;pytorch使用的是動態圖,我們要在迴圈的過程中計算相關的損失;keras封裝的更高階,只需要像model.compile()中傳入損失函式以及優化方法,我們不用顯示計算;
  • tensorflow要求在定義好計算圖之後,在Session()執行圖上的計算操作;
  • tensorflow初始化引數的時候是定義一個tf.initialize_all_variables(),然後在session中首先執行初始化操作:sess.run(init);pytorch是將相關的引數封裝成一個列表,然後傳入給優化器;至於keras(我知道的是使用Sequential()來構建模型,不知道有沒有自定義的引數實現,不使用類);
  • tensorflow使用optimizer.minimize(losses)來最小化損失,pytorch使用loss.backward(),optimizer.step(),實質都是使用反像傳播演算法不斷優化引數使得損失最小化;keras直接使用model.train_on_batch()即可;

相同點:

  • 總體思路是一致的:輸入資料---》定義引數--》計算損失--》定義優化器--》迴圈迭代,最小化損失。

總結:這只是一個簡單的對比,但是這麼一套流程,就可以套用到各種神經網路中了,只是資料的處理、網路結構的搭建等不同。