解决 from tensorflow.keras import datasets,layers, optimizers报错的问题, SGD没有apply_gradients

首先我的tensorflow-gpu版本是2.0.0

解决方法:

from tensorflow_core.python.keras import datasets, layers

问题描述:

我是条看视频的时候,有这样一句代码:
from tensorflow.keras import datasets, layers
但是我自己输入的时候会报错,然后我看了一下代码所在环境下的包site-packages
我的目录是:C:\Users\MK.virtualenvs\deep_learning-y075by1N\Lib\site-packages\tensorflow
解决 from tensorflow.keras import datasets,layers, optimizers报错的问题, SGD没有apply_gradients_第1张图片
然后发现site-packages目录下的tensorflow里面没有keras这个库
但是在site-packages目录下的tensorflow_core/python目录下有keras
解决 from tensorflow.keras import datasets,layers, optimizers报错的问题, SGD没有apply_gradients_第2张图片

所以from tensorflow_core.python.keras import datasets, layers是没有问题的
注意,我并没有from tensorflow_core.python.keras import optimizers !!!

  1. 下面我来讲一下为什么我不从tensorflow_core.python.keras import optimizers
    答:如果我们使用SGD来优化参数的时候,
from tensorflow_core.python.keras import optimizers
optimizer1 = optimizers.SGD(lr=0.01)

这个时候得到的SGD是没有 apply_gradients这个函数的
并且SGD里面的参数没有learning_rate, 而是变成lr
也就是说执行optimizer1.apply_gradients()会报错,提示你SGD没有 apply_gradients这个函数

所以如果我们想使用optimizers,只需
from tensorflow import keras
optimizer1 = keras.optimizers.SGD(lr=0.01)就可以了

总的问题还是归结于Keras 和tensorflow 不是很兼容造成的,虽然我现在还没有理解

下面是自己写的一些代码

import os
from tensorflow import keras
import tensorflow as tf
from tensorflow_core.python.keras import datasets, layers
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

(x, y), (x_val, y_val) = datasets.mnist.load_data()
x = tf.convert_to_tensor(x, dtype=tf.float32) / 255
y = tf.convert_to_tensor(y, dtype=tf.int32)  # (60000,1)
y = tf.one_hot(y, depth=10)  # (60000, 10)

# tf.convert_to_tensor将x, y的格式转化成tensor
# tf.data.Dataset.from_tensor_slices((x, y))默认是一次返回一张图片,而我们想要一次返回多张则在后面加.batch
train_dataset = tf.data.Dataset.from_tensor_slices((x, y))
train_dataset = train_dataset.batch(200)
# print(train_dataset)
# 步骤0
model = keras.Sequential([
    # layers.Dense(512, activation='relu'),
    layers.Dense(256, activation='relu'),
    layers.Dense(10)])

optimizer = keras.optimizers.SGD(lr=0.01)


def train_epoch(epoch):
    for step, (x, y) in enumerate(train_dataset):
        with tf.GradientTape() as tape:
            # 1.1图片是28*28维的,所以我们将它展平成[1,784]
            x = tf.reshape(x, (-1, 28 * 28))
            # 1.2计算输出值out=relu(x*w+b)
            out = model(x)
            # 1.3计算损失函数loss
            loss = tf.reduce_sum(tf.square(out - y)) / x.shape[0]

        # 步骤3:更新参数
        # 3.1求出新的参数
        # tape.gradient:自动对参数进行求导
        grads = tape.gradient(loss, model.trainable_variables)
        # print(grads)
        # 3.2更新参数
        optimizer.apply_gradients(zip(grads, model.trainable_variables))

        if step % 100 == 0:
            print(epoch, step, 'loss', loss.numpy())


if __name__ == '__main__':
    for epoch in range(5):
        train_epoch(epoch)

你可能感兴趣的:(tensorflow,深度学习)