Краткое описание модели Keras - PullRequest
0 голосов
/ 02 мая 2020

Я выполняю увеличение данных с использованием

data_gen=image.ImageDataGenerator(rotation_range=20,width_shift_range=0.2,height_shift_range=0.2,
                                  zoom_range=0.15,horizontal_flip=False)

iter=data_gen.flow(X_train,Y_train,batch_size=64)

data_gen.flow(), требуется матрица данных ранга 4, поэтому форма X_train имеет значение (60000, 28, 28, 1). Нам нужно передать ту же форму, то есть (60000, 28, 28, 1) при определении архитектуры модели следующим образом:

model=Sequential()
model.add(Dense(units=64,activation='relu',kernel_initializer='he_normal',input_shape=(28,28,1)))
model.add(Flatten())    
model.add(Dense(units=10,activation='relu',kernel_initializer='he_normal'))
model.summary()

model.add(Flatten()) был использован для решения проблемы ранга 2. Теперь проблема с model.summary(). Это дает неправильный вывод, как показано ниже;

Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 28, 28, 64)        128       
_________________________________________________________________
flatten_1 (Flatten)          (None, 50176)             0         
_________________________________________________________________
dense_2 (Dense)              (None, 10)                501770    
=================================================================
Total params: 501,898
Trainable params: 501,898
Non-trainable params: 0

Output Shape для dense_1 (Dense) должно быть (None,64), а Param # должно быть (28*28*64)+64, то есть 50240. Output Shape для dense_2 (Dense) является правильным, но Param # должно быть (64*10)+10, то есть 650.

Почему это происходит и как можно решить эту проблему?

1 Ответ

2 голосов
/ 02 мая 2020

Резюме не является неправильным. Слой keras Dense всегда работает с последним измерением ввода.

ref: https://www.tensorflow.org/api_docs/python/tf/keras/layers/Dense

Форма ввода:

Тензор ND с формой: (batch_size, ..., input_dim). Наиболее распространенной ситуацией будет> 2D-ввод с формой (batch_size, input_dim). Форма вывода:

Тензор ND с формой: (batch_size, ..., unit). Например, для двумерного ввода с формой (batch_size, input_dim) выходные данные будут иметь форму (batch_size, единицы).

Перед каждым плотным слоем необходимо вручную применить Flatten(), чтобы сделать уверен, что вы передаете 2-ые данные.

Один обходной путь для вашего желаемого output_shape:

model=Sequential()
model.add(Dense(units=1,activation='linear', use_bias = False, trainable = False, kernel_initializer=tf.keras.initializers.Ones(),input_shape=(28,28,1)))
model.add(Flatten())
model.add(Dense(units=64,activation='relu'))    
model.add(Dense(units=10,activation='relu',kernel_initializer='he_normal'))
model.summary()

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

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 28, 28, 1)         2         
_________________________________________________________________
flatten (Flatten)            (None, 784)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 64)                50240     
_________________________________________________________________
dense_2 (Dense)              (None, 10)                650       
=================================================================
Total params: 50,892
Trainable params: 50,892
Non-trainable params: 0
...