mahout面試題
Mahout是一個基于Hadoop的機器學習庫,用于大規模數據集的分布式計算。面試題可能涉及Mahout的基本概念、算法和應用場景。例如,你可能會被問到Mahout支持哪些機器學習算法,如何在Hadoop集群上使用Mahout進行數據分析,以及如何優化Mahout的性能。此外,你可能還會被要求解釋Mahout與其他機器學習庫(如TensorFlow或Scikit-learn)之間的區別和優勢。準備面試時,建議你熟悉Mahout的核心概念和常用算法,并能夠提供實際應用案例來展示你的理解和經驗。
TensorFlow中有哪些高級API如何使用
背景調查公司Onfido研究主管PeterRoelants在Medium上發表了一篇題為《Higher-LevelAPIsinTensorFlow》的文章,通過實例詳細介紹了如何使用TensorFlow中的高級API(Estimator、Experiment和Dataset)訓練模型。值得一提的是Experiment和Dataset可以獨立使用。這些高級API已被最新發布的TensorFlow1.3版收錄。
TensorFlow中有許多流行的庫,如Keras、TFLearn和Sonnet,它們可以讓你輕松訓練模型,而無需接觸哪些低級別函數。目前,KerasAPI正傾向于直接在TensorFlow中實現,TensorFlow也在提供越來越多的高級構造,其中的一些已經被最新發布的TensorFlow1.3版收錄。
在本文中,我們將通過一個例子來學習如何使用一些高級構造,其中包括Estimator、Experiment和Dataset。閱讀本文需要預先了解有關TensorFlow的基本知識。
Experiment、Estimator和DataSet框架和它們的相互作用(以下將對這些組件進行說明)
在本文中,我們使用MNIST作為數據集。它是一個易于使用的數據集,可以通過TensorFlow訪問。你可以在這個gist中找到完整的示例代碼。使用這些框架的一個好處是我們不需要直接處理圖形和會話。
EstimatorEstimator(評估器)類代表一個模型,以及這些模型被訓練和評估的方式。我們可以這樣構建一個評估器:
returntf.estimator.Estimator(
model_fn=model_fn,#First-classfunction
params=params,#HParams
config=run_config#RunConfig
)
為了構建一個Estimator,我們需要傳遞一個模型函數,一個參數集合以及一些配置。
參數應該是模型超參數的集合,它可以是一個字典,但我們將在本示例中將其表示為HParams對象,用作namedtuple。
該配置指定如何運行訓練和評估,以及如何存出結果。這些配置通過RunConfig對象表示,該對象傳達Estimator需要了解的關于運行模型的環境的所有內容。
模型函數是一個Python函數,它構建了給定輸入的模型(見后文)。
模型函數
模型函數是一個Python函數,它作為第一級函數傳遞給Estimator。稍后我們就會看到,TensorFlow也會在其他地方使用第一級函數。模型表示為函數的好處在于模型可以通過實例化函數不斷重新構建。該模型可以在訓練過程中被不同的輸入不斷創建,例如:在訓練期間運行驗證測試。
模型函數將輸入特征作為參數,相應標簽作為張量。它還有一種模式來標記模型是否正在訓練、評估或執行推理。模型函數的最后一個參數是超參數的集合,它們與傳遞給Estimator的內容相同。模型函數需要返回一個EstimatorSpec對象——它會定義完整的模型。
EstimatorSpec接受預測,損失,訓練和評估幾種操作,因此它定義了用于訓練,評估和推理的完整模型圖。由于EstimatorSpec采用常規TensorFlowOperations,因此我們可以使用像TF-Slim這樣的框架來定義自己的模型。
ExperimentExperiment(實驗)類是定義如何訓練模型,并將其與Estimator進行集成的方式。我們可以這樣創建一個實驗類:
experiment=tf.contrib.learn.Experiment(
estimator=estimator,#Estimator
train_input_fn=train_input_fn,#First-classfunction
eval_input_fn=eval_input_fn,#First-classfunction
train_steps=params.train_steps,#Minibatchsteps
min_eval_frequency=params.min_eval_frequency,#Evalfrequency
train_monitors=[train_input_hook],#Hooksfortraining
eval_hooks=[eval_input_hook],#Hooksforevaluation
eval_steps=None#Useevaluationfeederuntilitsempty
)
Experiment作為輸入:
一個Estimator(例如上面定義的那個)。
訓練和評估數據作為第一級函數。這里用到了和前述模型函數相同的概念,通過傳遞函數而非操作,如有需要,輸入圖可以被重建。我們會在后面繼續討論這個概念。
訓練和評估鉤子(hooks)。這些鉤子可以用于監視或保存特定內容,或在圖形和會話中進行一些操作。例如,我們將通過操作來幫助初始化數據加載器。
不同參數解釋了訓練時間和評估時間。
一旦我們定義了experiment,我們就可以通過learn_runner.run運行它來訓練和評估模型:
learn_runner.run(
experiment_fn=experiment_fn,#First-classfunction
run_config=run_config,#RunConfig
schedule="train_and_evaluate",#Whattorun
hparams=params#HParams
)
與模型函數和數據函數一樣,函數中的學習運算符將創建experiment作為參數。
Dataset我們將使用Dataset類和相應的Iterator來表示我們的訓練和評估數據,并創建在訓練期間迭代數據的數據饋送器。在本示例中,我們將使用TensorFlow中可用的MNIST數據,并在其周圍構建一個Dataset包裝器。例如,我們把訓練的輸入數據表示為:
#Definethetraininginputs
defget_train_inputs(batch_size,mnist_data):
"""Returntheinputfunctiontogetthetrainingdata.
Args:
batch_size(int):Batchsizeoftrainingiteratorthatisreturned
bytheinputfunction.
mnist_data(Object):Objectholdingtheloadedmnistdata.
Returns:
(Inputfunction,IteratorInitializerHook):
-Functionthatreturns(features,labels)whencalled.
-Hooktoinitialiseinputiterator.
"""
iterator_initializer_hook=IteratorInitializerHook()
deftrain_inputs():
"""ReturnstrainingsetasOperations.
Returns:
(features,labels)Operationsthatiterateoverthedataset
oneveryevaluation
"""
withtf.name_scope('Training_data'):
#GetMnistdata
images=mnist_data.train.images.reshape([-1,28,28,1])
labels=mnist_data.train.labels
#Defineplaceholders
images_placeholder=tf.placeholder(
images.dtype,images.shape)
labels_placeholder=tf.placeholder(
labels.dtype,labels.shape)
#Builddatasetiterator
dataset=tf.contrib.data.Dataset.from_tensor_slices(
(images_placeholder,labels_placeholder))
dataset=dataset.repeat(None)#Infiniteiterations
dataset=dataset.shuffle(buffer_size=10000)
dataset=dataset.batch(batch_size)
iterator=dataset.make_initializable_iterator()
next_example,next_label=iterator.get_next()
#Setrunhooktoinitializeiterator
iterator_initializer_hook.iterator_initializer_func=\
lambdasess:sess.run(
iterator.initializer,
feed_dict={images_placeholder:images,
labels_placeholder:labels})
#Returnbatched(features,labels)
returnnext_example,next_label
#Returnfunctionandhook
returntrain_inputs,iterator_initializer_hook
調用這個get_train_inputs會返回一個一級函數,它在TensorFlow圖中創建數據加載操作,以及一個Hook初始化迭代器。
本示例中,我們使用的MNIST數據最初表示為Numpy數組。我們創建一個占位符張量來獲取數據,再使用占位符來避免數據被復制。接下來,我們在from_tensor_slices的幫助下創建一個切片數據集。我們將確保該數據集運行無限長時間(experiment可以考慮epoch的數量),讓數據得到清晰,并分成所需的尺寸。
為了迭代數據,我們需要在數據集的基礎上創建迭代器。因為我們正在使用占位符,所以我們需要在NumPy數據的相關會話中初始化占位符。我們可以通過創建一個可初始化的迭代器來實現。創建圖形時,我們將創建一個自定義的IteratorInitializerHook對象來初始化迭代器:
classIteratorInitializerHook(tf.train.SessionRunHook):
"""HooktoinitialisedataiteratorafterSessioniscreated."""
def__init__(self):
super(IteratorInitializerHook,self).__init__()
self.iterator_initializer_func=None
defafter_create_session(self,session,coord):
"""Initialisetheiteratorafterthesessionhasbeencreated."""
self.iterator_initializer_func(session)
IteratorInitializerHook繼承自SessionRunHook。一旦創建了相關會話,這個鉤子就會調用callafter_create_session,并用正確的數據初始化占位符。這個鉤子會通過get_train_inputs函數返回,并在創建時傳遞給Experiment對象。
train_inputs函數返回的數據加載操作是TensorFlow操作,每次評估時都會返回一個新的批處理。
運行代碼現在我們已經定義了所有的東西,我們可以用以下命令運行代碼:
pythonmnist_estimator.py—model_dir./mnist_training—data_dir./mnist_data
如果你不傳遞參數,它將使用文件頂部的默認標志來確定保存數據和模型的位置。訓練將在終端輸出全局步長、損失、精度等信息。除此之外,實驗和估算器框架將記錄TensorBoard可以顯示的某些統計信息。如果我們運行:
tensorboard—logdir='./mnist_training'
我們就可以看到所有訓練統計數據,如訓練損失、評估準確性、每步時間和模型圖。
評估精度在TensorBoard中的可視化
在TensorFlow中,有關Estimator、Experiment和Dataset框架的示例很少,這也是本文存在的原因。希望這篇文章可以向大家介紹這些架構工作的原理,它們應該采用哪些抽象方法,以及如何使用它們。如果你對它們很感興趣,以下是其他相關文檔。
關于Estimator、Experiment和Dataset的注釋論文《TensorFlowEstimators:ManagingSimplicityvs.FlexibilityinHigh-LevelMachineLearningFrameworks》:https://terrytangyuan.github.io/data/papers/tf-estimators-kdd-paper.pdf
UsingtheDatasetAPIforTensorFlowInputPipelines:https://www.tensorflow.org/versions/r1.3/programmers_guide/datasets
tf.estimator.Estimator:https://www.tensorflow.org/api_docs/python/tf/estimator/Estimator
tf.contrib.learn.RunConfig:https://www.tensorflow.org/api_docs/python/tf/contrib/learn/RunConfig
tf.estimator.DNNClassifier:https://www.tensorflow.org/api_docs/python/tf/estimator/DNNClassifier
tf.estimator.DNNRegressor:https://www.tensorflow.org/api_docs/python/tf/estimator/DNNRegressor
CreatingEstimatorsintf.estimator:https://www.tensorflow.org/extend/estimators
tf.contrib.learn.Head:https://www.tensorflow.org/api_docs/python/tf/contrib/learn/Head
本文用到的Slim框架:https://github.com/tensorflow/models/tree/master/slim
完整示例
"""Scripttoillustrateusageoftf.estimator.EstimatorinTFv1.3"""
importtensorflowastf
fromtensorflow.examples.tutorials.mnistimportinput_dataasmnist_data
fromtensorflow.contribimportslim
fromtensorflow.contrib.learnimportModeKeys
fromtensorflow.contrib.learnimportlearn_runner
#Showdebuggingoutput
tf.logging.set_verbosity(tf.logging.DEBUG)
#Setdefaultflagsfortheoutputdirectories
FLAGS=tf.app.flags.FLAGS
tf.app.flags.DEFINE_string(
flag_name='model_dir',default_value='./mnist_training',
docstring='Outputdirectoryformodelandtrainingstats.')
tf.app.flags.DEFINE_string(
flag_name='data_dir',default_value='./mnist_data',
docstring='Directorytodownloadthedatato.')
#Defineandrunexperiment###############################
defrun_experiment(argv=None):
#Definemodelparameters
params=tf.contrib.training.HParams(
learning_rate=0.002,
n_classes=10,
train_steps=5000,
min_eval_frequency=100
)
#Settherun_configandthedirectorytosavethemodelandstats
run_config=tf.contrib.learn.RunConfig()
run_config=run_config.replace(model_dir=FLAGS.model_dir)
learn_runner.run(
experiment_fn=experiment_fn,#First-classfunction
run_config=run_config,#RunConfig
schedule="train_and_evaluate",#Whattorun
hparams=params#HParams
)
defexperiment_fn(run_config,params):
"""Createanexperimenttotrainandevaluatethemodel.
Args:
run_config(RunConfig):ConfigurationforEstimatorrun.
params(HParam):Hyperparameters
Returns:
(Experiment)Experimentfortrainingthemnistmodel.
"""
#Youcanchangeasubsetoftherun_configpropertiesas
run_config=run_config.replace(
save_checkpoints_steps=params.min_eval_frequency)
#Definethemnistclassifier
estimator=get_estimator(run_config,params)
#Setupdataloaders
mnist=mnist_data.read_data_sets(FLAGS.data_dir,one_hot=False)
train_input_fn,train_input_hook=get_train_inputs(
batch_size=128,mnist_data=mnist)
eval_input_fn,eval_input_hook=get_test_inputs(
batch_size=128,mnist_data=mnist)
#Definetheexperiment
experiment=tf.contrib.learn.Experiment(
estimator=estimator,#Estimator
train_input_fn=train_input_fn,#First-classfunction
eval_input_fn=eval_input_fn,#First-classfunction
train_steps=params.train_steps,#Minibatchsteps
min_eval_frequency=params.min_eval_frequency,#Evalfrequency
train_monitors=[train_input_hook],#Hooksfortraining
eval_hooks=[eval_input_hook],#Hooksforevaluation
eval_steps=None#Useevaluationfeederuntilitsempty
)
returnexperiment
#Definemodel############################################
defget_estimator(run_config,params):
"""ReturnthemodelasaTensorflowEstimatorobject.
Args:
run_config(RunConfig):ConfigurationforEstimatorrun.
params(HParams):hyperparameters.
"""
returntf.estimator.Estimator(
model_fn=model_fn,#First-classfunction
params=params,#HParams
config=run_config#RunConfig
)
defmodel_fn(features,labels,mode,params):
"""Modelfunctionusedintheestimator.
Args:
features(Tensor):Inputfeaturestothemodel.
labels(Tensor):Labelstensorfortrainingandevaluation.
mode(ModeKeys):Specifiesiftraining,evaluationorprediction.
params(HParams):hyperparameters.
Returns:
(EstimatorSpec):ModeltoberunbyEstimator.
"""
is_training=mode==ModeKeys.TRAIN
#Definemodel'sarchitecture
logits=architecture(features,is_training=is_training)
predictions=tf.argmax(logits,axis=-1)
loss=tf.losses.sparse_softmax_cross_entropy(
labels=tf.cast(labels,tf.int32),
logits=logits
)
returntf.estimator.EstimatorSpec(
mode=mode,
predictions=predictions,
loss=loss,
train_op=get_train_op_fn(loss,params),
eval_metric_ops=get_eval_metric_ops(labels,predictions)
)
defget_train_op_fn(loss,params):
"""GetthetrainingOp.
Args:
loss(Tensor):ScalarTensorthatrepresentsthelossfunction.
params(HParams):Hyperparameters(needstohave`learning_rate`)
Returns:
TrainingOp
"""
returntf.contrib.layers.optimize_loss(
loss=loss,
global_step=tf.contrib.framework.get_global_step(),
optimizer=tf.train.AdamOptimizer,
learning_rate=params.learning_rate
)
defget_eval_metric_ops(labels,predictions):
"""ReturnadictoftheevaluationOps.
Args:
labels(Tensor):Labelstensorfortrainingandevaluation.
predictions(Tensor):PredictionsTensor.
Returns:
Dictofmetricresultskeyedbyname.
"""
return{
'Accuracy':tf.metrics.accuracy(
labels=labels,
predictions=predictions,
name='accuracy')
}
defarchitecture(inputs,is_training,scope='MnistConvNet'):
"""Returntheoutputoperationfollowingthenetworkarchitecture.
Args:
inputs(Tensor):InputTensor
is_training(bool):Trueiffintrainingmode
scope(str):Nameofthescopeofthearchitecture
Returns:
LogitsoutputOpforthenetwork.
"""
withtf.variable_scope(scope):
withslim.arg_scope(
[slim.conv2d,slim.fully_connected],
weights_initializer=tf.contrib.layers.xavier_initializer()):
net=slim.conv2d(inputs,20,[5,5],padding='VALID',
scope='conv1')
net=slim.max_pool2d(net,2,stride=2,scope='pool2')
net=slim.conv2d(net,40,[5,5],padding='VALID',
scope='conv3')
net=slim.max_pool2d(net,2,stride=2,scope='pool4')
net=tf.reshape(net,[-1,4*4*40])
net=slim.fully_connected(net,256,scope='fn5')
net=slim.dropout(net,is_training=is_training,
scope='dropout5')
net=slim.fully_connected(net,256,scope='fn6')
net=slim.dropout(net,is_training=is_training,
scope='dropout6')
net=slim.fully_connected(net,10,scope='output',
activation_fn=None)
returnnet
#Definedataloaders#####################################
classIteratorInitializerHook(tf.train.SessionRunHook):
"""HooktoinitialisedataiteratorafterSessioniscreated."""
def__init__(self):
super(IteratorInitializerHook,self).__init__()
self.iterator_initializer_func=None
defafter_create_session(self,session,coord):
"""Initialisetheiteratorafterthesessionhasbeencreated."""
self.iterator_initializer_func(session)
#Definethetraininginputs
defget_train_inputs(batch_size,mnist_data):
"""Returntheinputfunctiontogetthetrainingdata.
Args:
batch_size(int):Batchsizeoftrainingiteratorthatisreturned
bytheinputfunction.
mnist_data(Object):Objectholdingtheloadedmnistdata.
Returns:
(Inputfunction,IteratorInitializerHook):
-Functionthatreturns(features,labels)whencalled.
-Hooktoinitialiseinputiterator.
"""
iterator_initializer_hook=IteratorInitializerHook()
deftrain_inputs():
"""ReturnstrainingsetasOperations.
Returns:
(features,labels)Operationsthatiterateoverthedataset
oneveryevaluation
"""
withtf.name_scope('Training_data'):
#GetMnistdata
images=mnist_data.train.images.reshape([-1,28,28,1])
labels=mnist_data.train.labels
#Defineplaceholders
images_placeholder=tf.placeholder(
images.dtype,images.shape)
labels_placeholder=tf.placeholder(
labels.dtype,labels.shape)
#Builddatasetiterator
dataset=tf.contrib.data.Dataset.from_tensor_slices(
(images_placeholder,labels_placeholder))
dataset=dataset.repeat(None)#Infiniteiterations
dataset=dataset.shuffle(buffer_size=10000)
dataset=dataset.batch(batch_size)
iterator=dataset.make_initializable_iterator()
next_example,next_label=iterator.get_next()
#Setrunhooktoinitializeiterator
iterator_initializer_hook.iterator_initializer_func=\
lambdasess:sess.run(
iterator.initializer,
feed_dict={images_placeholder:images,
labels_placeholder:labels})
#Returnbatched(features,labels)
returnnext_example,next_label
#Returnfunctionandhook
returntrain_inputs,iterator_initializer_hook
defget_test_inputs(batch_size,mnist_data):
"""Returntheinputfunctiontogetthetestdata.
Args:
batch_size(int):Batchsizeoftrainingiteratorthatisreturned
bytheinputfunction.
mnist_data(Object):Objectholdingtheloadedmnistdata.
Returns:
(Inputfunction,IteratorInitializerHook):
-Functionthatreturns(features,labels)whencalled.
-Hooktoinitialiseinputiterator.
"""
iterator_initializer_hook=IteratorInitializerHook()
deftest_inputs():
"""ReturnstrainingsetasOperations.
Returns:
(features,labels)Operationsthatiterateoverthedataset
oneveryevaluation
"""
withtf.name_scope('Test_data'):
#GetMnistdata
images=mnist_data.test.images.reshape([-1,28,28,1])
labels=mnist_data.test.labels
#Defineplaceholders
images_placeholder=tf.placeholder(
images.dtype,images.shape)
labels_placeholder=tf.placeholder(
labels.dtype,labels.shape)
#Builddatasetiterator
dataset=tf.contrib.data.Dataset.from_tensor_slices(
(images_placeholder,labels_placeholder))
dataset=dataset.batch(batch_size)
iterator=dataset.make_initializable_iterator()
next_example,next_label=iterator.get_next()
#Setrunhooktoinitializeiterator
iterator_initializer_hook.iterator_initializer_func=\
lambdasess:sess.run(
iterator.initializer,
feed_dict={images_placeholder:images,
labels_placeholder:labels})
returnnext_example,next_label
#Returnfunctionandhook
returntest_inputs,iterator_initializer_hook
#Runscript##############################################
if__name__=="__main__":
tf.app.run(
main=run_experiment
)
如何給oracle導入blob和clob字段
例:假設給oracle數據庫導入blob類型的圖片,圖片放在目錄G:\images下。
1.先創建一個目錄directory,命名為IMAGES;CREATEORREPLACEDIRE,TORYIMAGESAS'G:\test';或者直接在PlSqlDirectories目錄下新建目錄;
2.創建一個存儲過程,批量導入blobcreateorreplaceprocedureimg_insertasbeginDECLAREf_lobbfile;--文件類型b_lobblob;--用來存儲圖片的名稱filenamevarchar2(400);begin--循環的初始值foriin1..100loop--找出每一列的文件名,因為文件名和圖片名稱是一樣的selectt.flnmintofilenamefromZS_GC_SNIMDTtwheret.id=i;--查找到之后,執行update操作,插入空的blob(注意IMAGES一定要大寫)updateZS_GC_SNIMDTsetbrfl=empty_blob()whereid=ireturnbrflintob_lob;--獲取指定目錄下的文件f_lob:=bfilename('IMAGES',filename);--以只讀的方式打開文件dbms_lob.fileopen(f_lob,dbms_lob.file_readonly);--傳遞對象dbms_lob.loadfromfile(b_lob,f_lob,dbms_lob.getlength(f_lob));--關閉原始文件
xcode怎么新建項目
1.新建項目的方法很簡單。2.首先,打開Xcode軟件,點擊“CreateanewXcodeproject”按鈕,然后選擇項目類型和模板,填寫項目名稱和其他相關信息,最后點擊“Next”按鈕即可。3.如果需要添加文件或者修改項目設置,可以在創建項目后進行操作。同時,Xcode還提供了豐富的工具和功能,可以幫助開發者更高效地完成項目開發。