Ошибка подгонки модели в модели Conv Net : Ошибка значения

#python #keras #conv-neural-network

Вопрос:

Я пытаюсь построить модель CNN для набора данных, который выглядит примерно так: Он содержит 11 столбцов функций и столбец меток, который равен либо 0, либо 1.

Программа:

 import numpy as np
from sklearn.model_selection import train_test_split
import tensorflow.keras as keras
import matplotlib.pyplot as plt
import pandas as pd

DATA_PATH = "testt.csv"


def load_data(data_path):
    """Loads training dataset from json file.

        :param data_path (str): Path to json file containing data
        :return X (ndarray): Inputs
        :return y (ndarray): Targets
    """

    
    data = pd.read_csv(DATA_PATH)
    
    y = np.array(data["Label"])
    X = np.array(data.drop(labels = ["Label"],axis = 1) )
    
    return X, y



def prepare_datasets(test_size, validation_size):
    """Loads data and splits it into train, validation and test sets.

    :param test_size (float): Value in [0, 1] indicating percentage of data set to allocate to test split
    :param validation_size (float): Value in [0, 1] indicating percentage of train set to allocate to validation split

    :return X_train (ndarray): Input training set
    :return X_validation (ndarray): Input validation set
    :return X_test (ndarray): Input test set
    :return y_train (ndarray): Target training set
    :return y_validation (ndarray): Target validation set
    :return y_test (ndarray): Target test set
    """

    # load data
    X, y = load_data(DATA_PATH)

    # create train, validation and test split
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size)
    X_train, X_validation, y_train, y_validation = train_test_split(X_train, y_train, test_size=validation_size)

    # add an axis to input sets
    X_train = X_train[..., np.newaxis]
    X_validation = X_validation[..., np.newaxis]
    X_test = X_test[..., np.newaxis]

    return X_train, X_validation, X_test, y_train, y_validation, y_test


def build_model(input_shape):
    """Generates CNN model

    :param input_shape (tuple): Shape of input set
    :return model: CNN model
    """

    # build network topology
    model = keras.Sequential()

    # 1st conv layer
    model.add(keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=input_shape))
    model.add(keras.layers.MaxPooling2D((3, 3), strides=(2, 2), padding='same'))
    model.add(keras.layers.BatchNormalization())

    # 2nd conv layer
    model.add(keras.layers.Conv2D(32, (3, 3), activation='relu'))
    model.add(keras.layers.MaxPooling2D((3, 3), strides=(2, 2), padding='same'))
    model.add(keras.layers.BatchNormalization())

    # 3rd conv layer
    model.add(keras.layers.Conv2D(32, (2, 2), activation='relu'))
    model.add(keras.layers.MaxPooling2D((2, 2), strides=(2, 2), padding='same'))
    model.add(keras.layers.BatchNormalization())

    # flatten output and feed it into dense layer
    model.add(keras.layers.Flatten())
    model.add(keras.layers.Dense(64, activation='relu'))
    model.add(keras.layers.Dropout(0.3))

    # output layer
    model.add(keras.layers.Dense(10, activation='softmax'))

    return model




if __name__ == "__main__":

    # get train, validation, test splits
    X_train, X_validation, X_test, y_train, y_validation, y_test = prepare_datasets(0.25, 0.2)

    # create network
    input_shape = (X_train.shape[1], X_train.shape[2], 1)
    model = build_model(input_shape)

    # compile model
    optimiser = keras.optimizers.Adam(learning_rate=0.0001)
    model.compile(optimizer=optimiser,
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])

    model.summary()

    # train model
    history = model.fit(X_train, y_train, validation_data=(X_validation, y_validation), batch_size=32, epochs=30)

   

 

Я получаю эту ошибку, когда пытаюсь запустить это:

Обратная трассировка InvalidArgumentError (последний последний вызов) /usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/ops.py в _create_c_op(график, node_def, входные данные, control_inputs, op_def) 1852 попробуйте: -> 1853 c_op = pywrap_tf_session.TF_FinishOperation(op_desc) 1854, за исключением ошибок.Недействительный аргумент в качестве e:

InvalidArgumentError: Отрицательный размер измерения, вызванный вычитанием 3 из 1 для ‘{{узел conv2d/Conv2D}} = Conv2D[T=DT_FLOAT, data_format=»NHWC», расширения=[1, 1, 1, 1], explicit_paddings=[], заполнение=»ДОПУСТИМО», шаги=[1, 1, 1, 1], use_cudnn_on_gpu=true](Заполнитель, conv2d/Conv2D/ReadVariableOp)’ с входными фигурами: [?,11,1,1], [3,3,1,32].

Во время обработки вышеуказанного исключения произошло еще одно исключение:

Обратная трассировка ошибки значения (последний последний вызов) 18 кадров /usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/ops.py в _create_c_op(график, node_def, входные данные, control_inputs, op_def) 1854, за исключением ошибок.Недопустимый параметр, указанный как e: 1855 #, Преобразуется в значение ошибки для обратной совместимости. -> 1856 ошибка повышения значения(str(e)) 1857 1858 возврат c_op

Ошибка значения: Отрицательный размер измерения, вызванный вычитанием 3 из 1 для ‘{{узел conv2d/Conv2D}} = Conv2D[T=DT_FLOAT, data_format=»NHWC», расширения=[1, 1, 1, 1], explicit_paddings=[], заполнение=»ДОПУСТИМО», шаги=[1, 1, 1, 1], use_cudnn_on_gpu=true](Заполнитель, conv2d/Conv2D/ReadVariableOp)’ с входными фигурами: [?,11,1,1], [3,3,1,32].

Ответ №1:

Для уточнения, каждое данное имеет признаки размера [11] и метку размера [1]. Таким образом,ваш общий набор данных имеет размерность X = [n_ примеров,11] и Y = [n_ примеров, 1].

Conv2D это не та операция, которую следует использовать в данном случае. Conv2D ожидает набор входных данных 2D-векторной плоскости (т. е. Ожидаемый размер данных [n_ примеров,n_feature_planes,ширина,высота]). Он обычно используется на изображениях RGB, где каждый цвет представляет измерение вдоль n_feature_planes.

Если вы ожидаете, что ваш вектор данных размера [11] для каждого примера будет пространственно связан (например, вектор звука 1D будет пространственно связан), вы можете использовать Conv1D в этом случае ввод размера [n_examples,n_feature_vectors, length_of_feature_vector] (где length_of_feature_vector в этом случае равен 11. Таким образом, вы бы расширили свои данные с размера [n_ примеров,11] до размера [n_ примеров,1,11], а затем могли бы использовать Conv1D .

Однако, если ваши объекты не связаны пространственно (например, являются различными атрибутами), вам не следует использовать сверточные слои.