回覆列表
-
1 # 小鴿子看世界
-
2 # 你看我獨角獸嗎
就目前來看,TensorFlow適合做大型機器學習開發專案的時候使用,其分散式框架和用python做client介面呼叫c++的執行速度可以讓模型的執行上達到工業水準;
sklearn更適合在開發人員或更入門機器學習的人去快速得到結果反饋,並且其api呼叫的方式十分友好,fit(),predict(),score()基本能滿足需求,而且資料預處理模組和評價模組可以很好地幫助模型進行調優。
所以TensorFlow和sklearn各有長處,應當在自己開發階段擇優選擇。
TensorFlow更為基礎,基本上是使用樂高積木幫助使用者實現機器學習演算法,scikit-learn則提供了許多現成的演算法,例如支援向量機、隨機森林演算法、邏輯迴歸等分類演算法。如果你想實現深度學習演算法的話,那麼絕對推薦使用TensorFlow,因為它可以讓你利用圖形處理器的進行更有效的培訓。
為了讓大家更好地瞭解這兩種人工智慧學習系統,我透過scikit-learn在Iris資料集上擬合了一個softmax迴歸模型:
此外,我還用了一個小幫手函式來繪製2D決策平面:
看起來很簡單,是吧?:) 現在,如果想透過TensorFlow擬合softmax迴歸模型,必須首先“構建”演算法。雖然聽起來很複雜,但實際操作起來就會發現其實沒那麼難。
TensorFlow有許多“方便”的功能和實用程式。例如,如果想使用機器學習中的最最佳化方法——梯度下降法,其核心或具體計算可能如下:
00001. #構建圖
00002. g = tf.Graph()
00003. with g.as_default():
00004.
00005. 如果 init_weights:
00006. self._n_classes = np.max(y) + 1
00007. self._n_features = X.shape[1]
00008. tf_weights_, tf_biases_ = self._initialize_weights(
00009. n_features=self._n_features,
00010. n_classes=self._n_classes)
00011. self.cost_ = []
00012. else:
00013. tf_weights_ = tf.Variable(self.weights_)
00014. tf_biases_ = tf.Variable(self.biases_)
00015.
00016. # 準備訓練樣本
00017. y_enc = self._one_hot(y, self._n_classes)
00018. n_idx = list(range(y.shape[0]))
00019. tf_X = tf.convert_to_tensor(value=X, dtype=self.dtype)
00020. tf_y = tf.convert_to_tensor(value=y_enc, dtype=self.dtype)
00021. tf_idx = tf.placeholder(tf.int32,
00022. shape=[int(y.shape[0] / n_batches)])
00023. X_batch = tf.gather(params=tf_X, indices=tf_idx)
00024. y_batch = tf.gather(params=tf_y, indices=tf_idx)
00025.
00026. #設定圖表以最小化交叉熵成本
00027. logits = tf.matmul(X_batch, tf_weights_) + tf_biases_
00028. cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits,
00029. y_batch)
00030. cost = tf.reduce_mean(cross_entropy)
00031. optimizer = tf.train.GradientDescentOptimizer(
00032. learning_rate=self.eta)
00033. train = optimizer.minimize(cost)
00034. 聽
00035. #初始化變數
00036. init = tf.initialize_all_variables()
我們可以進行如下訓練:
00001. # 啟動圖
00002. with tf.Session(graph=g) as sess:
00003. sess.run(init)
00004. self.init_time_ = time()
00005. for epoch in range(self.epochs):
00006. if self.minibatches > 1:
00007. n_idx = np.random.permutation(n_idx)
00008. minis = np.array_split(n_idx, self.minibatches)
00009. costs = []
00010. for idx in minis:
00011. _, c = sess.run([train, cost], feed_dict={tf_idx: idx})
00012. costs.append(c)
為了方便演示,我已經用TensorFlow實現了面向物件的softmax迴歸,這有點類似於scikit-learn。 如果你有興趣的話,可以在這裡找到完整的程式碼示例:rasbt / mlxtend