2017-06-13 7 views
0

Kerasの初心者にとってよくある問題と思われるエラーが発生しています。私はカラー画像を「何か」や「not_something」として分類し、基本的なモデルの実行を得ようとしているので、ハイパーパラメータを微調整して、すべてのことをよりよく理解するようにしています。Kerasを使用した密なエラー

なぜ誰かが私がモデルで具体的にエラーを起こしている理由を説明することができたら、私はそれを望んでいます。そして、私が気にするべきことを説明してください/ )。 2の2進分類子の場合にDense(単位)が1であるべきかどうかは分かりませんが、これも説明できますか?

エラー:

`` `

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

` ``

コード:

`` `

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

開始するには、Conv2DとDenseレイヤーの間に[Flatten](https://keras.io/layers/core/#flatten)レイヤーがありません。 'model.summary()'を使うと、テンソルがネットワークを伝播する際のテンソルの形状を追跡するのに役立ちます。 – dhinckley

+0

最後の高密度レイヤの形状を変更します。それは、softmax出力を返すことができるように、クラス数に等しい数のユニットを持つべきです – Nain

+0

ありがとう!何らかの理由で2つの畳み込みレイヤーがあることもわかりました。 – eeskonivich

答えて

0

単一のニューロンを持つ緻密層は、損失を使用する場合に適しています。 categorical_crossentropyの損失には、最終出力レイヤのカテゴリとして1ホットエンコーディングと同じ数のニューロンが必要です。 Keras loss documentationから:to_categorical関数を介し

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).

ワンホットエンコーディングはKeras MNIST MLP exampleに簡潔に示されています。

関連する問題