2017-06-13 6 views
0

Ich bekomme einen Fehler, der für Anfänger in Keras ein allgemeines Problem scheint. Ich versuche, ein Farbbild als "etwas" oder "nicht_etwas" zu klassifizieren und grundlegende Modelle laufen zu lassen, damit ich die Hyperparameter optimieren kann, um ein besseres Verständnis dessen zu bekommen, was sie alle tun.Dichter Fehler mit Keras

Ich möchte es, wenn jemand erklären könnte, warum ich meinen Fehler speziell in der model.fit bekomme und dann erkläre, was ich im allgemeinen Sinn der Dimensionalität vor der Hand (in Zug und Testsätzen) beachten soll). Ich bin mir nicht sicher, ob die Dichte (Einheiten) 1 im Fall eines binären Klassifikators von 2 sein sollte. Könnten Sie das auch erklären?

Fehler:

`` `

ValueError: Error when checking target: expected dense_18 to have 4 dimensions, but got array with shape (584, 1) 

` ``

Code:

`` `

from identify_mounds import * 
from PIL import Image 
import numpy as np 
np.random.seed(6) 
import os 
import subprocess 
from collections import defaultdict 
import pickle 
from scipy.misc import imread 
from sklearn.model_selection import train_test_split 
from keras.models import Sequential 
from keras.layers import Dense, Dropout, Activation, Flatten 
from keras.layers import Convolution2D, MaxPooling2D 
from keras.utils import np_utils 


def train_nomound_mound(dic): 
    X = [] 
    y = [] 
    X_ = [] 

    for im in dic: 
     X.extend(dic[im]['img_lst']) 
     y.extend(dic[im]['label']) 

    for im in X: 
     arr = imread(im) 
     X_.append(arr) 

    X_ = (np.array(X_).reshape(779, 4, 16, 16)/255).astype('float32') 
    y = np.array(y).astype('float32') 

    X_train, X_test, y_train, y_test = train_test_split(X_, y, stratify = y) 

    #Demensions: X_train: (584, 4, 16, 16), y_train: (584,), X_test: (195, 4, 16, 16), y_test: (195,) 

    model = Sequential() 

    batch_size = 128 
    nb_epoch = 12 

    nb_filters = 32 
    kernel_size = (3, 3) 
    input_shape = (4, 16, 16) 
    pool_size = (2, 2) 

    model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1], activation='relu', input_shape=input_shape)) 
    model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1], activation='relu')) 
    # model.add(MaxPooling2D(pool_size=pool_size)) 
    model.add(Dropout(0.25)) 


    model.add(Dense(32, activation='relu')) 
    model.add(Dropout(.50)) 
    model.add(Dense(1, activation='relu')) 

    model.compile(loss = 'categorical_crossentropy', optimizer='Adadelta', metrics=['accuracy']) 

    model.fit(X_train, y_train, batch_size=batch_size, nb_epoch=nb_epoch, verbose=1, validation_data=(X_test, y_test)) 
    score = model.evaluate(X_test, y_test, verbose=0) 
    print('Test score:', score[0]) 
    print('Test accuracy:', score[1]) 

` ``

+0

Zum Anfang fehlt eine Ebene [Flatten] (https://keras.io/layers/core/#flatten) zwischen Ihren Ebenen Conv2D und Dense. Die Verwendung von 'model.summary()' ist eine hilfreiche Methode, um die Form der Tensoren zu verfolgen, während sie sich durch Ihr Netzwerk ausbreiten. – dhinckley

+0

Ändern Sie die Form Ihrer letzten dichten Schicht. Es sollte die Anzahl der Einheiten gleich der Anzahl der Klassen haben, so dass es den Softmax-Ausgang zurückgeben kann – Nain

+0

Danke! erkannte auch, dass ich aus irgendeinem Grund zwei Faltungsschichten hatte. – eeskonivich

Antwort

0

Eine dichte Schicht mit einem einzelnen Neuron ist geeignet, wenn der Verlust binary_crossentropy verwendet wird. Der Verlust categorical_crossentropy erfordert eine Hotcodierung und die gleiche Anzahl von Neuronen wie Kategorien in der endgültigen Ausgabeschicht. Von der Keras loss documentation:

Note: when using the categorical_crossentropy loss, your targets should be in categorical format (e.g. if you have 10 classes, the target for each sample should be a 10-dimensional vector that is all-zeros expect for a 1 at the index corresponding to the class of the sample).

One-hot-Codierung über die to_categorical Funktion wird kurz MNIST MLP example im Keras dargestellt.