学习tensorflow,求解答

在运行程序是遇到了以下问题
错误如下,求解答:

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)
  • 这篇博客: Python_头条推荐系统_深度学习与推荐系统&TensorFlow框架(5)中的 2.3.1.2 会话的run() 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • run(fetches,feed_dict=None, options=None, run_metadata=None)
      • 通过使用sess.run()来运行operation
      • fetches:单一的operation,或者列表、元组(其它不属于tensorflow的类型不行)
      • feed_dict:参数允许调用者覆盖图中张量的值,运行时赋值
        • 与tf.placeholder搭配使用,则会检查值的形状是否与占位符兼容。

    使用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))