ウォーカーasは予備訓練モデルvg 16を使って分類し、損失と正確さは変わらない。
問題のkersは予備訓練モデルvg 16を使って分類し、損失と正確さは変わらない。
詳細:kersを使って二つのタイプのデータを訓練して、正負の割合は1:3で、vgg 16の後にいくつかのフルリンクを追加して初期化しました。そして、すべての層にトレーニングを許可します。
でも精度はずっと0.75です。
データの前処理はフォーマットが正しいことを確認しました。
モデルの中のreluをsigmoidに変更すれば正常です。
データ処理プログラム
val_lossが変わらない理由
前に、kersでLSTMモデルを作成して、写真の分類をしました。自分でテストセットとトレーニングセットを分けましたが、結果は各epochトレーニングの正確性が変わりませんでした。
探索する
私はずっと私のデータの読み取り方法が間違っていると思っていましたが、この点からずっと着手しています。
1.データセットサンプルの各カテゴリの数の差が大きい
このような状況がないなら、第二点を見てください。
2.トレーニングセットとデータセットは手動で区分され、コード自動分割に変更されます。
コードは以下の通りです
X_トレイtest,Y_トレイtest=train_test_スプリット(data、labels、test_)size=0.4、ラドム_state=42)`
上記の方法はいくつかのepochを多く設置し、忍耐強く待つ必要があります。もしまだテストの正確性が変わらないなら、第二の原因かもしれません。
3.トレーニングモデルが適用されていない、またはモデルのパラメータが不適切である、またはアルゴリズムを変更することを提案する。
もし最初の方法がだめだったら、アルゴリズムがこのデータセットに合わないかもしれません。混淆行列を印刷して見てもいいです。分類エラー率が高すぎるのではないですか?たとえば、私のデータセットを二種類に分類して、第二類は全部第一類に分けられます。
以上のような浅はかな話をkersasは予備訓練モデルvgg 16を使って分類しました。損失と正確さは変わらないです。小編纂が皆さんに共有した内容は全部です。参考にしてほしいです。皆さんも多くの支援をお願いします。
詳細:kersを使って二つのタイプのデータを訓練して、正負の割合は1:3で、vgg 16の後にいくつかのフルリンクを追加して初期化しました。そして、すべての層にトレーニングを許可します。
でも精度はずっと0.75です。
データの前処理はフォーマットが正しいことを確認しました。
モデルの中のreluをsigmoidに変更すれば正常です。
データ処理プログラム
import os
import pickle
import numpy as np
import DataFile
import SelectiveSearch
import Generator
import IoU
import Model_CRNN_VGG16
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import ModelCheckpoint
def data_generator(gen1,gen0):
while True:
data_pos = next(gen1)
data_neg = next(gen0)
ret_X = np.vstack((data_pos[0],data_neg[0]))
ret_y = np.vstack((data_pos[1],data_neg[1]))
index = np.arange(ret_y.shape[0])
np.random.shuffle(index)
ret_X = ret_X[index, :, :, :] # X_train ,y_train
ret_y = ret_y[index]
yield ret_X,ret_y
if __name__ == "__main__":
type = "train"
# , mini-batch 32 ( VOC 20 ),96 (background)
RESIZE = (224, 224)
path = "category_images"
categories = os.listdir(path)
categories.append('background')
print(categories)
train_1_datagen = ImageDataGenerator(
rescale=1.0/255,
#shear_range=0.2,
#zoom_range=0.2,
horizontal_flip=True)
train_1_generator = train_1_datagen.flow_from_directory(
'category_images',
target_size=RESIZE,
batch_size=32,
classes = categories)
train_0_datagen = ImageDataGenerator(
rescale=1.0 / 255,
#shear_range=0.2,
#zoom_range=0.2,
horizontal_flip=True)
train_0_generator = train_0_datagen.flow_from_directory(
'category_background',
target_size=RESIZE,
batch_size=32*3,
classes=categories)
generator = data_generator(train_1_generator,train_0_generator)
#
model = Model_CRNN_VGG16.CRNN_Model(input_shape=(*RESIZE,3))
cnn = model.CNN(len(categories))
if os.path.exists('weights-cnn.hdf5'):
cnn.load_weights('weights-cnn.hdf5')
if type == "train":
checkpoint = ModelCheckpoint('weights-cnn.hdf5',save_weights_only=True)
cnn.fit_generator(generator = generator,steps_per_epoch=200,epochs=1000,callbacks=[checkpoint])
else:
img = next(generator)[0]
result = cnn.predict(img)
print(result)
# SVM
#
#
モデルプログラム:
from keras.applications.vgg16 import VGG16
from keras.layers import *
from keras.models import Model
from keras.optimizers import SGD,Adam
class CRNN_Model():
def __init__(self,input_shape,trainable=True):
vgg16 = VGG16(include_top=False,weights="imagenet", input_shape=input_shape)
for layer in vgg16.layers:
layer.trainable = trainable
self.base_model = vgg16
def CNN(self,classes):
img_input = self.base_model.input
x = self.base_model.get_layer('block5_conv3').output
x = Flatten(name='crnn_flatten')(x)
x = Dense(512,activation='relu', kernel_initializer='he_normal', name='crnn_fc1')(x)
x = Dense(512,activation='relu', kernel_initializer='he_normal',name='crnn_fc2')(x)
x = Dense(classes, activation='softmax', kernel_initializer='he_normal', name='crnn_predictions')(x)
model = Model(img_input,x)
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
adam = Adam()
model.compile(optimizer=adam,
loss='categorical_crossentropy',
metrics=['accuracy'])
model.summary()
return model
if __name__ == "__main__":
pass
補足知識:val_accはずっと変わらないですval_lossが変わらない理由
前に、kersでLSTMモデルを作成して、写真の分類をしました。自分でテストセットとトレーニングセットを分けましたが、結果は各epochトレーニングの正確性が変わりませんでした。
探索する
私はずっと私のデータの読み取り方法が間違っていると思っていましたが、この点からずっと着手しています。
1.データセットサンプルの各カテゴリの数の差が大きい
このような状況がないなら、第二点を見てください。
2.トレーニングセットとデータセットは手動で区分され、コード自動分割に変更されます。
コードは以下の通りです
X_トレイtest,Y_トレイtest=train_test_スプリット(data、labels、test_)size=0.4、ラドム_state=42)`
上記の方法はいくつかのepochを多く設置し、忍耐強く待つ必要があります。もしまだテストの正確性が変わらないなら、第二の原因かもしれません。
3.トレーニングモデルが適用されていない、またはモデルのパラメータが不適切である、またはアルゴリズムを変更することを提案する。
もし最初の方法がだめだったら、アルゴリズムがこのデータセットに合わないかもしれません。混淆行列を印刷して見てもいいです。分類エラー率が高すぎるのではないですか?たとえば、私のデータセットを二種類に分類して、第二類は全部第一類に分けられます。
以上のような浅はかな話をkersasは予備訓練モデルvgg 16を使って分類しました。損失と正確さは変わらないです。小編纂が皆さんに共有した内容は全部です。参考にしてほしいです。皆さんも多くの支援をお願いします。