简体   繁体   English

尝试拟合模型时出错 - Tensorflow CNN

[英]Error when trying to fit model - Tensorflow CNN

I'm trying to create a CNN for image classification (Cats & Dogs).我正在尝试为图像分类(猫和狗)创建一个 CNN。 Everything was working fine untill the moment I used fit.在我使用 fit 之前,一切都运行良好。 Since I am a beginner I fear I haven't correctly created my sequential model.由于我是初学者,我担心我没有正确创建我的顺序模型。 I'm also not sure if my steps per epoch and validation steps are correct.我也不确定我每个时期的步骤和验证步骤是否正确。
I get the following error when I use history = model.fit:使用 history = model.fit 时出现以下错误:

2022-07-12 12:10:04.374122: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:185] None of the MLIR Optimization Passes are enabled (registered 2)
Epoch 1/15
2022-07-12 11:57:57.465865: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:185] None of the MLIR Optimization Passes are enabled (registered 2)>
2022-07-12 11:57:58.808025: I tensorflow/stream_executor/cuda/cuda_dnn.cc:369] Loaded cuDNN version 8201
2022-07-12 11:58:00.536214: W tensorflow/core/framework/op_kernel.cc:1680] Invalid argument: required broadcastable shapes
2022-07-12 11:58:00.536457: W tensorflow/core/framework/op_kernel.cc:1680] Invalid argument: required broadcastable shapes
2022-07-12 11:58:00.536536: W tensorflow/core/framework/op_kernel.cc:1680] Invalid argument: required broadcastable shapes
Traceback (most recent call last):
  File "C:\Users\myPC\PycharmProjects\pythonProject\catsdogs.py", line 75, in <module>
    history = model.fit(train_data_gen, epochs=epochs, validation_data=val_data_gen, steps_per_epoch=int(np.ceil(train_data_gen.n / float(batch_size))), validation_steps=int(np.ceil(val_data_gen.n / float(batch_size))))
  File "C:\Users\myPC\anaconda3\envs\tensorflow\lib\site-packages\keras\engine\training.py", line 1184, in fit
    tmp_logs = self.train_function(iterator)
  File "C:\Users\myPC\anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\eager\def_function.py", line 885, in __call__
    result = self._call(*args, **kwds)
  File "C:\Users\myPC\anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\eager\def_function.py", line 950, in _call
    return self._stateless_fn(*args, **kwds)
  File "C:\Users\myPC\anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\eager\function.py", line 3039, in __call__
    return graph_function._call_flat(
  File "C:\Users\myPC\anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\eager\function.py", line 1963, in _call_flat
    return self._build_call_outputs(self._inference_function.call(
  File "C:\Users\myPC\anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\eager\function.py", line 591, in call
    outputs = execute.execute(
  File "C:\Users\myPC\anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\eager\execute.py", line 59, in quick_execute
    tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
tensorflow.python.framework.errors_impl.InvalidArgumentError:  required broadcastable shapes
     [[node Equal (defined at \PycharmProjects\pythonProject\catsdogs.py:75) ]] [Op:__inference_train_function_733]

Function call stack:
train_function

2022-07-12 11:58:00.649539: W tensorflow/core/kernels/data/generator_dataset_op.cc:107] Error occurred when finalizing GeneratorDataset iterator: Failed precondition: Python interpreter state is not initialized. The process may be terminated.
     [[{{node PyFunc}}]]

Process finished with exit code 1>

This is the code I use(Tensorflow version is 2.6):这是我使用的代码(Tensorflow 版本是 2.6):

import tensorflow as tf
import keras

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPool2D
from tensorflow.keras.preprocessing.image import ImageDataGenerator

import os
import numpy as np
import matplotlib.pyplot as plt

# GET PROJECT FILES
PATH = 'cats_and_dogs'

train_dir = os.path.join(PATH, 'train')
validation_dir = os.path.join(PATH, 'validation')
test_dir = os.path.join(PATH, 'test')

# GET NUMBER OF FILES IN EACH DIRECTORY
total_train = sum([len(files) for r, d, files in os.walk(train_dir)])
total_val = sum([len(files) for r, d, files in os.walk(validation_dir)])
total_test = len(os.listdir(test_dir))

# VARIABLES FOR PRE-PROCESSING AND TRAINING.
batch_size = 128
epochs = 15
IMG_HEIGHT = 150
IMG_WIDTH = 150

# CREATE IMAGE DATA GENERATORS
train_image_generator = ImageDataGenerator(rotation_range=0.5, zoom_range=0.2, horizontal_flip=True, vertical_flip=True,
                                           rescale=1. / 255)
validation_image_generator = ImageDataGenerator(rescale=1. / 255)
test_image_generator = ImageDataGenerator(rescale=1. / 255)

train_data_gen = train_image_generator.flow_from_directory(directory=train_dir, target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                           class_mode='binary', batch_size=batch_size)
val_data_gen = validation_image_generator.flow_from_directory(directory=validation_dir,
                                                              target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                              class_mode='binary', batch_size=batch_size)
test_data_gen = test_image_generator.flow_from_directory(directory=test_dir, target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                         class_mode='binary', batch_size=batch_size,
                                                         shuffle=False)


# CREATE MODEL
model = Sequential(
    [
        Conv2D(32, (3, 3), input_shape=(IMG_WIDTH, IMG_HEIGHT, 3)),
        MaxPool2D((2, 2)),
        Dense(1, activation='relu')
    ]
)

model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3),
              loss=tf.keras.losses.BinaryCrossentropy(),
              metrics=['accuracy'])

model.summary()
history = model.fit(train_data_gen, epochs=epochs, validation_data=val_data_gen, steps_per_epoch=int(np.ceil(train_data_gen.n / float(batch_size))), validation_steps=int(np.ceil(val_data_gen.n / float(batch_size))))

I feel like required broadcastable shapes is the culprit but I might be wrong.我觉得required broadcastable shapes是罪魁祸首,但我可能错了。

After a bit of research, I finally made it work in pyCharm as well.经过一番研究,我终于让它在 pyCharm 中也能正常工作。 The problem was I hadn't used Flatten.问题是我没有使用 Flatten。 Here is the piece of my code that I changed.这是我更改的代码。 It works fine now.它现在工作正常。 I'm still not sure why it wouldn't give me an error in Colab though.我仍然不确定为什么它不会在 Colab 中给我一个错误。

model = Sequential(
    [
        keras.Input(shape=(IMG_WIDTH, IMG_HEIGHT, 3)),
        Conv2D(32, 3, padding='same', activation='relu'),
        MaxPooling2D(),
        Conv2D(64, 3, activation='relu'),
        MaxPooling2D(),
        Conv2D(128, 3, activation='relu'),
        Flatten(),
        Dense(64, activation='relu'),
        Dropout(0.5),
        Dense(1, activation='sigmoid')
    ]
)

model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=3e-4),
    loss=keras.losses.BinaryCrossentropy(),
    metrics=["accuracy"]
)

model.summary()
history = model.fit(train_data_gen, epochs=epochs, validation_data=val_data_gen, batch_size=batch_size, verbose=2)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在Tensorflow对象检测中尝试评估相关模型时出错 - Error when trying to evaluate pertained model in tensorflow object-detection 在 Tensorflow 中应用数据增强时,使用 fit_generator() 拟合 model 时出错 - Error when fitting the model using fit_generator() while applying data augmentation in Tensorflow 尝试拟合回归模型时出现ValueError - ValueError when trying to fit regression model 在使用Tensorflow训练CNN时如何解决&#39;OutOfRangeError:序列结束&#39;错误? - How to fix a 'OutOfRangeError: End of sequence' error when training a CNN with tensorflow? 使用tensorflow在CNN中出现尺寸错误 - an error with dimensions in CNN using tensorflow Tensorflow - model.fit 中的值错误 - 如何修复 - Tensorflow - Value Error in model.fit - How to fix Tensorflow-如教程中所述构建CNN模型 - Tensorflow - building a CNN model as described in the tutorial 如何使用 keras/tensorflow 构建无监督的 CNN 模型? - How to build an unsupervised CNN model with keras/tensorflow? Tensorflow model.fit ValueError - Tensorflow model.fit ValueError 尝试使用 tensorflow 运行教程 CNN 时出现 cuDNN_STATUS_ALLOC_FAILED - cuDNN_STATUS_ALLOC_FAILED when trying to run a tutorial CNN with tensorflow
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM