本文是使用 Jupyter Notebook 作为 Python 编辑与实现环境,各个模块版本信息如下:
由于我的 python 版本是 3.7 版本,无法匹配 tensorflow 1.x ,所以在这里我下载的是 tensorflow 2.1 版本。
而大佬的代码是在 tensorflow 1.x 环境下编写的,因此如果和我一样版本是 tensorflow 2.x,为了实现 1.x 中的代码,可以直接 import tensorflow v1 ,并禁用 v2,具体代码实现如下:
Import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
但是由于 tensorflow 已经更新至 2.x 版本,在功能实现上做了更好的优化,并且官方提示 warning: tensorflow 1.x will be removed in a future version,因此学习大佬思路后,建议可以对比 v1 与 v2 具体改变,在后续使用中还是在 tensorflow 2.x 中实现嗷~
gitee 笔记链接:https://gitee.com/fengdu78/Coursera-ML-AndrewNg-Notes/tree/master/code
github 笔记链接:https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes
两个链接都是 AndrewNg 的笔记,内容差不多是一致的,gitee 速度比 github 快了不止一点点,快乐~
import pandas as pd
import seaborn as sns
sns.set(context=“notebook”, style=“whitegrid”, palette=“dark”)
import matplotlib.pyplot as plt
Import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import numpy as np
完成以上步骤,import 的步骤就基本没有问题了,离代码的实现也迈进了一大步!
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
AttributeError: module ‘tensorflow_core._api.v2.train’ has no attribute ‘GradientDescentOptimizer’
1、在创建 optimizer_dict 时报错:
AttributeError: module ‘tensorflow_core._api.v2.train’ has no attribute ‘GradientDescentOptimizer’
2、而后在 for 循环调用 X_data、y_data 中,由于 2.x 版本 tensorflow 没有 placeholder 语法,将继续报错
AttributeError: module ‘tensorflow’ has no attribute ‘placeholder’
这一步的报错都是因为定义 linear_regression() 函数的过程 tensorflow 版本不兼容导致,思路就是将所有的 tf.xxx 更改为 tf.compat.v1.xxx,如下:
def linear_regression(X_data, y_data, alpha, epoch, optimizer=tf.compat.v1.train.GradientDescentOptimizer):# 这个函数是旧金山的一个大神Lucas Shen写的
# placeholder for graph input
X = tf.compat.v1.placeholder(tf.float32, shape=X_data.shape)
y = tf.compat.v1.placeholder(tf.float32, shape=y_data.shape)
# construct the graph
# with tf.get_variable_scope('linear-regression'):
with tf.compat.v1.variable_scope('linear-regression'):
W = tf.compat.v1.get_variable("weights",
(X_data.shape[1], 1),
initializer=tf.compat.v1.constant_initializer()) # n*1
y_pred = tf.matmul(X, W) # m*n @ n*1 -> m*1
loss = 1 / (2 * len(X_data)) * tf.matmul((y_pred - y), (y_pred - y), transpose_a=True) # (m*1).T @ m*1 = 1*1
opt = optimizer(learning_rate=alpha)
opt_operation = opt.minimize(loss)
# run the session
with tf.compat.v1.Session() as sess:
sess.run(tf.compat.v1.global_variables_initializer())
loss_data = []
for i in range(epoch):
_, loss_val, W_val = sess.run([opt_operation, loss, W], feed_dict={X: X_data, y: y_data})
loss_data.append(loss_val[0, 0]) # because every loss_val is 1*1 ndarray
if len(loss_data) > 1 and np.abs(loss_data[-1] - loss_data[-2]) < 10 ** -9: # early break when it's converged
# print('Converged at epoch {}'.format(i))
break
# clear the graph
tf.compat.v1.reset_default_graph()
return {'loss': loss_data, 'parameters': W_val} # just want to return in row vector format
① 解决 AttributeError: module ‘tensorflow’ has no attribute ‘placeholder’:
在定义 X, y 时,修改代码如下:
X = tf.compat.v1.placeholder(tf.float32, shape=X_data.shape)
y = tf.compat.v1.placeholder(tf.float32, shape=y_data.shape)
② 而后将出现 AttributeError: module ‘tensorflow’ has no attribute ‘variable_scope’
在调用 variable_scope 方法时,修改代码如下:
with tf.compat.v1.variable_scope(‘linear-regression’):
W = tf.compat.v1.get_variable(“weights”,
(X_data.shape[1], 1),
initializer=tf.compat.v1.constant_initializer())
③ 而后将出现 AttributeError: module ‘tensorflow’ has no attribute ‘Session’
在调 Session 时,修改代码如下:
with tf.compat.v1.Session() as sess:
sess.run(tf.compat.v1.global_variables_initializer())
loss_data = []
④ 而后将出现 AttributeError: module ‘tensorflow’ has no attribute ‘reset_default_graph’
同上,修改代码如下:
tf.compat.v1.reset_default_graph()
这四步调完,整段 def linear_regression() 代码就调试完毕了,最简便的方式还是在 import 时导入 v1 并禁用 v2
AttributeError: ‘DataFrame’ object has no attribute ‘as_matrix’
这个错误是由于在定义 get_X(df): 函数中,使用.as_matrix() 将 DataFrame 对象返回为 ndarray 对象,而当前版本是使用 .values来操作该转变,因此修改 get_X() 函数如下:
def get_X(df):
ones = pd.DataFrame({‘ones’: np.ones(len(df))})
data = pd.concat([ones, df], axis=1)
return data.iloc[:, :-1].values
AttributeError: module ‘seaborn’ has no attribute ‘tsplot’
出现该错误的原因有可能是 seaborn 版本应用的是1.0 版本,而非 0.9 版本,在 Anaconda 或者 cmd 中,激活TensorFlow 而后指定 seaborn 0.9.0 版本即可~
第一次写博文,初心只是因为自己是个忘性大的人,担心以后需要类似操作的时候,忘记了部分内容。不过在一边写博文,一边操作的过程中,感觉对整个过程的理解也更深入了一点点,鼓励大家一起尝试~
作为还没摸到入行门槛的小白,文中也还有许多不足/有问题的地方,欢迎大家交流指正~
✿✿ヽ(°▽°)ノ✿