Inglês | 中文
Importante
Estamos felizes que nosso trabalho no tensorflow.net tenha atraído muitos usuários. No entanto, neste momento, nenhum dos principais mantenedores deste repositório está disponível para novos recursos e correção de bugs. Não recusaremos PRs e ajudaremos a revisá-los.
Se você gostaria de ser um contribuidor ou mantenedor do tensorflow.net, gostaríamos de ajudá-lo a começar.
Sentimos muito por isso e retomaremos a manutenção deste projeto assim que um de nós tiver largura de banda para isso.
master branch e v0.100.x corresponde ao tensorflow v2.10, v0.6x branch é do tensorflow v2.6, v0.15-tensorflow1.15 é do tensorflow1.15. Adicione https://www.myget.org/F/scisharp/api/v3/index.json
à fonte nuget para usar o lançamento noturno.
A missão do SciSharp STACK
é trazer tecnologia popular de ciência de dados para o mundo .NET e fornecer aos desenvolvedores .NET um poderoso conjunto de ferramentas de aprendizado de máquina sem reinventar a roda. Como as APIs são mantidas o mais semelhantes possível, você pode adaptar imediatamente qualquer código existente do TensorFlow em C# ou F# com uma curva de aprendizado zero. Dê uma olhada em uma imagem de comparação e veja como um script TensorFlow/Python se traduz confortavelmente em um programa C# com TensorFlow.NET.
A filosofia do SciSharp permite que um grande número de códigos de aprendizado de máquina escritos em Python sejam rapidamente migrados para .NET, permitindo que os desenvolvedores .NET usem modelos de aprendizado de máquina de última geração e acessem um grande número de recursos do TensorFlow que não seriam possíveis sem este projeto.
Em comparação com outros projetos, como por exemplo o TensorFlowSharp, que fornece apenas a API C++ de baixo nível do TensorFlow e só pode executar modelos que foram construídos usando Python, o Tensorflow.NET torna possível construir o pipeline de treinamento e inferência com C# e F# puros. Além disso, Tensorflow.NET fornece ligação de Tensorflow.Keras para facilitar a transferência de seu código de python para .NET.
O ML.NET também usa o Tensorflow.NET como um dos back-ends para treinar e inferir seu modelo, o que fornece melhor integração com o .NET.
Introdução e exemplos simples: Documentos Tensorflow.NET
Documentação detalhada: O guia definitivo para Tensorflow.NET
Exemplos: Exemplos do TensorFlow.NET
Solução de problemas de exemplo de execução ou instalação: Perguntas frequentes sobre Tensorflow.NET
Você pode pesquisar o nome do pacote no NuGet Manager ou usar os comandos abaixo no console do gerenciador de pacotes.
A instalação contém duas partes, a primeira é o corpo principal:
# ## Install Tensorflow.NET
PM > Install-Package TensorFlow.NET
# ## Install Tensorflow.Keras
PM > Install-Package TensorFlow.Keras
A segunda parte é a parte de suporte computacional. Apenas um dos pacotes a seguir é necessário, dependendo do seu dispositivo e sistema.
### CPU version for Windows and Linux
PM> Install-Package SciSharp.TensorFlow.Redist
### CPU version for MacOS
PM> Install-Package SciSharp.TensorFlow.Redist-OSX
### GPU version for Windows (CUDA and cuDNN are required)
PM> Install-Package SciSharp.TensorFlow.Redist-Windows-GPU
### GPU version for Linux (CUDA and cuDNN are required)
PM> Install-Package SciSharp.TensorFlow.Redist-Linux-GPU
Dois exemplos simples são dados aqui para apresentar o uso básico do Tensorflow.NET. Como você pode ver, é fácil escrever código C# assim em Python.
Eager
using static Tensorflow . Binding ;
using static Tensorflow . KerasApi ;
using Tensorflow ;
using Tensorflow . NumPy ;
// Parameters
var training_steps = 1000 ;
var learning_rate = 0.01f ;
var display_step = 100 ;
// Sample data
var X = np . array ( 3.3f , 4.4f , 5.5f , 6.71f , 6.93f , 4.168f , 9.779f , 6.182f , 7.59f , 2.167f ,
7.042f , 10.791f , 5.313f , 7.997f , 5.654f , 9.27f , 3.1f ) ;
var Y = np . array ( 1.7f , 2.76f , 2.09f , 3.19f , 1.694f , 1.573f , 3.366f , 2.596f , 2.53f , 1.221f ,
2.827f , 3.465f , 1.65f , 2.904f , 2.42f , 2.94f , 1.3f ) ;
var n_samples = X . shape [ 0 ] ;
// We can set a fixed init value in order to demo
var W = tf . Variable ( - 0.06f , name : " weight " ) ;
var b = tf . Variable ( - 0.73f , name : " bias " ) ;
var optimizer = keras . optimizers . SGD ( learning_rate ) ;
// Run training for the given number of steps.
foreach ( var step in range ( 1 , training_steps + 1 ) )
{
// Run the optimization to update W and b values.
// Wrap computation inside a GradientTape for automatic differentiation.
using var g = tf . GradientTape ( ) ;
// Linear regression (Wx + b).
var pred = W * X + b ;
// Mean square error.
var loss = tf . reduce_sum ( tf . pow ( pred - Y , 2 ) ) / ( 2 * n_samples ) ;
// should stop recording
// Compute gradients.
var gradients = g . gradient ( loss , ( W , b ) ) ;
// Update W and b following gradients.
optimizer . apply_gradients ( zip ( gradients , ( W , b ) ) ) ;
if ( step % display_step == 0 )
{
pred = W * X + b ;
loss = tf . reduce_sum ( tf . pow ( pred - Y , 2 ) ) / ( 2 * n_samples ) ;
print ( $" step: { step } , loss: { loss . numpy ( ) } , W: { W . numpy ( ) } , b: { b . numpy ( ) } " ) ;
}
}
Execute este exemplo no Jupyter Notebook.
ResNet
na API funcional Keras
using static Tensorflow . Binding ;
using static Tensorflow . KerasApi ;
using Tensorflow ;
using Tensorflow . NumPy ;
var layers = keras . layers ;
// input layer
var inputs = keras . Input ( shape : ( 32 , 32 , 3 ) , name : " img " ) ;
// convolutional layer
var x = layers . Conv2D ( 32 , 3 , activation : " relu " ) . Apply ( inputs ) ;
x = layers . Conv2D ( 64 , 3 , activation : " relu " ) . Apply ( x ) ;
var block_1_output = layers . MaxPooling2D ( 3 ) . Apply ( x ) ;
x = layers . Conv2D ( 64 , 3 , activation : " relu " , padding : " same " ) . Apply ( block_1_output ) ;
x = layers . Conv2D ( 64 , 3 , activation : " relu " , padding : " same " ) . Apply ( x ) ;
var block_2_output = layers . Add ( ) . Apply ( new Tensors ( x , block_1_output ) ) ;
x = layers . Conv2D ( 64 , 3 , activation : " relu " , padding : " same " ) . Apply ( block_2_output ) ;
x = layers . Conv2D ( 64 , 3 , activation : " relu " , padding : " same " ) . Apply ( x ) ;
var block_3_output = layers . Add ( ) . Apply ( new Tensors ( x , block_2_output ) ) ;
x = layers . Conv2D ( 64 , 3 , activation : " relu " ) . Apply ( block_3_output ) ;
x = layers . GlobalAveragePooling2D ( ) . Apply ( x ) ;
x = layers . Dense ( 256 , activation : " relu " ) . Apply ( x ) ;
x = layers . Dropout ( 0.5f ) . Apply ( x ) ;
// output layer
var outputs = layers . Dense ( 10 ) . Apply ( x ) ;
// build keras model
var model = keras . Model ( inputs , outputs , name : " toy_resnet " ) ;
model . summary ( ) ;
// compile keras model in tensorflow static graph
model . compile ( optimizer : keras . optimizers . RMSprop ( 1e-3f ) ,
loss : keras . losses . SparseCategoricalCrossentropy ( from_logits : true ) ,
metrics : new [ ] { " acc " } ) ;
// prepare dataset
var ( ( x_train , y_train ) , ( x_test , y_test ) ) = keras . datasets . cifar10 . load_data ( ) ;
// normalize the input
x_train = x_train / 255.0f ;
// training
model . fit ( x_train [ new Slice ( 0 , 2000 ) ] , y_train [ new Slice ( 0 , 2000 ) ] ,
batch_size : 64 ,
epochs : 10 ,
validation_split : 0.2f ) ;
// save the model
model . save ( " ./toy_resnet_model " ) ;
O exemplo F# para regressão linear está disponível aqui.
Exemplos mais avançados podem ser encontrados em Exemplos do TensorFlow.NET.
Versões do TensorFlow.NET | tensorflow 1.14, cuda 10.0 | tensorflow 1.15, cuda 10.0 | tensorflow 2.3, cuda 10.1 | tensorflow 2.4, cuda 11 | tensorflow 2.7, cuda 11 | tensorflow 2.10, cuda 11 |
---|---|---|---|---|---|---|
tf.net 0,10x, tf.keras 0,10 | x | |||||
tf.net 0,7x, tf.keras 0,7 | x | |||||
tf.net 0,4x, tf.keras 0,5 | x | |||||
tf.net 0,3x, tf.keras 0,4 | x | |||||
tf.net 0,2x | x | x | ||||
tf.net 0,15 | x | x | ||||
tf.net 0,14 | x |
tf.net 0.4x -> tf native 2.4
tf.net 0.6x -> tf native 2.6
tf.net 0.7x -> tf native 2.7
tf.net 0.10x -> tf native 2.10
...
Quer contribuir com um dos projetos mais importantes na área de Machine Learning? Quer saber como o Tensorflow cria magicamente o gráfico computacional?
Agradecemos cada contribuição, por menor que seja! Existem tarefas tanto para novatos como para especialistas; se todos realizarem apenas uma pequena tarefa, a soma das contribuições será enorme.
Você pode:
A melhor maneira de descobrir por que um teste de unidade está falhando é executá-lo em uma única etapa em C# ou F# e seu Python correspondente ao mesmo tempo para ver onde o fluxo de execução diverge ou onde as variáveis exibem valores diferentes. Bons IDEs Python como PyCharm permitem que você entre no código da biblioteca tensorflow em uma única etapa.
Adicione SciSharp/TensorFlow.NET como upstream ao seu repositório local ...
git remote add upstream [email protected]:SciSharp/TensorFlow.NET.git
Certifique-se de manter seu fork atualizado puxando regularmente do upstream.
git pull upstream master
Compre nosso livro para tornar o projeto de código aberto sustentável TensorFlow.NET实战
Participe do nosso bate-papo no Discord ou Gitter.
Siga-nos no Twitter, Facebook, Médio, LinkedIn.
TensorFlow.NET faz parte do SciSharp STACK