较基础的支持向量机,后续会加上多分类以及高斯核,供大家参考。
说说很简单,给我代码
进口tensorflow特遣部队 从sklearn。基地进口BaseEstimator ClassifierMixin 进口numpy np 类TFSVM (BaseEstimator ClassifierMixin): def __init__(自我, C=1,内核=跋咝浴? learning_rate=0.01, training_epoch=1000, display_step=50, batch_size=50, random_state=42): #参数列表 自我。svmC=C 自我。内核=内核 自我。learning_rate=learning_rate 自我。training_epoch=training_epoch 自我。display_step=display_step 自我。random_state=random_state 自我。batch_size=batch_size def reset_seed(自我): #重置随机数 tf.set_random_seed (self.random_state) np.random.seed (self.random_state) def random_batch(自我,X, y): #调用随机子集,实现mini-batch梯度下降法 指数=np.random。randint (1, X。self.batch_size形状[0]) X_batch=X(指数) y_batch=y(指数) 返回X_batch y_batch def _build_graph(自我、X_train y_train): #创建计算图 self.reset_seed () n_instances n_inputs=X_train.shape X=tf.placeholder (tf。float32,没有,n_inputs, name=' X ') y=tf.placeholder (tf。[没有,1],float32 name=' y ') 与tf.name_scope (“trainable_variables”): #决策边界的两个变量 W=tf.Variable (tf。truncated_normal(形状=[n_inputs 1], stddev=0.1), name=叭ㄖ亍? b=tf.Variable (tf.truncated_normal ([1]), name=捌? 与tf.name_scope(“训练”): #算法核心 y_raw=tf.add (tf。matmul (X, W), b) l2_norm=tf.reduce_sum (tf.square (W)) hinge_loss=tf.reduce_mean (tf.maximum (tf.zeros(自我。batch_size, 1), tf.subtract (1。特遣部队。乘(y_raw, y)))) svm_loss=特遣部队。add (hinge_loss tf.multiply(自我。svmC, l2_norm)) training_op=tf.train。AdamOptimizer (learning_rate=self.learning_rate) .minimize (svm_loss) 与tf.name_scope (eval): #正确率和预测 prediction_class=tf.sign (y_raw) correct_prediction=特遣部队。平等(y, prediction_class) 精度=tf.reduce_mean (tf。铸造(correct_prediction tf.float32)) init=tf.global_variables_initializer () 自我。值=X;自我。_y吗=y 自我。_loss=svm_loss;自我。_training_op=training_op 自我。_accuracy=精度;自我。init=自我。_prediction_class=prediction_class 自我。_W=W;自我。_b=b def _get_model_params(自我): #获取模型的参数,以便存储 与self._graph.as_default (): gvars=tf.get_collection (tf.GraphKeys.GLOBAL_VARIABLES) 为gvar返回{gvar.op.name:价值,价值zip (gvars, self._session.run (gvars))} def _restore_model_params(自我,model_params): #保存模型的参数 gvar_names=列表(model_params.keys ()) assign_op={gvar_name: self._graph。get_operation_by_name (gvar_name +/分配)的gvar_name gvar_names} init_values={gvar_name: assign_op。输入[1]gvar_name, assign_op assign_ops.items ()} feed_dict={init_values [gvar_name]: model_params [gvar_name]的gvar_name gvar_names} self._session.run (assign_op feed_dict=feed_dict) def适合(自我,X, y, X_val=None, y_val=None): #适合函数,注意要输入验证集 n_batches=X。[0]//self.batch_size形状 自我。_graph=tf.Graph () 与self._graph.as_default (): 自我。_build_graph (X, y) best_loss=np.infty best_accuracy=0 best_params=没有 checks_without_progress=0 max_checks_without_progress=20 自我。_session=特遣部队。会话(图=self._graph) 与self._session.as_default税(): self.init.run () 时代的范围(self.training_epoch): batch_index的范围(n_batches): X_batch y_batch=自我。random_batch (X, y) sess.run (self._training_op feed_dict={自我。值:X_batch self._y: y_batch}) loss_val accuracy_val=sess.run ([self._loss,自我。_accuracy], feed_dict={自我。值:X_val,自我。_y吗:y_val}) accuracy_train=self._accuracy。eval (feed_dict={自我。值:X_batch,自我。_y吗:y_batch}) 如果loss_val & lt;best_loss: best_loss=loss_val best_params=self._get_model_params () checks_without_progress=0 其他: checks_without_progress +=1 如果checks_without_progress比;max_checks_without_progress: 打破 如果accuracy_val比;best_accuracy: best_accuracy=accuracy_val # best_params=self._get_model_params () 如果时代%的自我。display_step==0: 打印(“时代:{}\ tValidaiton失:{:。6 f} \ tValidation准确性:{:。4 f} \ tTraining准确性:{:.4f}” .format(时代、loss_val accuracy_val accuracy_train)) 打印(“最佳精度:{:。4 f} \结核病损失:{:.6f}”。格式(best_accuracy best_loss)) 如果best_params: self._restore_model_params (best_params) 自我。_intercept=best_params (‘trainable_variables/重量) 自我。_bias=best_params (“trainable_variables/偏见”) 回归自我 def预测(自我,X): 与self._session.as_default税(): self._prediction_class返回。eval (feed_dict={自我。值:X}) def _intercept(自我): 返回self._intercept def _bias(自我): 返回self._bias使用TensorFlow实现SVM