英文:
I'm having a hard time while conguring a Keras/tensorflow model
问题
这是您提供的代码的翻译部分:
我尝试创建一个能够帮助我生成和修改视频的AI模型。之前我曾遇到一些错误,但我成功地绕过了它们。无论如何,现在我陷入了一个可怕且恼人的错误中,尝试解决它让我的头疼。我真的需要一些帮助,请**务必**帮我:
错误信息显示X样本(输入数组)的大小为16,Y样本(目标数组)的大小为32,这是完整的错误信息:
[![完整的错误信息](https://i.stack.imgur.com/7OzgN.png)](https://i.stack.imgur.com/7OzgN.png)
以下是我的**完整代码**:
```python
import os
import cv2
import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Dense, Reshape, BatchNormalization, Conv2DTranspose, Conv2D, LeakyReLU, Flatten
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import Adam
processed_data_folder = 'data/processed_data/'
model_folder = 'models/'
image_size = 64
batch_size = 16
epochs = 50
learning_rate = 0.0002
beta_1 = 0.5
# 构建生成器和判别器模型
# ...(生成器和判别器的代码)...
generator = build_generator()
discriminator = build_discriminator()
# 编译判别器
discriminator.compile(loss='binary_crossentropy', optimizer=Adam(lr=learning_rate, beta_1=beta_1), metrics=['accuracy'])
discriminator.trainable = False
gan = Sequential([generator, discriminator])
gan.compile(loss='binary_crossentropy', optimizer=Adam(lr=learning_rate, beta_1=beta_1))
# 处理训练数据
# ...(处理训练数据的代码)...
# 训练GAN模型
# ...(GAN模型的训练代码)...
# 保存生成器模型
generator.save(os.path.join(model_folder, 'video_generator.h5'))
您提到由于系统内存不足,将批处理大小从32减小到16。您还尝试了很多方法,包括将帧图像的大小从32调整为16,减小批处理大小从64到32再到16,以及限制帧数为1000帧等。
英文:
i'm trying to create this ai model that can help me to generate, modify videos. I've faced some error previously but i was able to bypass them. Anyway noww i'm stuck in a terrible, annoying error and my head hurt me while trying to solve it, i'm tired i readlly need some help please:
The error says that the sizes of X samples(input arrays) =16 and Y samples(target arrays) =32 are not equal, this is the full error:
and here is my full code :
import os
import cv2
import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Dense, Reshape, BatchNormalization, Conv2DTranspose, Conv2D, LeakyReLU, Flatten
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import Adam
processed_data_folder = 'data/processed_data/'
model_folder = 'models/'
image_size = 64
batch_size = 16
epochs = 50
learning_rate = 0.0002
beta_1 = 0.5
def build_generator():
model = Sequential()
model.add(Dense(4 * 4 * 512, input_shape=(100,)))
model.add(Reshape((4, 4, 512)))
model.add(BatchNormalization())
model.add(Conv2DTranspose(256, kernel_size=5, strides=2, padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2DTranspose(128, kernel_size=5, strides=2, padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2DTranspose(64, kernel_size=5, strides=2, padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2DTranspose(3, kernel_size=5, strides=2, padding='same', activation='tanh'))
return model
def build_discriminator():
model = Sequential()
model.add(Conv2D(64, kernel_size=5, strides=2, padding='same', input_shape=(image_size, image_size, 3)))
model.add(LeakyReLU(alpha=0.2))
model.add(Conv2D(128, kernel_size=5, strides=2, padding='same'))
model.add(LeakyReLU(alpha=0.2))
model.add(Conv2D(256, kernel_size=5, strides=2, padding='same'))
model.add(LeakyReLU(alpha=0.2))
model.add(Conv2D(512, kernel_size=5, strides=2, padding='same'))
model.add(LeakyReLU(alpha=0.2))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
return model
generator = build_generator()
discriminator = build_discriminator()
discriminator.compile(loss='binary_crossentropy', optimizer=Adam(lr=learning_rate, beta_1=beta_1), metrics=['accuracy'])
discriminator.trainable = False
gan = Sequential([generator, discriminator])
gan.compile(loss='binary_crossentropy', optimizer=Adam(lr=learning_rate, beta_1=beta_1))
X_train = []
for video_folder in os.listdir(processed_data_folder):
frames_folder = os.path.join(processed_data_folder, video_folder, 'frames')
frames = []
for frame_file in os.listdir(frames_folder):
frame_path = os.path.join(frames_folder, frame_file)
frame = cv2.imread(frame_path)
frame = cv2.resize(frame, (image_size, image_size))
frames.append(frame)
X_train.append(frames)
X_train = np.array(X_train)
X_train = np.reshape(X_train, (-1, image_size, image_size, 3))
print(X_train.shape)
X_train = X_train / 127.5 - 1.
def generate_noise(batch_size, noise_shape):
return np.random.normal(0, 1, size=(batch_size, noise_shape))
for epoch in range(epochs):
noise = generate_noise(batch_size, 100)
generated_images = generator.predict(noise)
idx = np.random.randint(0, X_train.shape[0], batch_size)
real_images = X_train[idx]
real_labels = np.ones((batch_size, 1))
fake_labels = np.zeros((batch_size, 1))
d_loss_real = discriminator.train_on_batch(real_images, real_labels)
d_loss_fake = discriminator.train_on_batch(generated_images, fake_labels)
X = np.concatenate([real_images, generated_images])
y = np.concatenate([real_labels, fake_labels])
g_loss = gan.train_on_batch(noise, y)
print(f"Epoch {epoch+1}/{epochs} [D real loss: {d_loss_real[0]:.4f}, D fake loss: {d_loss_fake[0]:.4f}, G loss: {g_loss:.4f}]")
discriminator.trainable = True
generator_history = generator.fit(X_train, np.ones((X_train.shape[0], 1)), batch_size=batch_size, epochs=10, shuffle=True)
discriminator_history = discriminator.fit(X_train, y_train, batch_size=batch_size, epochs=10, shuffle=True)
generator.save(os.path.join(model_folder, 'video_generator.h5'))
The batch size was 32 and i had to reduce because of some lack in my system memory.
Basically i tried everything, from resizing the frame images to 32 then to 16, reducing the batch size from 64 to 32 to 16. limited the frames to 1000 frame.... alot of methods and updtes...i am not able to remember.
答案1
得分: 2
根据 @m13op22 提到的,问题出在 g_loss = gan.train_on_batch(noise, y)
。应该改成这样吗?:
g_loss = gan.train_on_batch(X, y)
英文:
As mentioned by @m13op22, the problem comes from g_loss = gan.train_on_batch(noise, y)
. Should it be this instead?:
g_loss = gan.train_on_batch(X, y)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论