Что определяет входной размер плотного слоя в конце CNN - PullRequest
3 голосов
/ 09 июля 2019

Я следую Учебник CNN в аналитике Vidhya.

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

import os
import numpy as np
import pandas as pd
import scipy
import sklearn
import keras
from keras.models import Sequential
import cv2
from skimage import io
%matplotlib inline

#Defining the File Path

cat=os.listdir("/mnt/hdd/datasets/dogs_cats/train/cat")
dog=os.listdir("/mnt/hdd/datasets/dogs_cats/train/dog")
filepath="/mnt/hdd/datasets/dogs_cats/train/cat/"
filepath2="/mnt/hdd/datasets/dogs_cats/train/dog/"

#Loading the Images

images=[]
label = []
for i in cat:
    image = scipy.misc.imread(filepath+i)
    images.append(image)
    label.append(0) #for cat images

for i in dog:
    image = scipy.misc.imread(filepath2+i)
    images.append(image)
    label.append(1) #for dog images

#resizing all the images

for i in range(0,23000):
    images[i]=cv2.resize(images[i],(300,300))

#converting images to arrays

images=np.array(images)
label=np.array(label)

# Defining the hyperparameters

filters=10
filtersize=(5,5)

epochs =5
batchsize=128

input_shape=(300,300,3)

#Converting the target variable to the required size

from keras.utils.np_utils import to_categorical
label = to_categorical(label)

#Defining the model

model = Sequential()

model.add(keras.layers.InputLayer(input_shape=input_shape))

model.add(keras.layers.convolutional.Conv2D(filters, filtersize, strides=(1, 1), padding='valid', data_format="channels_last", activation='relu'))
model.add(keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(keras.layers.Flatten())

model.add(keras.layers.Dense(units=2, input_dim=50,activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(images, label, epochs=epochs, batch_size=batchsize,validation_split=0.3)

model.summary()

1 Ответ

1 голос
/ 10 июля 2019

Однако, что определяет входные размеры?Мы также можем опустить этот параметр, и в этом случае будет меньше весов для этого плотного слоя?

Он определяется формой вывода предыдущего слоя.Как видно из model.summary(), выходная форма из слоя Flatten имеет вид (Нет, 219040), поэтому входные размеры для плотного слоя - 219040. Таким образом, в этом случае для тренировки требуется больше весов (> 50).

_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
conv2d_1 (Conv2D)            (None, 296, 296, 10)      760
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 148, 148, 10)      0
_________________________________________________________________
flatten_1 (Flatten)          (None, 219040)            0
_________________________________________________________________
dense_1 (Dense)              (None, 2)                 438082
=================================================================
Total params: 438,842
Trainable params: 438,842
Non-trainable params: 0
_________________________________________________________________

Как видно из фрагмента кода ниже, веса для плотного слоя создаются на основе параметра input_shape (который является output_shape предыдущего слоя).input_dim, переданный пользователем при создании слоя Dense, игнорируется.

input_dim = input_shape[-1]
self.kernel = self.add_weight(shape=(input_dim, self.units),

https://github.com/keras-team/keras/blob/3bda5520b787f84f687bb116c460f3aedada039b/keras/layers/core.py#L891

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