📑 Deep Learning. Practice Project 8_0:
Neural Networks for Classification of Drawings & Photo Images
✒️ Code Modules, Helpful Functions, & Settings
xxxxxxxxxx
#!python3 -m pip install tensorflow==2.6.0 \
#--user --quiet --no-warn-script-location
path='/home/sc_work/.sage/local/lib/python3.9/site-packages'
import sys,warnings; sys.path.append(path)
warnings.filterwarnings('ignore')
import os,h5py,urllib,pandas as pd,numpy as np
import tensorflow as tf,pylab as pl,seaborn as sn
import tensorflow.keras.layers as tkl
import tensorflow.keras.callbacks as tkc
from sklearn.metrics import classification_report
file_path='https://raw.githubusercontent.com/'+\
'OlgaBelitskaya/data_kitchen/main/'
file_name='Pictograms64.h5'
model_weights='/tmp/checkpoint'
img_size=int(32)
from IPython.display import display,HTML
xxxxxxxxxx
def h5file2data(h5file,cmap,img_size,resize=True):
with h5py.File(h5file,'r') as f:
keys=list(f.keys())
pretty_print('file keys: '+', '.join(keys))
images=np.array(f[keys[int(0)]])
labels=np.array(f[keys[int(1)]])
names=[[el.decode('utf-8') for el in f[keys[i]]]
for i in range(int(2),len(keys))]
f.close()
N=images.shape[int(0)]; n=int(.1*N)
if resize:
images=tf.image.resize(images,[img_size,img_size]).numpy()
shuffle_ids=np.arange(N)
np.random.RandomState(12).shuffle(shuffle_ids)
images=images[shuffle_ids]
labels=np.array([labels[i][shuffle_ids]
for i in range(labels.shape[int(0)])])
x_test,x_valid,x_train=images[:n],images[n:2*n],images[2*n:]
y_test,y_valid,y_train=\
labels[:,:n],labels[:,n:2*n],labels[:,2*n:]
pretty_print('data outputs: ')
df=pd.DataFrame([[x_train.shape,x_valid.shape,x_test.shape],
[x_train.dtype,x_valid.dtype,x_test.dtype],
[y_train.shape,y_valid.shape,y_test.shape],
[y_train.dtype,y_valid.dtype,y_test.dtype]],
columns=['train','valid','test'],
index=['image shape','image type',
'label shape','label type'])
display(df)
pretty_print('distribution of labels: ')
idx=['labels %d'%(i+int(1)) for i in range(labels.shape[int(0)])]
df=pd.DataFrame(labels,index=idx).T
for i in range(labels.shape[int(0)]):
df['name %d'%(i+int(1))]=[names[i][l] for l in labels[i]]
fig=pl.figure(figsize=(6,6))
for i in range(labels.shape[int(0)]):
ax=fig.add_subplot(labels.shape[int(0)],int(1),i+int(1))
sn.countplot(y='name %s'%(i+1),data=df,
palette=cmap,alpha=.5,ax=ax)
pl.tight_layout(); pl.show()
return [names,x_train,x_valid,x_test,y_train,y_valid,y_test]
xxxxxxxxxx
def display_images(images,labels,names,n):
fig=pl.figure(figsize=(6,n/2))
randch=np.random.choice(images.shape[0],size=n,replace=False)
for i,idx in enumerate(randch):
ax=fig.add_subplot(int(n//3)+1,3,i+1,xticks=[],yticks=[])
ax.imshow(images[idx],cmap='bone')
if len(labels.shape)<int(2):
label=[labels[idx]]
name=[names[labels[idx]]]
else:
label=[labels[:,idx]]
name=[names[i][labels[i][idx]]
for i in range(labels.shape[0])]
ti='{} \n {}'.format(str(label),str(name))
ax.set_title(ti,fontsize=8)
pl.tight_layout(); pl.show()
def keras_history_plot(fit_history,fig_size=6,color='#348ABD'):
keys=list(fit_history.history.keys())
list_history=[fit_history.history[keys[i]]
for i in range(len(keys))]
dfkeys=pd.DataFrame(list_history).T
dfkeys.columns=keys
fig=pl.figure(figsize=(fig_size,fig_size//2))
ax1=fig.add_subplot(2,1,1)
dfkeys.iloc[:,[int(0),int(2)]].plot(
ax=ax1,color=['slategray',color],grid=True)
ax2=fig.add_subplot(2,1,2)
dfkeys.iloc[:,[int(1),int(3)]].plot(
ax=ax2,color=['slategray',color],grid=True)
pl.tight_layout(); pl.show()
✒️ Pictogram's Data Loading
xxxxxxxxxx
input_file=urllib.request.urlopen(file_path+file_name)
output_file=open(file_name,'wb')
output_file.write(input_file.read())
output_file.close(); input_file.close()
[names,x_train,x_valid,x_test,y_train,y_valid,y_test]=\
h5file2data(file_name,'Pastel1',img_size)
os.remove(file_name)
xd=np.vstack([x_train,x_valid,x_test])
yd=np.hstack([y_train,y_valid,y_test])
display_images(xd,yd,names,6)
✒️ Pictogram Selecting
xxxxxxxxxx
names2=['plane','car','bird','cat','deer',
'dog','frog','horse','ship','truck']
xd=xd[np.where(yd[0]==0)]
yd=yd[1][np.where(yd[0]==0)]
cond=np.where([l in names2 for l in names[1]])[0]
cond2=np.where([l in cond for l in yd])
xd=xd[cond2]; yd=yd[cond2]
rd={1:2,4:0,6:5,7:7,8:4,9:9,10:1,11:3,12:6,13:8}
yd=np.array([rd.get(x,x) for x in yd],dtype='int8')
display_images(xd,yd,names2,6)
✒️ CIFAR's Data Loading
xxxxxxxxxx
file_name='CIFAR10_5000.h5'
input_file=urllib.request.urlopen(file_path+file_name)
output_file=open(file_name,'wb')
output_file.write(input_file.read())
output_file.close(); input_file.close()
with h5py.File(file_name,'r') as f:
keys=list(f.keys())
pretty_print('file keys: '+', '.join(keys))
x=np.array(f[keys[int(0)]])
y=np.array(f[keys[int(1)]])
f.close()
n2=int(1.2*len(yd)); N=len(y); n=int(.1*N)
shuffle_ids=np.arange(N)
np.random.RandomState(23).shuffle(shuffle_ids)
shuffle_ids=shuffle_ids[:n2]
x,y=x[shuffle_ids],y[shuffle_ids]
display_images(x,y,names2,6)
✒️ Mixed Data
xxxxxxxxxx
x=np.vstack([x,xd]); y=np.hstack([y,yd])
N=len(y); n=int(.1*N)
shuffle_ids=np.arange(N)
np.random.RandomState(23).shuffle(shuffle_ids)
x,y=x[shuffle_ids],y[shuffle_ids]
print([x.shape,x.dtype,y.shape,y.dtype])
gx=np.dot(x[...,:3],[.299,.587,.114])
x_test,x_valid,x_train=x[:n],x[n:2*n],x[2*n:]
gx_test,gx_valid,gx_train=gx[:n],gx[n:2*n],gx[2*n:]
y_test,y_valid,y_train=y[:n],y[n:2*n],y[2*n:]
display_images(x_train,y_train,names2,3)
display_images(gx_train,y_train,names2,3)
gx_train=gx_train.reshape(-int(1),img_size,img_size,int(1))
gx_valid=gx_valid.reshape(-int(1),img_size,img_size,int(1))
gx_test=gx_test.reshape(-int(1),img_size,img_size,int(1))
xxxxxxxxxx
df=pd.DataFrame(y,columns=['label'])
df['class']=[names2[l] for l in y]
pl.figure(figsize=(6,4))
sn.countplot(y='class',data=df,palette='Pastel1',alpha=.5)
pl.title('distribution of labels',fontsize=15)
pl.tight_layout(); pl.show()
✒️ NN Classification of Colored Images
xxxxxxxxxx
def model(leaky_alpha):
model=tf.keras.Sequential()
model.add(tkl.Conv2D(
int(32),(int(5),int(5)),padding='same',
input_shape=x_train.shape[int(1):]))
model.add(tkl.LeakyReLU(alpha=leaky_alpha))
model.add(tkl.MaxPooling2D(pool_size=(int(2),int(2))))
model.add(tkl.Dropout(.2))
model.add(tkl.Conv2D(int(96),(int(5),int(5))))
model.add(tkl.LeakyReLU(alpha=leaky_alpha))
model.add(tkl.MaxPooling2D(pool_size=(int(2),int(2))))
model.add(tkl.Dropout(.2))
model.add(tkl.GlobalMaxPooling2D())
model.add(tkl.Dense(int(512)))
model.add(tkl.LeakyReLU(alpha=leaky_alpha))
model.add(tkl.Dropout(.5))
model.add(tkl.Dense(int(10)))
model.add(tkl.Activation('softmax'))
model.compile(loss='sparse_categorical_crossentropy',
optimizer='nadam',metrics=['accuracy'])
return model
model=model(float(.005))
xxxxxxxxxx
checkpointer=tkc.ModelCheckpoint(
filepath=model_weights,verbose=int(0),save_weights_only=True,
monitor='val_accuracy',mode='max',save_best_only=True)
lr_reduction=tkc.ReduceLROnPlateau(
monitor='val_loss',patience=int(5),verbose=int(0),factor=.8)
history=model.fit(x_train,y_train,epochs=int(8),
batch_size=int(16),verbose=int(2),
validation_data=(x_valid,y_valid),
callbacks=[checkpointer,lr_reduction])
xxxxxxxxxx
keras_history_plot(history)
model.load_weights(model_weights)
pretty_print(model.evaluate(x_test,y_test,verbose=int(0)))
py_test=np.argmax(model.predict(x_test),axis=-1)
print(classification_report(y_test,py_test))
No comments:
Post a Comment