彼らはしかし、tensorflowは線形モデルを達成するために使用され、実験結果たくさん悪いことで提供されるものよりもモデルの効果sklearnので、最適化アルゴリズム、正則、機能の喪失と正規化、記録しようと、独自の実験を変更しようとするすべてのプロセス経験。
import numpy as np
import tensorflow as tf
import sklearn
import pandas as pd
class Model:
def __init__(self, sess, feature_size, step, learning_rate, regulation):
self.sess = sess
self.feature_size = feature_size
self.step = step
self.learning_rate = learning_rate
self.regulation = regulation
self.build_model()
self.add_loss()
self.add_optimizer()
self.sess.run(tf.global_variables_initializer())
self.sess.run(tf.local_variables_initializer())
def build_model(self):
self.x = tf.placeholder(shape=[None, self.feature_size], dtype=tf.float32)
self.y_true = tf.placeholder(shape=[None, 1], dtype=tf.float32)
with tf.name_scope('linear_model'):
l2_reg = tf.contrib.layers.l2_regularizer(0.1)
self.w = tf.get_variable(name='w', shape=[self.feature_size, 1],
initializer=tf.truncated_normal_initializer(), regularizer=l2_reg)
self.b = tf.get_variable(name='b', shape=[1],
initializer=tf.truncated_normal_initializer(stddev=1, seed=1))
self.y_pred = tf.matmul(self.x, self.w) + self.b
def add_loss(self, loss='l2'):
reg_variables = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
if loss == 'l2':
self.loss = tf.reduce_mean(tf.square(self.y_true - self.y_pred))
if loss == 'l1':
self.loss = tf.reduce_mean(tf.abs(self.y_true - self.y_pred))
if loss == 'huber':
delta = tf.constant(0.25) # delta越大两边线性部分越陡峭,损失越大
self.loss = tf.multiply(tf.square(delta), tf.sqrt(1. + tf.square((self.y_true - self.y_pred) / delta)) - 1.)
self.loss += tf.add_n(reg_variables)
def add_optimizer(self):
self.optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
self.train_step = self.optimizer.minimize(self.loss)
def predict(self, x_test):
self.pred_test = tf.matmul(tf.cast(x_test, tf.float32), self.w) + self.b
pred_test = self.sess.run([self.pred_test])
return pred_test
def train(self, train_data, train_label):
loss, y_pred = self.sess.run([self.loss, self.y_pred], feed_dict={self.x: train_data, self.y_true: train_label})
return loss, y_pred
if __name__ == '__main__':
feature_size, step, learning_rate, regulation = 100, 1000, 0.0001, 'L2'
sample_size = 30
x = [list(np.random.rand(feature_size)) for _ in range(sample_size)]
y = [np.random.rand(1) for _ in range(sample_size)]
x = pd.DataFrame(x).apply(lambda x: (x - np.mean(x)) / (np.max(x) - np.min(x))).values
with tf.Session() as sess:
model = Model(sess, feature_size, step, learning_rate, regulation)
_, _ = model.train(x, y)
# print('loss is ', loss)
pred_test = model.predict(x)
# print('pred label\tture label')
# for each in zip(pred, y):
# print(round(each[0][0], 6), '\t', round(each[1][0], 6))
loss = sum([(each[0][0] - each[1][0]) ** 2 for each in zip(pred_test, y)])
print('LR net loss ', loss)
from sklearn import linear_model
reg = linear_model.LinearRegression()
reg.fit(x, y)
pred_test1 = reg.predict(x)
loss = sum([(each[0][0] - each[1][0]) ** 2 for each in zip(pred_test1, y)])
print('sklearn loss ', loss)
import matplotlib.pyplot as plt
fig = plt.figure()
x = [i for i in range(len(x))]
plt.plot(x, y, 'k*-', markersize=12)
plt.plot(x, [each[0] for each in pred_test[0]], 'r.-', markersize=12)
plt.plot(x, [each[0] for each in pred_test1], 'b.-', markersize=12)
plt.legend(('true', 'my', 'Linear Fit'), loc='lower right')
plt.title('regression compare')
plt.show()
以下は、実験記録である:
重量の初期化がゼロに初期化することが重要であり、結果は全て0であり、あまりにも配信初期化段階で、結果はすべて陰性であります
GradientDescentOptimizer
LR純損失[74.816734]
sklearn損失4.22780141391886e-30MomentumOptimizer
LR純損失[1.5802944]
sklearn損失2.1308488904700377e-30
データは、以下の4つのアルゴリズムと、スパースである場合、アダムアルゴリズムを用いて、高速出口鞍点を確保しつつ、運動量を加えました。
https://segmentfault.com/a/1190000012668819
非常にフレンドリーAdagradOptimizerまばらなデータ
LR純損失[19.184008]
sklearn損失1.1571757477856268e-29RMSPropOptimizer
LR純損失[1.3790985]
sklearn損失5.1738182026018704e-30AdadeltaOptimizer結果は非常に不安定になります
LR純損失を[16.51035]
sklearn損失7.90786835165399e-30AdamOptimizer
LR純損失[0.98462635]
sklearn損失5.571330143123396e-30AdamOptimizer + L2は、正則化項が追加
LR純損失を[0.0768552]
sklearn損失4.7639803104362666e-30AdamOptimizer + L1は、正則化項が追加
LR純損失を[5.0768552]
sklearn損失4.7639803104362666e-30(損失L2のデフォルト前)損失のAdamOptimizer + L2 +のフーバー正則化項を追加
LR純損失[0.58679754]
sklearn損失3.3163743270370446e-29正規化+ AdamOptimizer + L2 + L2正則用語損失を追加
LR純損失[0.989549]
sklearn損失1.8846380063795735e-29をAdamOptimizer + L2 + L2正則用語損失+ +改変正規化された方法が推測追加
LR純損失[1.4737219]
sklearn損失8.079969451484434e-29を