65 lines
2.0 KiB
Python
65 lines
2.0 KiB
Python
import os
|
|
import keras
|
|
import numpy as np
|
|
import tensorflow as tf
|
|
from stock.util.Stock2Vector import Stock2Vector
|
|
from classification_models.keras import Classifiers
|
|
|
|
class StockTrainer:
|
|
|
|
RESOURCE_PATH = None
|
|
stock2Vector = None
|
|
|
|
def __init__(self, RESOURCE_PATH):
|
|
self.RESOURCE_PATH = RESOURCE_PATH
|
|
self.stock2Vector = Stock2Vector(RESOURCE_PATH)
|
|
return
|
|
|
|
|
|
def train(self, stock_code):
|
|
#X, Y = self.stock2Vector.getDataset3D(stock_code)
|
|
X, Y = self.stock2Vector.getDataset2D(stock_code)
|
|
|
|
# build model
|
|
n_classes = 3
|
|
Inceptionresnetv2, preprocess_input = Classifiers.get('inceptionresnetv2')
|
|
X = preprocess_input(X)
|
|
|
|
# train
|
|
checkpoint_filename = os.path.join(self.RESOURCE_PATH, "model", "stock.ckpt")
|
|
base_model = Inceptionresnetv2(input_shape=(299, 299, 3), include_top=False)
|
|
x = tf.keras.layers.GlobalAveragePooling2D()(base_model.output)
|
|
output = tf.keras.layers.Dense(n_classes, activation='softmax')(x)
|
|
model = keras.models.Model(inputs=[base_model.input], outputs=[output])
|
|
|
|
model.compile(optimizer='SGD', loss='categorical_crossentropy', metrics=['accuracy'])
|
|
chekpoint = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_filename, save_weights_only=True, verbose=1)
|
|
earlystop = tf.keras.callbacks.EarlyStopping(monitor='loss', patience=5, mode="auto")
|
|
|
|
if os.path.isfile(checkpoint_filename):
|
|
model.load_weights(checkpoint_filename)
|
|
|
|
model.fit(x=X,
|
|
y=Y,
|
|
batch_size=10000,
|
|
epochs=10000,
|
|
callbacks=[chekpoint, earlystop])
|
|
|
|
return
|
|
|
|
|
|
if __name__ == "__main__":
|
|
PROJECT_HOME = os.getcwd()
|
|
RESOURCE_PATH = os.path.join(PROJECT_HOME, "resources")
|
|
|
|
stock_codes = {
|
|
# 252670
|
|
# 122630
|
|
"252670": ['20220729'],
|
|
}
|
|
|
|
for stock_code in stock_codes:
|
|
stockTrainer = StockTrainer(RESOURCE_PATH)
|
|
stockTrainer.train(stock_code)
|
|
|
|
print ("done...") |