Серия керас и панд - PullRequest
       0

Серия керас и панд

0 голосов
/ 13 мая 2018

Я хочу построить эту базовую модель Keras:

from keras.models import Sequential
from keras.layers import Dense, Activation

model = Sequential()
model.add(Dense(100, input_dim=9, kernel_initializer='uniform', activation='tanh'))
model.add(Dense(2, kernel_initializer='uniform', activation='softmax'))
model.compile(loss='mse', optimizer='sgd', metrics=['accuracy'])

model.fit(
    data_train, label_train,
    validation_split=0.2,
    batch_size=batch_size, epochs=epoch, verbose=verbose)

Там для data_train я хотел использовать серию, которую я вынул из DataFrame:

import os
path = "Dataset/pic_train"   
cnt = 0 
df = pd.DataFrame(columns=["FileName", "PicData"])
dataArray = []

for file in os.listdir(path):

    fullFileStr= "{}/{}".format(path,file)

    data = readPic(fullFileStr).reshape(1,-1)[0] 
    """
        "readPic" reads a jpg file with PIL.Image and returns it as a nxm pixel numpy.ndarray.
        reshape(1,-1)[0] shall convert it into a 1 dimensional vector array.
        This shall be the input vector for the nn later.
    """

    dataArray.append(data)

    df.loc[cnt] = {"FileName" : file, "PicData" : data}
    cnt = cnt + 1


dataArray = np.array(dataArray)

СозданныйDataFrame выглядит следующим образом (упрощено с 2 картинками):

|FileName ||PicData |

|file1.jpg ||[70, 199, 61, 191, 214, 223, 255, 255, 255] |

|file2.jpg ||[188, 192, 188, 187, 73, 192, 183, 172, 189] |

(Содержимое PicData для тестирования составляет всего 9 пикселей. Обычно у меня около 256 пикселей (поэтомуИзображения размером 64x64). Теперь я хотел бы подать эти данные PicData в модель.

Поэтому, чтобы передать это в мою модель Keras, мне нужно снова использовать вектор numy, используя:

df.loc[:,"PicData"].values

ЧтоТеперь я ожидаю, что модель получит матрицу из (2,9) элементов. Таким образом, 2 изображения с 9 пикселями (в соответствии с примером сверху). Где каждый пиксель является особенностью ...

Однако формаэтого ndarray является массивом с формой (2,), а не (2, 9), как форма «dataArray».

У меня такое ощущение, что эта информация необходима, потому что, если я передам "df.loc [:, "PicData"]. values ​​"для моей модели Я получаю сообщение об ошибке:

ValueError: Ошибка при проверке ввода: ожидается, что плотность_3_входа имеет форму (9,), но получил массив сshape (1,)

И когда я передаю dataArray в модель, он работает (мой pНа данный момент для тестирования требуется всего 9 пикселей).

Так что здесь я не уверен, как лучше решить эту проблему.Может кто-нибудь дать мне обратную связь здесь?По сути, то, что возвращает DataFrame, не так, поэтому у меня есть ощущение, что мои входные векторы моего nn могут быть неправильно определены для этого типа вектора ....?

1 Ответ

0 голосов
/ 13 мая 2018

Вот ваш фрейм данных:

| FileName || PicData |
| file1.jpg || [70, 199, 61, 191, 214, 223, 255, 255, 255] |
| file2.jpg || [188, 192, 188, 187, 73, 192, 183, 172, 189] |

У вас есть n образцов и один столбец. Столбец содержит списки, которые содержат все данные пикселей из ваших изображений. Поэтому, когда вы ссылаетесь на значения df.loc [:, "PicData"].., Это только один столбец, поэтому ваш вывод будет n на 1 и список, а не на n на 9 массивов, как требует модель. Вы можете обойти это, сославшись на список и затем извлекая значения, но вы не захотите этого делать, как я объясню ниже. Чтобы решить эту проблему, вы должны поместить все свои данные в кадр данных pandas или массив numpy, где каждая строка является образцом и отдельным столбцом для всех данных пикселей.

| FileName || pixel1, pixel2, pixel3, ..., pixel9 |
| file1.jpg || 70, 199, 61, 191, 214, 223, 255, 255, 255 |
| file2.jpg || 188, 192, 188, 187, 73, 192, 183, 172, 189 | 

Есть несколько причин, по которым вы бы не хотели использовать подход списка. Во-первых, Keras требует в качестве входных данных массив numpy. Поэтому, если ваши данные представлены в виде списка, вам все равно придется преобразовать их в массив numpy, прежде чем загружать их в модель, что будет очень медленным, поскольку вам придется делать этот список по списку, строка за строкой , Вот исходный код от Keras для подгонки модели:

def fit(self, x, y, batch_size=32, epochs=10, verbose=1, callbacks=None,
        validation_split=0., validation_data=None, shuffle=True,
        class_weight=None, sample_weight=None, initial_epoch=0, **kwargs):
    """Trains the model for a fixed number of epochs.

    # Arguments
        x: input data, as a Numpy array or list of Numpy arrays
            (if the model has multiple inputs).
        y: labels, as a Numpy array.

Во-вторых, преимущество использования numpy в машинном обучении состоит в том, что numpy эффективно хранит данные для использования в операциях матричной алгебры. Списки не оптимизированы для этой цели, поэтому вы получите гораздо худшую производительность, если попытаетесь выполнить операции таким способом.

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

https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...