tf.train.adamoptimizer报错
时间: 2023-04-21 15:06:55 浏览: 89
tf.train.adamoptimizer报错可能是由于以下原因之一:
1. 代码中使用了过时的tf.train.AdamOptimizer()函数,建议使用tf.keras.optimizers.Adam()代替。
2. 代码中参数设置不正确,例如学习率设置过大或过小,建议调整参数。
3. TensorFlow版本不兼容,建议升级或降级TensorFlow版本。
4. 其他未知原因,建议查看具体报错信息并进行排查。
相关问题
下面代码在tensorflow中出现了init() missing 1 required positional argument: 'cell'报错: class Model(): def init(self): self.img_seq_shape=(10,128,128,3) self.img_shape=(128,128,3) self.train_img=dataset # self.test_img=dataset_T patch = int(128 / 2 ** 4) self.disc_patch = (patch, patch, 1) self.optimizer=tf.keras.optimizers.Adam(learning_rate=0.001) self.build_generator=self.build_generator() self.build_discriminator=self.build_discriminator() self.build_discriminator.compile(loss='binary_crossentropy', optimizer=self.optimizer, metrics=['accuracy']) self.build_generator.compile(loss='binary_crossentropy', optimizer=self.optimizer) img_seq_A = Input(shape=(10,128,128,3)) #输入图片 img_B = Input(shape=self.img_shape) #目标图片 fake_B = self.build_generator(img_seq_A) #生成的伪目标图片 self.build_discriminator.trainable = False valid = self.build_discriminator([img_seq_A, fake_B]) self.combined = tf.keras.models.Model([img_seq_A, img_B], [valid, fake_B]) self.combined.compile(loss=['binary_crossentropy', 'mse'], loss_weights=[1, 100], optimizer=self.optimizer,metrics=['accuracy']) def build_generator(self): def res_net(inputs, filters): x = inputs net = conv2d(x, filters // 2, (1, 1), 1) net = conv2d(net, filters, (3, 3), 1) net = net + x # net=tf.keras.layers.LeakyReLU(0.2)(net) return net def conv2d(inputs, filters, kernel_size, strides): x = tf.keras.layers.Conv2D(filters, kernel_size, strides, 'same')(inputs) x = tf.keras.layers.BatchNormalization()(x) x = tf.keras.layers.LeakyReLU(alpha=0.2)(x) return x d0 = tf.keras.layers.Input(shape=(10, 128, 128, 3)) out= ConvRNN2D(filters=32, kernel_size=3,padding='same')(d0) out=tf.keras.layers.Conv2D(3,1,1,'same')(out) return keras.Model(inputs=d0, outputs=out) def build_discriminator(self): def d_layer(layer_input, filters, f_size=4, bn=True): d = tf.keras.layers.Conv2D(filters, kernel_size=f_size, strides=2, padding='same')(layer_input) if bn: d = tf.keras.layers.BatchNormalization(momentum=0.8)(d) d = tf.keras.layers.LeakyReLU(alpha=0.2)(d) return d img_A = tf.keras.layers.Input(shape=(10, 128, 128, 3)) img_B = tf.keras.layers.Input(shape=(128, 128, 3)) df = 32 lstm_out = ConvRNN2D(filters=df, kernel_size=4, padding="same")(img_A) lstm_out = tf.keras.layers.LeakyReLU(alpha=0.2)(lstm_out) combined_imgs = tf.keras.layers.Concatenate(axis=-1)([lstm_out, img_B]) d1 = d_layer(combined_imgs, df)#64 d2 = d_layer(d1, df * 2)#32 d3 = d_layer(d2, df * 4)#16 d4 = d_layer(d3, df * 8)#8 validity = tf.keras.layers.Conv2D(1, kernel_size=4, strides=1, padding='same')(d4) return tf.keras.Model([img_A, img_B], validity)
你在定义 Model 类时,没有传入参数 cell,但是在代码中使用了 ConvRNN2D 的实例化对象,这个对象需要一个 cell 参数。你需要在初始化函数中添加这个参数,如下所示:
```
class Model():
def __init__(self, cell):
self.img_seq_shape=(10,128,128,3)
self.img_shape=(128,128,3)
self.train_img=dataset
patch = int(128 / 2 ** 4)
self.disc_patch = (patch, patch, 1)
self.optimizer=tf.keras.optimizers.Adam(learning_rate=0.001)
self.build_generator=self.build_generator()
self.build_discriminator=self.build_discriminator(cell)
self.build_discriminator.compile(loss='binary_crossentropy', optimizer=self.optimizer, metrics=['accuracy'])
self.build_generator.compile(loss='binary_crossentropy', optimizer=self.optimizer)
img_seq_A = Input(shape=(10,128,128,3))
img_B = Input(shape=self.img_shape)
fake_B = self.build_generator(img_seq_A)
self.build_discriminator.trainable = False
valid = self.build_discriminator([img_seq_A, fake_B])
self.combined = tf.keras.models.Model([img_seq_A, img_B], [valid, fake_B])
self.combined.compile(loss=['binary_crossentropy', 'mse'], loss_weights=[1, 100], optimizer=self.optimizer,metrics=['accuracy'])
def build_generator(self):
def res_net(inputs, filters):
x = inputs
net = conv2d(x, filters // 2, (1, 1), 1)
net = conv2d(net, filters, (3, 3), 1)
net = net + x
return net
def conv2d(inputs, filters, kernel_size, strides):
x = tf.keras.layers.Conv2D(filters, kernel_size, strides, 'same')(inputs)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha=0.2)(x)
return x
d0 = tf.keras.layers.Input(shape=(10, 128, 128, 3))
out= ConvRNN2D(cell, filters=32, kernel_size=3,padding='same')(d0)
out=tf.keras.layers.Conv2D(3,1,1,'same')(out)
return keras.Model(inputs=d0, outputs=out)
def build_discriminator(self, cell):
def d_layer(layer_input, filters, f_size=4, bn=True):
d = tf.keras.layers.Conv2D(filters, kernel_size=f_size, strides=2, padding='same')(layer_input)
if bn:
d = tf.keras.layers.BatchNormalization(momentum=0.8)(d)
d = tf.keras.layers.LeakyReLU(alpha=0.2)(d)
return d
img_A = tf.keras.layers.Input(shape=(10, 128, 128, 3))
img_B = tf.keras.layers.Input(shape=(128, 128, 3))
df = 32
lstm_out = ConvRNN2D(cell, filters=df, kernel_size=4, padding="same")(img_A)
lstm_out = tf.keras.layers.LeakyReLU(alpha=0.2)(lstm_out)
combined_imgs = tf.keras.layers.Concatenate(axis=-1)([lstm_out, img_B])
d1 = d_layer(combined_imgs, df)#64
d2 = d_layer(d1, df * 2)#32
d3 = d_layer(d2, df * 4)#16
d4 = d_layer(d3, df * 8)#8
validity = tf.keras.layers.Conv2D(1, kernel_size=4, strides=1, padding='same')(d4)
return tf.keras.Model([img_A, img_B], validity)
```
我的tensorflow版本为2.3.0,运行上述代码时sess = tf.Session()这句报错module 'tensorflow' has no attribute 'Session',是什么原因?并给出改进后的完整详细代码
这是因为 TensorFlow 2.x 版本已经不再使用 `Session`,而是使用更加简便的 `eager execution`。因此,要在 TensorFlow 2.x 版本中实现上述功能,可以采用以下方式:
```python
import tensorflow as tf
import tensorflow_datasets as tfds
import numpy as np
# 加载数据集
dataset = tfds.load("cornell_movie_dialogs_corpus", split="train[:100]", as_supervised=True)
dataset = dataset.map(lambda x, y: (x, tf.strings.split(y, sep="|").to_tensor(default_value="<PAD>")))
# 构建词表
tokenizer = tfds.features.text.Tokenizer()
vocabulary_set = set()
for text_tensor, _ in dataset:
some_tokens = tokenizer.tokenize(text_tensor.numpy())
vocabulary_set.update(some_tokens)
vocab_size = len(vocabulary_set)
vocab = tf.keras.preprocessing.text.Tokenizer(vocab_size, oov_token="<OOV>")
vocab.fit_on_texts(vocabulary_set)
# 定义模型
model = tf.keras.Sequential([
tf.keras.layers.Embedding(vocab_size + 1, 64),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64)),
tf.keras.layers.Dense(64, activation="relu"),
tf.keras.layers.Dense(vocab_size + 1, activation="softmax")
])
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
# 训练模型
BATCH_SIZE = 32
BUFFER_SIZE = 10000
dataset = dataset.shuffle(BUFFER_SIZE).padded_batch(BATCH_SIZE)
model.fit(dataset, epochs=10)
# 测试模型
while True:
user_input = input("You: ")
user_input = tokenizer.tokenize(user_input)
user_input = vocab.texts_to_sequences(user_input)
user_input = tf.keras.preprocessing.sequence.pad_sequences(user_input, maxlen=20, padding="post")
prediction = model.predict(user_input)[0]
predicted_id = np.argmax(prediction)
response = vocab.sequences_to_texts([[predicted_id]])[0]
print("ChitGPT: ", response)
```
这里采用了 `tf.keras.preprocessing.text.Tokenizer` 来构建词表,并将数据集中的文本数据进行了处理,以便于后续模型的训练和测试。模型的定义采用了 `tf.keras.Sequential`,并使用了 `Bidirectional LSTM` 和 `Dense` 层。训练时将数据集进行了打乱和批处理,测试时则接收用户输入并输出模型的回复。