吴恩达机器学习入门课程练习题1 的 Python实现注意事项

本文是使用 Jupyter Notebook 作为 Python 编辑与实现环境

    • 0、 版本信息
    • 1、 吴老师练习题的 Python 实现代码:
    • 2、 安装包下载
        • 2.1 在Anaconda Navigator中,创建 tensorflow 环境,并配置所需版本
        • 2.2 在 Home 页中切换到 Tensorflow 环境,并重新安装 Jupyter Notebook
        • 2.3 切换回 Environment 中的 Tensorflow 环境,下载 pandas模块
        • 2.4 在 cmd 命令栏中激活 tensorflow,并在 tensorflow 环境下安装 seaborn 0.9.0 版本
    • 3、代码修改
        • 3.0 最简便的方法:import tensorflow.compat.v1 并禁用 v2
        • 3.1 import tensorflow(默认v2),一步步调试:
          • 3.1.1 解决在定义 linear_regression 函数中 v2 has no attribute 'GradientDescentOptimizer'
          • 3.1.2 解决在画图步骤中因 tensorflow 版本问题,调用 linear_regression 函数再次报错
        • 3.2 解决在调用 X、y 时报错
    • 4、 如果在代价数据可视化中报错,检查seaborn版本
    • 写在最后:

0、 版本信息

本文是使用 Jupyter Notebook 作为 Python 编辑与实现环境,各个模块版本信息如下:

  • Anaconda Navigator 1.9.12
  • Python 3.7
  • Jupyter Notebook 6.0.3
  • tensorflow 2.1.0
  • pandas 1.0.3
  • seaborn 0.9.0

由于我的 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 中实现嗷~

1、 吴老师练习题的 Python 实现代码:

gitee 笔记链接:https://gitee.com/fengdu78/Coursera-ML-AndrewNg-Notes/tree/master/code

github 笔记链接:https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes

两个链接都是 AndrewNg 的笔记,内容差不多是一致的,gitee 速度比 github 快了不止一点点,快乐~

2、 安装包下载

  • 吴老师的练习题1的 Python 实现所需 import 的模块有:

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

2.1 在Anaconda Navigator中,创建 tensorflow 环境,并配置所需版本

  • 在 Anaconda Navigator 的 Environment 中创建 Tensorflow 环境,并在 uninstall 列表中下载所需版本的 tensorflow。
  • 【由于我的 python 版本是 3.7 版本,所以下载的是 tensorflow 2.1 版本。如果大家的python 环境是3.6及3.6以下的版本,也可以下载 tensorflow 1.x版本,与大佬笔记中的代码更好的适配】
    吴恩达机器学习入门课程练习题1 的 Python实现注意事项_第1张图片
    吴恩达机器学习入门课程练习题1 的 Python实现注意事项_第2张图片

2.2 在 Home 页中切换到 Tensorflow 环境,并重新安装 Jupyter Notebook

  • 由于Tensorflow 环境是新创建的,因此许多模块都需要重新安装,包括Jupyter Notebook。
    【虽然 Jupyter Notebook 需要重新安装,但笔记内容是与 base 下已经编辑过的内容适配的,因此不需要担心以前的内容是否会丢失~】
    吴恩达机器学习入门课程练习题1 的 Python实现注意事项_第3张图片

2.3 切换回 Environment 中的 Tensorflow 环境,下载 pandas模块

  • 之前已经下载的 pandas 是在 base 环境中下载的,因此在转换到 tensorflow 环境后,需要重新在环境中下载 pandas
    吴恩达机器学习入门课程练习题1 的 Python实现注意事项_第4张图片

2.4 在 cmd 命令栏中激活 tensorflow,并在 tensorflow 环境下安装 seaborn 0.9.0 版本

  • 由于大佬的代码是在 seaborn 0.9.0 及以下的环境中编写调用的,而在当前Anaconda Navigator 的 Tensorflow 环境中,仅找到了 seaborn 1.x 版本,因此我的 seaborn 安装是在 cmd 命令栏下下载安装的。
  • 首先激活tensorflow环境 activate tensorflow,而后conda install seaborn==0.9.0
  • 而后配置 tensorflow 环境下,Jupyter Notebook 存储文件的路径:找到你的 Notebook,右键属性,更改目标路径即可【我的路径设置为桌面下 TF 路径,看着就很贵气 ୧(๑•̀◡•́๑)૭】
  • 如果大家的 tensorflow 是1.x 版本,可以试试下载 pandas 的方法,直接在 Anaconda 中下载康康~
    吴恩达机器学习入门课程练习题1 的 Python实现注意事项_第5张图片

吴恩达机器学习入门课程练习题1 的 Python实现注意事项_第6张图片

  • 而后可以在 Home 页面中 Launch Jupyter Notebook,import 所需模块,试验是否安装成功
  • 【虽然官方提示了 tensorflow v1 版本将不适用与长期项目,但目前还是可以正常输出的】吴恩达机器学习入门课程练习题1 的 Python实现注意事项_第7张图片

完成以上步骤,import 的步骤就基本没有问题了,离代码的实现也迈进了一大步!

3、代码修改

  • 由于我的 tensorflow 版本是 2.1 版本,而笔记中大佬的代码应该是在 tensorflow 1.x 版本下编写的,因此需要修改部分参数:

3.0 最简便的方法:import tensorflow.compat.v1 并禁用 v2

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

3.1 import tensorflow(默认v2),一步步调试:

3.1.1 解决在定义 linear_regression 函数中 v2 has no attribute ‘GradientDescentOptimizer’

AttributeError: module ‘tensorflow_core._api.v2.train’ has no attribute ‘GradientDescentOptimizer’

  • 这个错误是由于 tensorflow 2.x 版本中对GradientDescentOptimizer 的调用语法改变,因此修改函数中 optimizer 参数如下,之后就可以正常定义了:
    optimizer=tf.compat.v1.train.GradientDescentOptimizer

吴恩达机器学习入门课程练习题1 的 Python实现注意事项_第8张图片

3.1.2 解决在画图步骤中因 tensorflow 版本问题,调用 linear_regression 函数再次报错

1、在创建 optimizer_dict 时报错:

AttributeError: module ‘tensorflow_core._api.v2.train’ has no attribute ‘GradientDescentOptimizer’

  • 同上方法,调整该段代码中 optimizer_dict 参数如下:
    optimizer_dict={‘GD’: tf.compat.v1.train.GradientDescentOptimizer,
    ‘Adagrad’: tf.compat.v1.train.AdagradOptimizer,
    ‘Adam’: tf.compat.v1.train.AdamOptimizer,
    ‘Ftrl’: tf.compat.v1.train.FtrlOptimizer,
    ‘RMS’: tf.compat.v1.train.RMSPropOptimizer
    }

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
  • 在替换过程中,也可以一步步拆分对比一下 tensorflow 2.x 与 tensorflow 1.x 版本的不同:

① 解决 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

3.2 解决在调用 X、y 时报错

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

  • 修改后要注意需要重新调用,从定义get_X()函数开始的所有代码嗷~
    吴恩达机器学习入门课程练习题1 的 Python实现注意事项_第9张图片

4、 如果在代价数据可视化中报错,检查seaborn版本

AttributeError: module ‘seaborn’ has no attribute ‘tsplot’

出现该错误的原因有可能是 seaborn 版本应用的是1.0 版本,而非 0.9 版本,在 Anaconda 或者 cmd 中,激活TensorFlow 而后指定 seaborn 0.9.0 版本即可~
吴恩达机器学习入门课程练习题1 的 Python实现注意事项_第10张图片

写在最后:

第一次写博文,初心只是因为自己是个忘性大的人,担心以后需要类似操作的时候,忘记了部分内容。不过在一边写博文,一边操作的过程中,感觉对整个过程的理解也更深入了一点点,鼓励大家一起尝试~

作为还没摸到入行门槛的小白,文中也还有许多不足/有问题的地方,欢迎大家交流指正~

✿✿ヽ(°▽°)ノ✿

你可能感兴趣的:(机器学习,python,tensorflow)