2016-03-21 10 views
0

私はstackoverflowの同様の問題に対する他の答えをいくつか読んだことがありますが、この場合は何も助けにはなりません。私は539のRGB画像、寸法607×607×3のセットを有し、各画像は6つのクラスのうちの1つである。私はMNISTとCIFAR10のデータセットで成功しましたが、このデータセットのCNNを作成すると、同じクラスをすべて予測することによって、トレーニングが一定のままであるときに生成されるテストval_accが変わる可能性があります。CNN - すべての同じクラスを予測するモデル

from __future__ import absolute_import 
from __future__ import print_function 
import cPickle 
import gzip 
import numpy as np 
import theano 
import theano.tensor as T 
from keras.models import Sequential 
from keras.layers.core import Dense, Dropout, Activation, Flatten 
from keras.layers.convolutional import Convolution2D, MaxPooling2D, ZeroPadding2D 
from keras.datasets import mnist 
from keras.optimizers import SGD, RMSprop 
from keras.utils import np_utils, generic_utils 
from theano.tensor.nnet import conv 
from theano.tensor.nnet import softmax 
from theano.tensor import shared_randomstreams 
from theano.tensor.signal import downsample 
from theano.tensor.nnet import sigmoid 
from theano.tensor import tanh 
import pylab as pl 
import matplotlib.cm as cm 
import os, struct 
from array import array as pyarray 
from numpy import append, array, int8, uint8, zeros,genfromtxt, matrix 
from matplotlib.pyplot import imshow 
from sklearn.cross_validation import train_test_split 
from random import randint 
import cv2 

# Setting up the Data 
A=539; 
l = float(genfromtxt("/home/silo1/ad2512/Histo_6/L" + str(1) + ".csv",delimiter=',')) 
l1 = float(genfromtxt("/home/silo1/ad2512/Histo_6/L" + str(2) + ".csv",delimiter=',')) 
d = cv2.imread('/home/silo1/ad2512/Histo_6/SI1.jpg') 
d1 = cv2.imread('/home/silo1/ad2512/Histo_6/SI2.jpg') 
all_data=[d,d1] 
labels=[l,l1] 
for i in range(A-2): 
    if((i+3)>A): 
     break 
    l = float(genfromtxt("/home/silo1/ad2512/Histo_6/L" + str(i+3) + ".csv",delimiter=',')) 
    d = cv2.imread("/home/silo1/ad2512/Histo_6/SI" + str(i+3) + ".jpg") 
    all_data.append(d) 
    labels.append(l) 

s = np.shape(all_data)[1] 
all_data = np.asarray(all_data) 
all_data = all_data.astype('float32') 
all_data = all_data.reshape(A,3,s,s) 
labels = np.asarray(labels) 
labels = labels.astype('int') 
labels = np_utils.to_categorical(labels) 


# Building Model 
model = Sequential() 
model.add(Convolution2D(32,3,3,init='uniform',border_mode='full',input_shape=(3,s,s))) 
model.add(Activation('tanh')) 
model.add(Convolution2D(32, 3, 3)) 
model.add(Activation('tanh')) 
model.add(MaxPooling2D(pool_size=(3, 2))) 
model.add(Dropout(0.25)) 
model.add(Convolution2D(64, 3, 3, border_mode='full')) 
model.add(Activation('tanh')) 
model.add(Convolution2D(64, 3, 3)) 
model.add(Activation('tanh')) 
model.add(MaxPooling2D(pool_size=(3, 2))) 
model.add(Dropout(0.25)) 
model.add(Flatten()) 
model.add(Dense(500)) 
model.add(Activation('tanh')) 
model.add(Dropout(0.25)) 
model.add(Dense(500)) 
model.add(Activation('tanh')) 
model.add(Dropout(0.25)) 
model.add(Dense(6)) 
model.add(Activation('softmax')) 

model.compile(loss='categorical_crossentropy', optimizer="RMSprop") 
model.fit(all_data[0:200], labels[0:200], batch_size=10, nb_epoch=15,verbose=1,show_accuracy=True,validation_data=(all_data[400:539], labels[400:539])) 

そして、最初の9つのエポックのための出力::私は数を変更しようとしている

Epoch 1/15 
200/200 [==============================] - 73s - loss: 2.6849 - acc: 0.2500 - val_loss: 1.6781 - val_acc: 0.3957 
Epoch 2/15 
200/200 [==============================] - 73s - loss: 2.0138 - acc: 0.1800 - val_loss: 2.1653 - val_acc: 0.2518 
Epoch 3/15 
200/200 [==============================] - 73s - loss: 1.8683 - acc: 0.2600 - val_loss: 1.7330 - val_acc: 0.2518 
Epoch 4/15 
200/200 [==============================] - 73s - loss: 1.8136 - acc: 0.2200 - val_loss: 2.1307 - val_acc: 0.1871 
Epoch 5/15 
200/200 [==============================] - 73s - loss: 1.7284 - acc: 0.2600 - val_loss: 1.6952 - val_acc: 0.2518 
Epoch 6/15 
200/200 [==============================] - 73s - loss: 1.7373 - acc: 0.2900 - val_loss: 1.6020 - val_acc: 0.2518 
Epoch 7/15 
200/200 [==============================] - 73s - loss: 1.6809 - acc: 0.3050 - val_loss: 1.6524 - val_acc: 0.2518 
Epoch 8/15 
200/200 [==============================] - 73s - loss: 1.7306 - acc: 0.3350 - val_loss: 1.7867 - val_acc: 0.1871 
Epoch 9/15 
200/200 [==============================] - 73s - loss: 1.7803 - acc: 0.2400 - val_loss: 1.8107 - val_acc: 0.2518 

私は自分のコードと例CNNのほか、GPUの出力が含まれている下記の隠された層のノード、より複雑なモデルの作成、活性化関数の変更、私が考えることのできるすべて。私がこれを使ってCIFAR10データセットを実行していたら(最後のレイヤーをDense(6)ではなくDense(10)に変更した場合)、結果はうまくいきます - インポートするデータに問題があるかどうかはわかりませんが、np私のデータの.shape構造体は、CIFAR10データセットのnp.shape構造体とまったく同じです。

答えて

0

val_accは定数ではなく、前後にジャンプしています。学習を開始するまで、学習率を10倍にしてから10倍に戻してみてください。 RMSPropオブジェクトを作成し、文字列の代わりにオブジェクトを渡す必要があります。

+0

同じクラス間でどのようにジャンプしているかに注意してください。これは、すべてのクラスを予測する精度と比較して、すべてのクラスを予測する精度です。今すぐRMSPropオブジェクトを見てみると、はるかに低い学習率とまだ成功していないsgdを試してみた –

+0

1e-4、1e-5、1e-6で学習率で提案を実行しましたが、これは問題を修正していません。 –

関連する問題