首先我的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
然后发现site-packages目录下的tensorflow里面没有keras这个库
但是在site-packages目录下的tensorflow_core/python目录下有keras
所以from tensorflow_core.python.keras import datasets, layers是没有问题的
注意,我并没有from tensorflow_core.python.keras import optimizers !!!
- 下面我来讲一下为什么我不从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)