Несовместимые формы с Keras Transpose Convolution - PullRequest
0 голосов
/ 21 июня 2020
# Importing the required Keras modules containing model and layers
from keras.models import Sequential
from keras.layers import Dense, Conv2D, Dropout, Flatten, MaxPooling2D,Conv2DTranspose
from keras.utils.vis_utils import plot_model

# Creating a Sequential Model and adding the layers
model = Sequential()
#63 kernels - Conv of 3X3
model.add(Conv2D(63, kernel_size=(3,3), input_shape=input_shape)) 
#Then pooling of 2X2 
model.add(MaxPooling2D(pool_size=(2, 2)))
# Flattening the 2D arrays for fully connected layers
model.add(Flatten()) 
model.add(Dense(1000, activation=tf.nn.relu))
model.add(Dropout(0.2))  #Combat Overfitting, drop random elements
#Softmax layer must have neurons = range of labels, 0-9 for this case
model.add(Dense(5,activation=tf.nn.softmax))   

#Visualize Network Architecture
plot_model(model, to_file='model_plot.png', show_shapes=True, show_layer_names=True)
    model.compile(optimizer='adam', 
                  loss='sparse_categorical_crossentropy', 
                  metrics=['accuracy'])
    model.fit(x=x_train,y=y_train, epochs=1)

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

InvalidArgumentError: получено значение метки 9, которое находится за пределами допустимого диапазона [0, 5).

У меня есть ярлыки 0,1,2,3,9. Всего 5 меток, поэтому в моем последнем слое был введен результат 5

model.add(Dense(5,activation=tf.nn.softmax))  

Однако система, похоже, распознает только диапазон 0,1,2,3,9 - диапазон в пределах 10. Как я могу внести изменения в коды, чтобы он мог выводить как 5, вместо того, чтобы менять его на 10.

1 Ответ

0 голосов
/ 22 июня 2020

Это сеть, которую вы ищете.

from keras.models import Sequential
from keras.layers import Dense, Conv2D, Dropout, Flatten, MaxPooling2D,Conv2DTranspose, UpSampling2D
from keras.utils.vis_utils import plot_model

# Creating a Sequential Model and adding the layers

input_shape = (28,28,1)

model = Sequential()
#63 kernels - Conv of 3X3
model.add(Conv2D(63, kernel_size=(3,3), padding='same', input_shape=input_shape)) 
#Then pooling of 2X2
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Dropout(0.2))


model.add(Conv2DTranspose(63, (3, 3), padding='same'))
model.add(Conv2D(1, (3,3), padding='same'))
model.add(UpSampling2D((2,2)))
model.compile(optimizer='adam', 
              loss='binary_crossentropy', 
              metrics=['accuracy'])

model.summary()
import numpy as np
x_train = np.random.randn(10,28,28,1)
y_train = np.random.randn(10,28,28,1)
model.fit(x=x_train,y=y_train, epochs=1)
  1. Прежде всего, на последнем уровне Conv вы должны убедиться, что количество фильтров = количество каналов в mnist.

  2. Если вы использовали MaxPooling2D, вам необходимо применить UpSampling2D для масштабирования карт функций, чтобы получить исходную форму.

Всегда, Просмотр файла model.summary помогает лучше понять форму промежуточной карты объектов.

Model: "sequential_6"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_8 (Conv2D)            (None, 28, 28, 63)        630       
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 14, 14, 63)        0         
_________________________________________________________________
dropout_5 (Dropout)          (None, 14, 14, 63)        0         
_________________________________________________________________
conv2d_transpose_5 (Conv2DTr (None, 14, 14, 63)        35784     
_________________________________________________________________
conv2d_9 (Conv2D)            (None, 14, 14, 1)         568       
_________________________________________________________________
up_sampling2d_3 (UpSampling2 (None, 28, 28, 1)         0         
=================================================================
Total params: 36,982
Trainable params: 36,982
Non-trainable params: 0
...