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])
` ``
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
Ä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
Danke! erkannte auch, dass ich aus irgendeinem Grund zwei Faltungsschichten hatte. – eeskonivich