2016-09-30 3 views
-1

Я довольно новичок в обучении машинам, поэтому я играю с примерами и т. Д. Размер изображения, указанный в коде, равен (28,28) Но по какой-то причине я продолжаю получать тот же ValueError Я не могу понять, почему это происходит.ValueError: Фильтр не должен быть больше, чем вход

Вот код:

import pandas as pd 
import numpy as np 
np.random.seed(1337) # for reproducibility 

from keras.models import Sequential 
from keras.layers.core import Dense, Dropout, Activation, Flatten 
from keras.layers.convolutional import Convolution2D, MaxPooling2D 
from keras.utils import np_utils 

# input image dimensions 
img_rows, img_cols = 28, 28 

batch_size = 128 # Number of images used in each optimization step 
nb_classes = 10 # One class per digit 
nb_epoch = 35 # Number of times the whole data is used to learn 

# Read the train and test datasets 
train = pd.read_csv("../input/train.csv").values 
test = pd.read_csv("../input/test.csv").values 

# Reshape the data to be used by a Theano CNN. Shape is 
# (nb_of_samples, nb_of_color_channels, img_width, img_heigh) 
X_train = train[:, 1:].reshape(train.shape[0], 1, img_rows, img_cols) 
X_test = test.reshape(test.shape[0], 1, img_rows, img_cols) 
y_train = train[:, 0] # First data is label (already removed from X_train) 

# Make the value floats in [0;1] instead of int in [0;255] 
X_train = X_train.astype('float32') 
X_test = X_test.astype('float32') 
X_train /= 255 
X_test /= 255 

# convert class vectors to binary class matrices (ie one-hot vectors) 
Y_train = np_utils.to_categorical(y_train, nb_classes) 

#Display the shapes to check if everything's ok 
print('X_train shape:', X_train.shape) 
print('Y_train shape:', Y_train.shape) 
print('X_test shape:', X_test.shape) 

model = Sequential() 
# For an explanation on conv layers see http://cs231n.github.io/convolutional-networks/#conv 
# By default the stride/subsample is 1 
# border_mode "valid" means no zero-padding. 
# If you want zero-padding add a ZeroPadding layer or, if stride is 1 use border_mode="same" 
model.add(Convolution2D(12, 5, 5, border_mode='valid',input_shape=(1,img_rows, img_cols))) 
model.add(Activation('relu')) 

# For an explanation on pooling layers see http://cs231n.github.io/convolutional-networks/#pool 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Dropout(0.15)) 

model.add(Convolution2D(24, 5, 5)) 
model.add(Activation('relu')) 

model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Dropout(0.15)) 

# Flatten the 3D output to 1D tensor for a fully connected layer to accept the input 
model.add(Flatten()) 
model.add(Dense(180)) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(100)) 
model.add(Activation('relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(nb_classes)) #Last layer with one output per class 
model.add(Activation('softmax')) #We want a score simlar to a probability for each class 

# The function to optimize is the cross entropy between the true label and the output (softmax) of the model 
# We will use adadelta to do the gradient descent see http://cs231n.github.io/neural-networks-3/#ada 
model.compile(loss='categorical_crossentropy', optimizer='adadelta', metrics=["accuracy"]) 

# Make the model learn 
model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch, verbose=1) 

# Predict the label for X_test 
yPred = model.predict_classes(X_test) 

# Save prediction in file for Kaggle submission 
np.savetxt('mnist-pred.csv', np.c_[range(1,len(yPred)+1),yPred], delimiter=',', header = 'ImageId,Label', comments = '', fmt='%d') 
+0

Можете выложить трассировку ошибки? – hashcode55

+0

Я бы спросил, используете ли вы тензор или анано. У меня была аналогичная ошибка с консервным примером, и я исправил ее, изменив input_shape = (1, img_rows, img_cols) на input_shape = (img_rows, img_cols, 1) в нескольких местах. – user1269942

ответ

1

Так что проблема с размерами свертки используются. Операции свертки обычно уменьшить размер изображения. Аналогично - каждая операция объединения уменьшает размер. У вас очень маленькие изображения, но при этом применена модельная архитектура, которая была разработана для более крупных, поэтому в какой-то момент после одной из сверток/пулов на самом деле у вас на изображении меньше изображения, чем у следующего размера фильтра, и это плохо определенная операция.

Чтобы временно устранить проблему - удалите слои второй свертки и максимума, поскольку эти операции (с предоставленными параметрами) не могут выполняться на таких небольших данных. В общем, вы должны сначала понять, как работает свертка, а не применять какую-либо модель elses, поскольку параметры имеют решающее значение для хорошей производительности - если вы применяете преобразования, которые значительно уменьшают разрешение, вы не сможете ничего узнать. Таким образом, как только у вас есть какая-то интуиция, как работает свертка, вы можете вернуться назад и попробовать разные архитектуры, но нет никакого «магического» уравнения для определения архитектуры, поэтому я не могу предоставить вам параметры, которые будут «просто работать» - начните с удалив эту дополнительную свертку и объединение, а затем вернитесь и попробуйте другие возможности, если у вас есть лучшее понимание ваших данных и модели.

+0

Хорошо, поэтому я попробовал программу после удаления уровней maxpooling и convolution, и программа успешно выполнена, когда я удалил maxpooling! Что делает maxpooling? – user3430238

+1

Он перемещает окно через изображение и принимает максимальное значение из окна. Эффективно уменьшает разрешение изображения, придавая некоторую инвариантность малым переводам при обработке изображения. – lejlot

+1

Но дело в том, что проблема вторая. Это уменьшило разрешение настолько, что ваше изображение теперь меньше 5x5 пикселей. Именно поэтому максимальное объединение в 5x5 окон завершилось неудачно. Другими словами, удаление всего пула скорее маскирует проблему, чем устраняет ее – lejlot

Смежные вопросы