在运行程序是遇到了以下问题
错误如下,求解答:
RuntimeError: tf.data.Dataset
only supports Python-style iteration in eager mode or within tf.function.
源代码
import tensorflow as tf
import numpy as np
from sklearn.datasets import load_iris
data = load_iris()
iris_target = data.target
iris_data = np.float32(data.data)
iris_target = np.float32(tf.keras.utils.to_categorical(iris_target,num_classes=3) )
iris_data = tf.data.Dataset.from_tensor_slices(iris_data).batch(50)
iris_target = tf.data.Dataset.from_tensor_slices(iris_target).batch(50)
model = tf.keras.models.Sequential()
# Add layers
model.add(tf.keras.layers.Dense(32,activation="relu"))
model.add(tf.keras.layers.Dense(64,activation="relu"))
model.add(tf.keras.layers.Dense(3,activation="softmax"))
opt = tf.optimizers.Adam(1e-3)
for epoch in range(1000):
for _data,lable in zip(iris_data,iris_target):
with tf.GradientTape() as tape:
logits = model(_data)
loss_value = tf.reduce_mean(tf.keras.losses.categorical_crossentropy(y_true = lable,y_pred = logits))
grads = tape.gradient(loss_value, model.trainable_variables)
opt.apply_gradients (zip (grads, model.trainable_variables))
print('Training loss is :',loss_value.numpy())
根据报错,这样修改试试:
with tf.data.Dataset as ds:
iris_data = ds.from_tensor_slices(iris_data).batch(50)
iris_target = ds.from_tensor_slices(iris_target).batch(50)
使用tf.operation.eval()也可运行operation,但需要在会话中运行
# 创建图
a = tf.constant(5.0)
b = tf.constant(6.0)
c = a * b
# 创建会话
sess = tf.Session()
# 计算C的值
print(sess.run(c))
print(c.eval(session=sess))