Correct way to train lstm model for multilabel classification - deep-learning

I try to made multilabel classification using lstm arch and pytroch lib. But unfortunately it does't train.
BATCH_SIZE=1
INPUT_LENGTH=5
#data generation
df=pd.DataFrame({"product_group":[INPUT_LENGTH//2*[random.randint(1,20)]+INPUT_LENGTH//2*
[random.randint(1,20)] for _ in range(3)],"test_data":[[1,2],[3],[2]]})
target_vector=np.array([1,2,3])
output_dim=3
# make it more
df=pd.concat([df,df,df,df,df])
train, test = train_test_split(df, test_size=0.2, random_state=0)
class CustomDataset(Dataset):
def __init__(self, ddf):
self.ddf=ddf
def __len__(self):
return self.ddf.shape[0]
def __getitem__(self, idx):
data=self.ddf.iloc[idx]
# get index of target value
list_target_elements=[]
for val in data.test_data:
list_target_elements.append(target_vector.tolist().index(val))
#creating empty tensor
target=torch.zeros(len(target_vector))
for index in list_target_elements:
target[index]=1
return torch.tensor(data.product_group),target
dataset_train=CustomDataset(train)
dataset_test=CustomDataset(test)
train_dataloader = DataLoader(dataset_train, batch_size=BATCH_SIZE, shuffle=True,drop_last=False)
test_dataloader = DataLoader(dataset_test, batch_size=BATCH_SIZE, shuffle=True,drop_last=False)
class LSTMModel(nn.Module):
def __init__(self, input_dim, hidden_dim, layer_dim, output_dim, dropout_prob):
super(LSTMModel, self).__init__()
self.embeding= nn.Embedding(21, 50)
self.hidden_dim = hidden_dim
self.layer_dim = layer_dim
self.lstm = nn.LSTM(
input_dim, hidden_dim, layer_dim, batch_first=True, dropout=dropout_prob
)
self.fc1 = nn.Linear(hidden_dim, output_dim)
self.sigmoid=torch.nn.Sigmoid()
def forward(self, x):
h0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim)
c0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim)
x=self.embeding(x)
out, (hn, cn) = self.lstm(x, (h0, c0))
out = out[:, -1, :]
out = self.fc1(out)
out=self.sigmoid(out)
return out
model =LSTMModel(input_dim=50,hidden_dim=10,layer_dim=20,output_dim=output_dim,dropout_prob=0.2)
x,y=(next(iter(train_dataloader)))
after i got:
x:tensor([[17, 17, 20, 20]])
y:tensor([[0., 0., 1.]])
model(x) shows tensor([[0.4539, 0.4767, 0.4881]], grad_fn=SigmoidBackward0)
def train_model(model, loss, optimizer,scheduler, num_epochs):
precision_stats = {
'train': [],
"val": []
}
recall_stats = {
'train': [],
"val": []
}
loss_stats = {
'train': [],
"val": []
}
for e in tqdm(range(1, num_epochs+1)):
# TRAINING
train_epoch_loss = 0
train_epoch_recall = 0
train_epoch_precision = 0
model.train()
for x, y in tqdm(train_dataloader):
x = x.to(device)
y = y.to(device)
optimizer.zero_grad()
y_train_pred = model(x)
train_loss = loss(y_train_pred, y)
train_loss.backward()
optimizer.step()
scheduler.step()
pred = np.array(y_train_pred > 0.5, dtype=float)
train_recall = recall_score(y_true=y, y_pred=pred,average='micro',zero_division=0)
train_precision = precision_score(y_true=y, y_pred=pred,average='micro',zero_division=0)
train_epoch_loss += train_loss.item()
train_epoch_recall += train_recall.item()
train_epoch_precision += train_precision.item()
loss_stats['train'].append(train_epoch_loss/len(train_dataloader))
recall_stats['train'].append(train_epoch_recall/len(train_dataloader))
precision_stats['train'].append(train_epoch_precision/len(train_dataloader))
print(f'Epoch {e+0:03}: | Loss: {train_epoch_loss/len(train_dataloader):.5f} | recall: {train_epoch_recall/len(train_dataloader):.3f} | precision:{train_epoch_precision/len(train_dataloader):.3f}')
And finally launch train cycle:
lr=0.01
epoch=200
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model = model.to(device)
loss = torch.nn.BCELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=lr)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)
train_model(model,loss,optimizer,scheduler,epoch)
this code work without errors, but model doesn't train

Related

No data display after QTableView freeze column?

QTableView has been instantiated, use QSqlTableModel in PYQT5 to read MySQL database, and use setmodel() to display correctly in QTableView. Freeze the first row and first column using FreezeTableView but no data is displayed in the instantiated tableView. It needs show() to display the data in a new window. How can I display the data in the instantiated tableView instead of in a new window? Thanks!
Ui_untitled.py
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(978, 828)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.treeView_1 = QtWidgets.QTreeView(self.centralwidget)
self.treeView_1.setEnabled(False)
self.treeView_1.setGeometry(QtCore.QRect(10, 11, 191, 771))
self.treeView_1.setObjectName("treeView_1") #Omitted below
mainwindown.py
from ui_untitled import Ui_MainWindow
class MainForm(QMainWindow, Ui_MainWindow):
def __init__(self, pareng=None):
super(MainForm, self).__init__(pareng)
self.setupUi(self)
def on_treeView_clicked(self, index):
name = index.data()
self.tableModel_1 = QSqlTableModel()
self.tableModel_1.setTable("name")
self.tableModel_1.setEditStrategy(QSqlTableModel.OnRowChange)
self.tableModel_1.setFilter(self.tr("name_no = %s"%name))
self.tableModel_1.select()
self.tableView_1 = QTableView()
#self.tableView_1.setModel(self.tableModel_1)
self.tableView_1 = FreezeTableView(self.tableModel_1)
#self.tableView_1.show() #No data displayed after cancel
class FreezeTableView(QTableView, QAbstractSlider):
def __init__(self, model):
super(FreezeTableView, self).__init__()
self.model = model
self.frozenTableView = QTableView(self)
self.horizontalView = QTableView(self)
self.up = True
self.init()
def init(self):
self.setModel(self.model)
#print(self.model.rowCount(), self.model.ColumnCount())
self.frozenTableInit()
self.horizontalViewInit()
self.horizontalHeader().sectionResized.connect(self.updateSectionWidth)
self.verticalHeader().sectionResized.connect(self.updateSectionHeight)
self.verticalScrollBar().valueChanged.connect(self.vConnectFV)
self.frozenTableView.verticalScrollBar().valueChanged.connect(self.fVConnectV)
self.horizontalScrollBar().valueChanged.connect(self.hConnectH)
def vConnectFV(self, a0: int):
self.viewport().stackUnder(self.frozenTableView)
self.frozenTableView.stackUnder(self.horizontalView)
self.frozenTableView.verticalScrollBar().setValue(a0)
def fVConnectV(self, a0: int):
self.viewport().stackUnder(self.frozenTableView)
self.frozenTableView.stackUnder(self.horizontalView)
self.verticalScrollBar().setValue(a0)
def hConnectH(self, a0: int):
self.viewport().stackUnder(self.horizontalView)
self.horizontalView.stackUnder(self.frozenTableView)
self.horizontalView.horizontalScrollBar().setValue(a0)
def frozenTableInit(self):
self.frozenTableView.setModel(self.model)
self.frozenTableView.verticalHeader().hide()
self.frozenTableView.setFocusPolicy(Qt.NoFocus)
self.frozenTableView.horizontalHeader().setFixedHeight(self.horizontalHeader().height())
self.frozenTableView.horizontalHeader().setSectionResizeMode(QHeaderView.Fixed)
self.viewport().stackUnder(self.frozenTableView)
self.frozenTableView.setStyleSheet('QTableView {'
'border: none;'
'background-color: #8EDE21;'
'selection-background-color: #999}')
self.frozenTableView.setSelectionModel(self.selectionModel())
[self.frozenTableView.setColumnHidden(col, True) for col in range(1, self.model.columnCount())]
self.frozenTableView.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.frozenTableView.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.frozenTableView.show()
self.updateFrozenTableGeometry()
self.frozenTableView.setVerticalScrollMode(self.ScrollPerPixel)
self.setVerticalScrollMode(self.ScrollPerPixel)
self.setHorizontalScrollMode(self.ScrollPerPixel)
def horizontalViewInit(self):
self.horizontalView.setModel(self.model)
self.horizontalView.horizontalHeader().hide()
self.horizontalView.setFocusPolicy(Qt.NoFocus)
self.horizontalView.verticalHeader().setFixedWidth(self.verticalHeader().width())
self.horizontalView.verticalHeader().setSectionResizeMode(QHeaderView.Fixed)
self.frozenTableView.stackUnder(self.horizontalView)
self.horizontalView.setStyleSheet('QTableView { border: none;'
'background-color: #8EDE21;'
'selection-background-color: #999}')
self.horizontalView.setSelectionModel(self.selectionModel())
[self.horizontalView.setRowHidden(row, True) for row in range(1, self.model.rowCount())]
self.horizontalView.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.horizontalView.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.horizontalView.show()
self.updateFrozenTableGeometry()
self.horizontalView.setHorizontalScrollMode(self.ScrollPerPixel)
def updateFrozenTableGeometry(self):
self.frozenTableView.setGeometry(self.verticalHeader().width() + self.frameWidth(),
self.frameWidth(), self.columnWidth(0),
self.viewport().height() + self.horizontalHeader().height())
self.horizontalView.setGeometry(self.frameWidth(), self.frameWidth() + self.horizontalHeader().height(),
self.viewport().width() + self.verticalHeader().width(), self.rowHeight(0))
def updateSectionWidth(self, logicalIndex, oldSize, newSize):
self.horizontalView.setColumnWidth(logicalIndex, newSize)
if not logicalIndex:
self.frozenTableView.setColumnWidth(0, newSize)
self.updateFrozenTableGeometry()
def updateSectionHeight(self, logicalIndex, oldSize, newSize):
self.frozenTableView.setRowHeight(logicalIndex, newSize)
if not logicalIndex:
self.horizontalView.setRowHeight(0, newSize)
self.updateFrozenTableGeometry()
def resizeEvent(self, e: QtGui.QResizeEvent) -> None:
QTableView.resizeEvent(self, e)
self.updateFrozenTableGeometry()
def scrollTo(self, index: QtCore.QModelIndex, hint: QAbstractItemView.ScrollHint = ...) -> None:
print(index.row, index.column, self.model.data(index))
if index.column() > 0 or index.row() > 0:
QTableView.scrollTo(self, index, hint)
def moveCursor(self, cursorAction: QAbstractItemView.CursorAction,
modifiers: typing.Union[QtCore.Qt.KeyboardModifiers,
QtCore.Qt.KeyboardModifier]) -> QtCore.QModelIndex:
current = QTableView.moveCursor(self, cursorAction, modifiers)
if cursorAction == QAbstractItemView.MoveLeft and current.column() > 0 \
and self.visualRect(current).topLeft().x() < self.frozenTableView.columnWidth(0):
newValue = self.verticalScrollBar().value() + self.visualRect(current).topLeft().x() \
- self.frozenTableView.columnWidth(0)
self.horizontalScrollBar().setValue(newValue)
if cursorAction == QAbstractItemView.MoveUp and current.row() > 0 \
and self.visualRect(current).topLeft().y() < self.horizontalView.rowHeight(0):
newValue = self.horizontalScrollBar().value() + self.visualRect(current).topLeft().y() \
- self.horizontalView.rowHeight(0)
self.verticalScrollBar().setValue(newValue)
return current
'from ui_untitled import Ui_MainWindow
class MainForm(QMainWindow, Ui_MainWindow):
def __init__(self, pareng=None):
super(MainForm, self).__init__(pareng)
self.setupUi(self)
def on_treeView_clicked(self, index): #treeView双击显示Qmodelidx
name = index.data()
self.tableModel_1 = QSqlTableModel()
self.tableModel_1.setTable("name")
self.tableModel_1.setEditStrategy(QSqlTableModel.OnRowChange)
self.tableModel_1.setFilter(self.tr("name_no = %s"%name))
self.tableModel_1.select()
self.tableView_1 = QTableView()
#self.tableView_1.setModel(self.tableModel_1)
self.tableView_1 = FreezeTableView(self.tableModel_1)
#self.tableView_1.show() #No data displayed after cancel
class FreezeTableView(QTableView, QAbstractSlider):
def __init__(self, model):
super(FreezeTableView, self).__init__()
self.model = model
self.frozenTableView = QTableView(self)
self.horizontalView = QTableView(self)
self.up = True
self.init()
def init(self):
self.setModel(self.model)
#print(self.model.rowCount(), self.model.ColumnCount())
self.frozenTableInit()
self.horizontalViewInit()
self.horizontalHeader().sectionResized.connect(self.updateSectionWidth)
self.verticalHeader().sectionResized.connect(self.updateSectionHeight)
self.verticalScrollBar().valueChanged.connect(self.vConnectFV)
self.frozenTableView.verticalScrollBar().valueChanged.connect(self.fVConnectV)
self.horizontalScrollBar().valueChanged.connect(self.hConnectH)
def vConnectFV(self, a0: int):
self.viewport().stackUnder(self.frozenTableView)
self.frozenTableView.stackUnder(self.horizontalView)
self.frozenTableView.verticalScrollBar().setValue(a0)
def fVConnectV(self, a0: int):
self.viewport().stackUnder(self.frozenTableView)
self.frozenTableView.stackUnder(self.horizontalView)
self.verticalScrollBar().setValue(a0)
def hConnectH(self, a0: int):
self.viewport().stackUnder(self.horizontalView)
self.horizontalView.stackUnder(self.frozenTableView)
self.horizontalView.horizontalScrollBar().setValue(a0)
def frozenTableInit(self):
self.frozenTableView.setModel(self.model)
self.frozenTableView.verticalHeader().hide()
self.frozenTableView.setFocusPolicy(Qt.NoFocus)
self.frozenTableView.horizontalHeader().setFixedHeight(self.horizontalHeader().height())
self.frozenTableView.horizontalHeader().setSectionResizeMode(QHeaderView.Fixed)
self.viewport().stackUnder(self.frozenTableView)
self.frozenTableView.setStyleSheet('QTableView {'
'border: none;'
'background-color: #8EDE21;'
'selection-background-color: #999}')
self.frozenTableView.setSelectionModel(self.selectionModel())
[self.frozenTableView.setColumnHidden(col, True) for col in range(1, self.model.columnCount())]
self.frozenTableView.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.frozenTableView.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.frozenTableView.show()
self.updateFrozenTableGeometry()
self.frozenTableView.setVerticalScrollMode(self.ScrollPerPixel)
self.setVerticalScrollMode(self.ScrollPerPixel)
self.setHorizontalScrollMode(self.ScrollPerPixel)
def horizontalViewInit(self):
self.horizontalView.setModel(self.model)
self.horizontalView.horizontalHeader().hide()
self.horizontalView.setFocusPolicy(Qt.NoFocus)
self.horizontalView.verticalHeader().setFixedWidth(self.verticalHeader().width())
self.horizontalView.verticalHeader().setSectionResizeMode(QHeaderView.Fixed)
self.frozenTableView.stackUnder(self.horizontalView)
self.horizontalView.setStyleSheet('QTableView { border: none;'
'background-color: #8EDE21;'
'selection-background-color: #999}')
self.horizontalView.setSelectionModel(self.selectionModel())
[self.horizontalView.setRowHidden(row, True) for row in range(1, self.model.rowCount())]
self.horizontalView.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.horizontalView.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.horizontalView.show()
self.updateFrozenTableGeometry()
self.horizontalView.setHorizontalScrollMode(self.ScrollPerPixel)
def updateFrozenTableGeometry(self):
self.frozenTableView.setGeometry(self.verticalHeader().width() + self.frameWidth(),
self.frameWidth(), self.columnWidth(0),
self.viewport().height() + self.horizontalHeader().height())
self.horizontalView.setGeometry(self.frameWidth(), self.frameWidth() + self.horizontalHeader().height(),
self.viewport().width() + self.verticalHeader().width(), self.rowHeight(0))
def updateSectionWidth(self, logicalIndex, oldSize, newSize):
self.horizontalView.setColumnWidth(logicalIndex, newSize)
if not logicalIndex:
self.frozenTableView.setColumnWidth(0, newSize)
self.updateFrozenTableGeometry()
def updateSectionHeight(self, logicalIndex, oldSize, newSize):
self.frozenTableView.setRowHeight(logicalIndex, newSize)
if not logicalIndex:
self.horizontalView.setRowHeight(0, newSize)
self.updateFrozenTableGeometry()
def resizeEvent(self, e: QtGui.QResizeEvent) -> None:
QTableView.resizeEvent(self, e)
self.updateFrozenTableGeometry()
def scrollTo(self, index: QtCore.QModelIndex, hint: QAbstractItemView.ScrollHint = ...) -> None:
print(index.row, index.column, self.model.data(index))
if index.column() > 0 or index.row() > 0:
QTableView.scrollTo(self, index, hint)
def moveCursor(self, cursorAction: QAbstractItemView.CursorAction,
modifiers: typing.Union[QtCore.Qt.KeyboardModifiers,
QtCore.Qt.KeyboardModifier]) -> QtCore.QModelIndex:
current = QTableView.moveCursor(self, cursorAction, modifiers)
if cursorAction == QAbstractItemView.MoveLeft and current.column() > 0 \
and self.visualRect(current).topLeft().x() < self.frozenTableView.columnWidth(0):
newValue = self.verticalScrollBar().value() + self.visualRect(current).topLeft().x() \
- self.frozenTableView.columnWidth(0)
self.horizontalScrollBar().setValue(newValue)
if cursorAction == QAbstractItemView.MoveUp and current.row() > 0 \
and self.visualRect(current).topLeft().y() < self.horizontalView.rowHeight(0):
newValue = self.horizontalScrollBar().value() + self.visualRect(current).topLeft().y() \
- self.horizontalView.rowHeight(0)
self.verticalScrollBar().setValue(newValue)
return current

load_model() doesn't load a model

I have Python version 3.6 and tensorflow version 2.0.1 installed. I created a model and tried to load it, but ran into a problem:
Traceback (most recent call last):
File "C:/Users/Irina/Documents/PYTHON4/main.py", line 86, in <module>
main()
File "C:/Users/Irina/Documents/PYTHON4/main.py", line 73, in main
predictions = get_predictions(data, model)
File "C:/Users/Irina/Documents/PYTHON4/main.py", line 59, in get_predictions
predictions = [predict(np.array([image]), model) for image in data]
File "C:/Users/Irina/Documents/PYTHON4/main.py", line 59, in <listcomp>
predictions = [predict(np.array([image]), model) for image in data]
File "C:\Users\Irina\Documents\PYTHON4\eval.py", line 53, in predict
pred = model.predict(data)
AttributeError: 'list' object has no attribute 'predict'
Process finished with exit code 1
I suspect that the error is in the non-working load_model () function, although it may be due to the incompatibility of Python and tensorflow.
It's main.py:
# -*- coding: utf-8 -*-
import cv2 # computer vision library
import os
from sklearn.metrics import f1_score
import numpy as np
from imutils import paths
from eval import standardize_input, predict, load_final_model
def unison_shuffled_copies(a, b):
assert len(a) == len(b)
p = np.random.permutation(len(a))
return a[p], b[p]
# Image data directories
def one_hot_encode(label):
dictAnimal = {'cats': 0, 'dogs': 1}
return dictAnimal[label]
def load_data():
IMAGE_DIR_VALIDATION = "animalsval"
imagePaths = sorted(list(paths.list_images(IMAGE_DIR_VALIDATION)))
data = []
labels = []
for imagePath in imagePaths:
data.append(standardize_input(imagePath))
label = imagePath.split(os.path.sep)[-2]
labels.append(one_hot_encode(label))
data = np.array(data, dtype="float")
labels = np.array(labels)
data, labels = unison_shuffled_copies(data, labels)
return data, labels
def get_predictions(data, model):
predictions = [predict(np.array([image]), model) for image in data]
return predictions
def main():
data, labels = load_data()
try:
model = load_final_model()
except:
print('The model is not loaded, we use a constant classifier')
model = None
predictions = get_predictions(data, model)
try:
f1 = f1_score(labels, predictions)
print('F1-Classifier measure:', f1)
except Exception as e:
print('Error: ', e)
file = open("score.txt", "w")
file.write(str(f1))
file.close()
if __name__ == '__main__':
main()
It's eval.py:
# -*- coding: utf-8 -*-
import numpy as np
import cv2
from tensorflow.keras.models import load_model
def standardize_input(image):
standard_im = cv2.imread(image)
standard_im = cv2.resize(standard_im, (32, 32))
standard_im = np.reshape(standard_im, (1, 32, 32, 3))
return standard_im
MODEL_FILE_NAME = 'EasyNet.h5'
def load_final_model():
try:
model = load_model(MODEL_FILE_NAME)
print(type(model))
except Exception:
print("Error")
model = []
return model
def predict(image, model):
data = image
label = 0
pred = model.predict(data)
if pred[0][0] >= pred[0][1]:
label = 0
else:
label = 1
return label
It's model:
import matplotlib
matplotlib.use("Agg")
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from tensorflow.keras.models import Sequential
from tensorflow.keras.layer import Dense
from tensorflow.keras.optimizers import SGD
from imutils import paths
import matplotlib.pyplot as plt
import numpy as np
import random
import pickle
import cv2
import os
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras.callbacks import ModelCheckpoint
ImagePaths = list(paths.list_images("/content/drive/My Drive/GoogleColab/dogs/"))
random.seed(42)
ImagePaths = ImagePaths[:1800] + list(paths.list_images("/content/drive/My Drive/GoogleColab/cats/"))
print(len(ImagePaths))
random.shuffle(ImagePaths)
data = []
labels = []
i=0
for imagepath in ImagePaths:
if i % 100 == 0:
print(str(i)+"/3555")
i+=1
image = cv2.imread(imagepath)
image = cv2.resize(image, (32, 32))
data.append(image)
label = imagepath.split(os.path.sep)[-2]
if label == "cats":
label = [1,0]
else:
label = [0,1]
labels.append(label)
print(labels)
data = np.array(data, dtype="float") / 255.0
labels = np.array(labels)
with open("/content/drive/My Drive/GoogleColab/Lesson_4/data.pickle", 'wb') as f:
pickle.dump(data, f)
print("Data saved")
with open("/content/drive/My Drive/GoogleColab/Lesson_4/labels.pickle", 'wb') as f:
pickle.dump(labels, f)
print("Labels saved")
with open("/content/drive/My Drive/GoogleColab/Lesson_4/data.pickle", 'rb') as f:
data = pickle.load(f)
print("Data loaded")
with open("/content/drive/My Drive/GoogleColab/Lesson_4/labels.pickle", 'rb') as f:
labels = pickle.load(f)
print("Labels loaded")
(trainX, testX, trainY, testY) = train_test_split(data, labels,
test_size=0.15,
random_state=42)
print("Dataset prepared")
from tensorflow.keras.layers import Conv2D, Flatten, Dropout, Activation, MaxPooling2D
from tensorflow.keras.optimizers import Adam
model = Sequential()
model.add(Conv2D(32, (3, 3), padding="same", input_shape=(32, 32, 3)))
model.add(Activation("relu"))
model.add(Conv2D(32, (3, 3), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding="same", activation="relu"))
model.add(Conv2D(64, (3, 3), padding="same", activation="relu"))
model.add (MaxPooling2D( pool_size = ( 2 , 2 )))
model.add(Dropout(0.25))
model.add(Flatten())
#model.add(Dense(1024,input_shape=(3072,), activation='sigmoid'))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(2, activation='softmax'))
INIT_LR = 0.01
#opt = SGD(lr=INIT_LR)
opt = Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)
model.compile(loss="binary_crossentropy",optimizer=opt,
metrics=["accuracy"]) #categorial_crosentropy
print ("Model compiled")
model.summary()
EPOCHS = 30
checkpointer = ModelCheckpoint(filepath='/content/drive/My Drive/GoogleColab/Lesson_4/ConvNN.h5', verbose=1, save_best_only=True)
H = model.fit(trainX, trainY, validation_data=(testX,testY),
epochs=EPOCHS, batch_size=32,
shuffle=True,
callbacks=[checkpointer])
print("Model trained")
predictions = model.predict (testX, batch_size = 32)
print(predictions)
print(classification_report(testY.argmax(axis=1),
predictions.argmax(axis=1), target_names=("cats","dogs")))
N = np.arange(0, EPOCHS)
plt.style.use("ggplot")
plt.figure()
plt.plot(N, H.history["loss"], label="train_loss")
plt.plot(N, H.history["val_loss"], label="vall_loss")
plt.plot(N, H.history["accuracy"], label="train_acc")
plt.plot(N, H.history["val_accuracy"], label="val_acc")
plt.title("Results")
plt.xlabel("Epoch #")
plt.ylabel("Loss/Accuracy/")
plt.legend()
plt.savefig("/content/drive/My Drive/GoogleColab/Lesson_4/Loss.png")
model.save("/content/drive/My Drive/GoogleColab/Lesson_4/EasyNet.h5")
print("End")

Stream multiple videos using OpenCV Python Flask

I'm trying to stream 2 webcams at once using Flask Python but I'm not able to do so, when I run my code, both webcams light up but only one of the cameras show on the webpage and I'm not sure.
Here is the code I'm using:
from vCamera import VideoCamera
import pdb
app = Flask(__name__)
#app.route('/')
def index():
return render_template('index.html')
def gen(vCamera0):
while True:
frame0 = vCamera0.get_frame0()
yield (b'--frame0\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame0 + b'\r\n\r\n')
frame2 = vCamera0.get_frame2()
yield (b'--frame2\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame2 + b'\r\n\r\n')
#app.route('/video_feed0')
def video_feed0():
return Response(gen(VideoCamera()),
mimetype='multipart/x-mixed-replace; boundary=frame0')
#app.route('/video_feed2')
def video_feed2():
return Response(gen(VideoCamera()),
mimetype='multipart/x-mixed-replace; boundary=frame2')
if __name__ == '__main__':
app.run(host='127.0.0.1', debug=True)
And this is my camera file:
import pdb
import cv2
fullbody_cascade = cv2.CascadeClassifier('haarcascade_fullbody.xml')
upperbody_cascade = cv2.CascadeClassifier('haarcascade_upperbody.xml')
class VideoCamera(object):
def __init__(self):
self.video0 = cv2.VideoCapture(0)
self.video2 = cv2.VideoCapture(2)
def __del__(self):
self.video0.release()
def get_frame0(self):
success0, frame0 = self.video0.read()
gray0 = cv2.cvtColor(frame0, cv2.COLOR_BGR2GRAY)
fullbody0 = fullbody_cascade.detectMultiScale(gray0)
upperbody0 = upperbody_cascade.detectMultiScale(gray0)
for (x,y,w,h) in fullbody0:
cv2.rectangle(frame0, (x,y), (x+w, y+h), (255,0,0), 2)
for (x,y,w,h) in upperbody0:
cv2.rectangle(frame0, (x,y), (x+w, y+h), (255,0,0), 2)
ret0, jpeg0 = cv2.imencode('.jpg', frame0)
return jpeg0.tobytes()
def get_frame2(self):
success2, frame2 = self.video2.read()
gray2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
fullbody2 = fullbody_cascade.detectMultiScale(gray2)
upperbody2 = upperbody_cascade.detectMultiScale(gray2)
for (x,y,w,h) in fullbody2:
cv2.rectangle(frame2, (x,y), (x+w, y+h), (255,0,0), 2)
for (x,y,w,h) in upperbody2:
cv2.rectangle(frame2, (x,y), (x+w, y+h), (255,0,0), 2)
ret2, jpeg2 = cv2.imencode('.jpg', frame2)
return jpeg2.tobytes()
I am very new to Flask so I'm not quite sure what the issue with the code I have written is. Any advice would be helpful!

AWS Sagemaker batch transform with JSON input filter

I have a custom Sagemaker instance on a NLP task and trying to run a batch transform on the following json file
{"id":123, "features":"This is a test message"}'
and im looking to output the following:
{"id":123,"SageMakerOutput":spam}
Here's my batch transform code:
transformer = sklearn.transformer(instance_count=1,
instance_type='local',
accept='application/json',
output_path="s3://spam-detection-messages-output/json_examples")
transformer.transform("s3://spam-detection-messages/json_examples", content_type='application/json', input_filter="$.features", join_source="Input", output_filter="$['features', SageMakerOutput']")
print('Waiting for transform job: ' + transformer.latest_transform_job.job_name)
transformer.wait()
According to this document,
https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform-data-processing.html#batch-transform-data-processing-examples
i should be able to grab the "features" object using input_filter,
however, it grabs the entire json payload. and only outputs the prediction
I'm also including my training code
import argparse
import pandas as pd
import os
import glob
import io
import json
from sklearn import tree
from sklearn.externals import joblib
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.stop_words import ENGLISH_STOP_WORDS
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from nltk.tokenize import word_tokenize
from nltk.stem import PorterStemmer
from nltk.stem import WordNetLemmatizer
import numpy as np
import nltk
nltk.download('punkt')
nltk.download('wordnet')
stemmer = PorterStemmer()
lemmatizer = WordNetLemmatizer()
vectorizer = TfidfVectorizer()
def remove_stop_words(words):
result = [i for i in words if i not in ENGLISH_STOP_WORDS]
return result
def word_stemmer(words):
return [stemmer.stem(o) for o in words]
def word_lemmatizer(words):
return [lemmatizer.lemmatize(o) for o in words]
def remove_characters(words):
return [word for word in words if len(word)> 1]
def clean_token_pipeline(words):
cleaning_utils = [remove_stop_words, word_lemmatizer]
for o in cleaning_utils:
words = o(words)
return words
def process_text(X_train, X_test, y_train, y_test):
X_train = [word_tokenize(o) for o in X_train]
X_test = [word_tokenize(o) for o in X_test]
X_train = [clean_token_pipeline(o) for o in X_train]
X_test = [clean_token_pipeline(o) for o in X_test]
X_train = [" ".join(o) for o in X_train]
X_test = [" ".join(o) for o in X_test]
return X_train, X_test, y_train, y_test
def convert_to_feature(raw_tokenize_data):
raw_sentences = [' '.join(o) for o in raw_tokenize_data]
return vectorizer.transform(raw_sentences)
def _npy_loads(data):
"""
Deserializes npy-formatted bytes into a numpy array
"""
stream = io.BytesIO(data)
return np.load(stream)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
# Sagemaker specific arguments. Defaults are set in the environment variables.
parser.add_argument('--output-data-dir', type=str, default=os.environ['SM_OUTPUT_DATA_DIR'])
parser.add_argument('--model-dir', type=str, default=os.environ['SM_MODEL_DIR'])
parser.add_argument('--train', type=str, default=os.environ['SM_CHANNEL_TRAIN'])
args = parser.parse_args()
train_data = pd.read_csv(args.train+"/spamAssassin_min.csv", index_col=0)
train_data.dropna(inplace=True)
print(train_data.head())
X_train, X_test, y_train, y_test = train_test_split(train_data['message'], train_data['label'], test_size = 0.2, random_state = 1)
X_train, X_test, y_train, y_test = process_text(X_train, X_test, y_train, y_test)
X_train = [o.split(" ") for o in X_train]
X_test = [o.split(" ") for o in X_test]
vectorizer = TfidfVectorizer()
raw_sentences = [' '.join(o) for o in X_train]
vectorizer.fit(raw_sentences)
# print("saving transformer to {}".format(args.model_dir))
joblib.dump(vectorizer, os.path.join(args.model_dir, "vectorizer.joblib"))
x_train_features = convert_to_feature(X_train)
x_test_features = convert_to_feature(X_test)
clf = GaussianNB()
clf.fit(x_train_features.toarray(),y_train)
y_true, y_pred = y_test, clf.predict(x_test_features.toarray())
print(classification_report(y_true, y_pred))
joblib.dump(clf, os.path.join(args.model_dir, "model.joblib"))
def model_fn(model_dir):
"""Deserialized and return fitted model
Note that this should have the same name as the serialized model in the main method
"""
clf = joblib.load(os.path.join(model_dir, "model.joblib"))
# print("model loaded {}".format(clf))
return clf
def input_fn(request_body, request_content_type):
print("** input_fn**")
print("request_body:{} request_content_type:{}".format(request_body, request_content_type))
if request_content_type == "text/plain":
#convert to string
message = str(request_body)
return message
elif request_content_type == "application/json":
request_body_json = json.loads(request_body)
# print("json {}".format(request_body_json))
return request_body_json['features']
elif request_content_type == "application/x-npy":
return " ".join(_npy_loads(request_body))
else:
# Handle other content-types here or raise an Exception
# if the content type is not supported.
return request_body
def predict_fn(input_data, model):
print("** predict_fn**")
print("input_data: {} model:{}".format(input_data, model))
print("\n")
prefix = '/opt/ml/'
model_path = os.path.join(prefix, 'model')
my_vect = joblib.load(os.path.join(model_path, "vectorizer.joblib"))
message = "".join(clean_token_pipeline(input_data))
print("processed message: {}".format(message))
message = my_vect.transform([message])
message = message.toarray()
prediction = model.predict(message)
return prediction

json: nesting outputs the correct way

I'm using json to output a bunch of classes.
The problem that i am trying to solve is what is the best way to output json for a nested class. The following simple example highlights the problem.
# python 3.x
import json
class Class1:
def __init__(self):
self.a = 'this'
self.b = 33
def toJSON(self):
return json.dumps({'a': self.a,
'b': self.b},
sort_keys=False, indent=2, separators=(',', ': '))
class Class2:
def __init__(self):
self.x = 'hello'
self.y = Class1()
self.z = 'world'
def toJSON(self):
return json.dumps({'x': self.x,
'y': self.y.toJSON(),
'z': self.z},
sort_keys=False, indent=2, separators=(',', ': '))
if __name__ == '__main__':
a = Class2()
print(a.toJSON())
This is the output I'm getting. Which contains control characters
{
"x": "hello",
"y": "{\n \"a\": \"this\",\n \"b\": 33\n}",
"z": "world"
}
This is the output I want would look something like this
{
"x":"hello",
"y":{
"a":"this",
"b":33
},
"z":"world"
}
Any assistance would be greatly appreciated.
I think you could implement cls encoder and then pass cls to json.dumps function like the following example.
import json
class Class1:
def __init__(self):
self.a = 'this'
self.b = 33
class Class2:
def __init__(self):
self.x = 'hello'
self.y = Class1()
self.z = 'world'
class ComplexEncoder(json.JSONEncoder):
def default(self, obj):
if hasattr(obj, '__dict__'):
return obj.__dict__
else:
return json.JSONEncoder.default(self, obj)
if __name__ == '__main__':
a = Class2()
print(json.dumps(a, cls=ComplexEncoder, sort_keys=False, indent=2, separators=(',', ': ')))
You are dumping a JSON as string. Loading it as JSON and then returning would help
# python 3.x
import json
class Class1:
def __init__(self):
self.a = 'this'
self.b = 33
def toJSON(self):
return json.loads(json.dumps({'a': self.a,
'b': self.b},
sort_keys=False, indent=4, separators=(',', ': ')))
class Class2:
def __init__(self):
self.x = 'hello'
self.y = Class1()
self.z = 'world'
def toJSON(self):
return json.loads(json.dumps({'x': self.x,
'y': self.y.toJSON(),
'z': self.z},
sort_keys=False, indent=2, separators=(',', ': ')))
if __name__ == '__main__':
a = Class2()
print(a.toJSON())
Output :
{'x': 'hello', 'y': {'a': 'this', 'b': 33}, 'z': 'world'}