keras和tensorflow简单对比

线性模型

tensorflow

构建模型

# 构建一个线性模型
d = tf.Variable(np.random.rand(1))  # 截距
k = tf.Variable(np.random.rand(1))  #斜率
y = k*x_data + d  # 映射函数

网络设置

# 二次代价函数
loss = tf.losses.mean_squared_error(y_data, y)
# 定义一个梯度下降法优化器
optimizer = tf.train.GradientDescentOptimizer(0.4)  # 经测试0.3~0.7之间较合适
# 最小化代价函数
train = optimizer.minimize(loss)

# 初始化变量
init= tf.global_variables_initializer()

训练

with tf.Session() as sess:
    sess.run(init)
    for i in range(100):
        sess.run(train)
        if i%20==0:
            print(i,sess.run([k,d]))
    y_pred = sess.run(y)

keras

构建模型

# 构建序列模型
model = Sequential()
# 添加一个全连接层 
model.add(Dense(units=1,input_dim=1))

模型参数

# 模型参数
model.compile(optimizer='sgd',loss='mse')

训练

for step in range(3001):
    cost = model.train_on_batch(x_data,y_data)
    # 每500个batch打印一次cost
    if step%500==0:
        print('cost:',cost)

# 打印权值和偏置
W,b = model.layers[0].get_weights()
print('W:',W,'b:',b)


y_pred = model.predict(x_data)

非线性模型

tensorflow

构建模型

# 定义两个placeholder
x = tf.placeholder(tf.float32,[None,1])  # n行1列
y = tf.placeholder(tf.float32,[None,1])

网络设置

# 神经网络结构:1-30-1
w1 = tf.Variable(tf.random_normal([1,30]))  # 权重矩阵
b1 = tf.Variable(tf.zeros([30]))  # 偏置矩阵
wx_plus_b_1 = tf.matmul(x,w1) + b1
l1 = tf.nn.tanh(wx_plus_b_1)  # 激活函数  可以尝试tf.nn.relu 但是要调参 relu使用比较复杂的模型

w2 = tf.Variable(tf.random_normal([30,30]))  # 权重矩阵
b2 = tf.Variable(tf.zeros([30]))  # 偏置矩阵 ********
wx_plus_b_2 = tf.matmul(l1,w2) + b2
l2 = tf.nn.tanh(wx_plus_b_2)  # 激活函数  可以尝试tf.nn.relu 但是要调参 relu使用比较复杂的模型

# 隐藏层到输出层
w3 = tf.Variable(tf.random_normal([30,1]))
b3 = tf.Variable(tf.zeros([1]))
wx_plus_b_3 = tf.matmul(l2,w3) + b3
prediction = tf.nn.tanh(wx_plus_b_3)

参数设置

# 二次代价函数
loss = tf.losses.mean_squared_error(y,prediction)
# 使用梯度下降法最小化loss
train = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

训练

with tf.Session() as sess:
    # 变量初始化
    sess.run(tf.global_variables_initializer())
    # 训练
    for _ in range(5500):
        sess.run(train,feed_dict={x:x_data,y:y_data})

    # 获得预测值
    prediction_value = sess.run(prediction,feed_dict={x:x_data})

keras

构建模型

# 构建序列模型
model = Sequential()

网络设置

# 添加一个全连接层 
model.add(Dense(units=10,input_dim=1,activation='tanh')) # activation很重要
#中间层
model.add(Dense(units=100,input_dim=10,activation='tanh'))
# 最后一层
model.add(Dense(units=1,activation='tanh'))

参数设置

sgd = SGD(lr=0.2)  # 很重要
# 模型参数
model.compile(optimizer=sgd,loss='mse')

训练

for step in range(3001):
    cost = model.train_on_batch(x_data,y_data)
    # 每500个batch打印一次cost
    if step%500==0:
        print('cost:',cost)

y_pred = model.predict(x_data

总结

  1. keras比tensorflow代码少了非常多,特别是网络结构搭建和参数设置
  2. keras比tensorflow慢约一倍