Получение ошибки при обучении модели CNN(tensorflow)

#python #tensorflow #keras #deep-learning #conv-neural-network

Вопрос:

Я получаю ошибки при обучении своей модели CNN, которая предназначена для проверки того, что человек говорит на языке жестов. Я работаю с keras, tensorflow. Это мой код:

 import tensorflow as tf ;importing libraries from tensorflow.keras import datasets,layers,models import numpy as np import matplotlib.pyplot as plt from tensorflow.keras.preprocessing.image import ImageDataGenerator ; Data preprocessing train_datagen = ImageDataGenerator(rescale = 1./255,  shear_range = 0.2,  zoom_range = 0.2,  horizontal_flip = True) training_set = train_datagen.flow_from_directory('split__data/Train',  target_size = (64, 64),  batch_size = 32,  class_mode = 'categorical') test_datagen = ImageDataGenerator(rescale = 1./255) test_set = test_datagen.flow_from_directory('split__data/Test',  target_size = (64, 64),  batch_size = 32,  class_mode = 'categorical')  ; Building the model cnn = tf.keras.models.Sequential() cnn.add(tf.keras.layers.Conv2D(filters = 16,kernel_size = 3,activation = 'relu',input_shape = [64,64,3])) cnn.add(tf.keras.layers.MaxPool2D(pool_size=2,strides=2))  cnn.add(tf.keras.layers.Conv2D(filters = 32,kernel_size = 3,activation = 'relu',input_shape = [64,64,3])) cnn.add(tf.keras.layers.MaxPool2D(pool_size=2,strides=2))  cnn.add(tf.keras.layers.Conv2D(filters = 64,kernel_size = 3,activation = 'relu',input_shape = [64,64,3])) cnn.add(tf.keras.layers.MaxPool2D(pool_size=2,strides=2)) cnn.add(tf.keras.layers.Flatten()) cnn.add(tf.keras.layers.Dense(units=500,activation='relu')) cnn.add(tf.keras.layers.Dense(units=1,activation='softmax'))  ; compiling and training cnn.compile(optimizer = 'adam' , loss= 'categorical_crossentropy',metrics = ['accuracy']) ;the next line is giving me error cnn.fit(x = training_set,validation_data = test_set,batch_size = 32,epochs = 10)   

В этом и заключается ошибка. Я не могу понять, откуда возникают эти ошибки. Я пробовал изменять размер пакета, высоту и ширину изображения, но ничего не происходит. Я получаю ту же ошибку.

 --------------------------------------------------------------------------- InvalidArgumentError Traceback (most recent call last) lt;ipython-input-15-b67ba9813850gt; in lt;modulegt; ----gt; 1 cnn.fit(x = training_set,validation_data = test_set,batch_size = 32,epochs = 10)  C:ProgramDataAnaconda3libsite-packagestensorflowpythonkerasenginetraining.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)  1181 _r=1):  1182 callbacks.on_train_batch_begin(step) -gt; 1183 tmp_logs = self.train_function(iterator)  1184 if data_handler.should_sync:  1185 context.async_wait()  C:ProgramDataAnaconda3libsite-packagestensorflowpythoneagerdef_function.py in __call__(self, *args, **kwds)  887   888 with OptionalXlaContext(self._jit_compile): --gt; 889 result = self._call(*args, **kwds)  890   891 new_tracing_count = self.experimental_get_tracing_count()  C:ProgramDataAnaconda3libsite-packagestensorflowpythoneagerdef_function.py in _call(self, *args, **kwds)  948 # Lifting succeeded, so variables are initialized and we can run the  949 # stateless function. --gt; 950 return self._stateless_fn(*args, **kwds)  951 else:  952 _, _, _, filtered_flat_args =   C:ProgramDataAnaconda3libsite-packagestensorflowpythoneagerfunction.py in __call__(self, *args, **kwargs)  3021 (graph_function,  3022 filtered_flat_args) = self._maybe_define_function(args, kwargs) -gt; 3023 return graph_function._call_flat(  3024 filtered_flat_args, captured_inputs=graph_function.captured_inputs) # pylint: disable=protected-access  3025   C:ProgramDataAnaconda3libsite-packagestensorflowpythoneagerfunction.py in _call_flat(self, args, captured_inputs, cancellation_manager)  1958 and executing_eagerly):  1959 # No tape is watching; skip to running the function. -gt; 1960 return self._build_call_outputs(self._inference_function.call(  1961 ctx, args, cancellation_manager=cancellation_manager))  1962 forward_backward = self._select_forward_and_backward_functions(  C:ProgramDataAnaconda3libsite-packagestensorflowpythoneagerfunction.py in call(self, ctx, args, cancellation_manager)  589 with _InterpolateFunctionError(self):  590 if cancellation_manager is None: --gt; 591 outputs = execute.execute(  592 str(self.signature.name),  593 num_outputs=self._num_outputs,  C:ProgramDataAnaconda3libsite-packagestensorflowpythoneagerexecute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)  57 try:  58 ctx.ensure_initialized() ---gt; 59 tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,  60 inputs, attrs, num_outputs)  61 except core._NotOkStatusException as e:  InvalidArgumentError: In[0] mismatch In[1] shape: 35 vs. 1: [32,35] [500,1] 0 0  [[node gradient_tape/sequential/dense_1/MatMul (defined at lt;ipython-input-15-b67ba9813850gt;:1) ]] [Op:__inference_train_function_847]  Function call stack: train_function  

кто-нибудь может помочь?

Комментарии:

1. Как вы ожидаете, что каждый сверточный слой в модели будет иметь входную форму [64, 64,3] ?

Ответ №1:

Сколько классов содержится в наборе данных? У вас есть код

 cnn.add(tf.keras.layers.Dense(units=1,activation='softmax'))  

Это указывало бы на то, что вы выполняете двоичную классификацию, которая, как я ожидаю, не является тем, что вы хотите. Попробуйте сделать это после кода генератора

 classes=list(training_set.class_indices.keys()) class_count=len (classes) # this integer is the number of nodes you need in your models final layer  

измените последний слой в вашей модели на

 cnn.add(tf.keras.layers.Dense(units=class_count,activation='softmax'))  

Комментарии:

1. Спасибо @Gerry P. На самом деле я новичок, и я пытался преобразовать двоичную модель в категориальную модель, изменив код. Можете ли вы сказать мне, как получить прогноз для одного изображения. На самом деле, когда я пытаюсь это сделать, он выдает правильный вывод только для одного символа. Кроме того, если бы вы могли предложить хороший ресурс для построения модели CNN, это было бы здорово.

2. смотрите мой второй ответ

Ответ №2:

чтобы предсказать одно изображение — сначала прочитайте изображение. Если вы обучили свою модель на изображениях RGB, то

 import matplotlib.pyplot as plt import cv2 classes=list(train_gen.class_indices.keys()) img_path = r' full path to the image' img=plt.imread(img_path) img=cv2.resize(img, (64.64)) img=img/255 img=np.expand_dims(img, axis=0) prediction=model.predict( img, verbose=1) index=argmax(prediction) predicted_class = classes(index)  

Я не утруждаю себя созданием собственного CNN, вместо этого я использую обучение передаче с помощью модели EfficientNetB3. Примечание. EfficientNet ожидает пиксели в диапазоне от 0 до 255, поэтому не масштабируйте пиксели. Приведенный ниже код хорошо работает для большинства приложений

 base_model=tf.keras.applications.EfficientNetB3(include_top=False, weights="imagenet",input_shape=img_shape, pooling='max')  x=base_model.output x=keras.layers.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001 )(x) x = Dense(256, kernel_regularizer = regularizers.l2(l = 0.016),activity_regularizer=regularizers.l1(0.006),  bias_regularizer=regularizers.l1(0.006) ,activation='relu')(x) x=Dropout(rate=.45, seed=123)(x)  output=Dense(class_count, activation='softmax')(x) model=Model(inputs=base_model.input, outputs=output) model.compile(Adamax(learning_rate=.001), loss='categorical_crossentropy', metrics=['accuracy'])