import sys,numpy as np from keras.datasets import mnist (x_train,y_train),(x_test,y_test)=mnist.load_data() images,labels=(x_train[0:1000].reshape(1000,28*28)/255,y_train[0:1000]) one_hot_labels=np.zeros((len(labels),10)) for i,l in enumerate(labels): one_hot_labels[i][l]=1 labels=one_hot_labels test_images=x_test.reshape(len(x_test),28*28)/255 test_labels=np.zeros((len(y_test),10)) for i,l in enumerate(y_test): test_labels[i][l]=1 np.random.seed(1) def relu(x): return (x>=0)*x #此函数将所有负数设为0 def relu2deriv(output): return output>=0 #当input>0时,返回1,否则返回0 alpha,iterations,hidden_size=(0.005,300,100) pixels_per_image,num_labels=(784,10) weights_0_1=0.2*np.random.random((pixels_per_image,hidden_size))-0.1 weights_1_2=0.2*np.random.random((hidden_size,num_labels))-0.1 for j in range(iterations): error,correct_cnt=(0.0,0) for i in range(len(images)): layer_0=images[i:i+1] layer_1=relu(np.dot(layer_0,weights_0_1)) dropout_mask=np.random.randint(2,size=layer_1.shape) layer_1*=dropout_mask*2 layer_2=np.dot(layer_1,weights_1_2) error+=np.sum((labels[i:i+1]-layer_2)**2) correct_cnt+=int(np.argmax(layer_2)==\ np.argmax(labels[i:i+1])) layer_2_delta=(labels[i:i+1]-layer_2) layer_1_delta=layer_2_delta.dot(weights_1_2.T)*relu2deriv(layer_1) layer_1_delta+=dropout_mask weights_1_2+=alpha*layer_1.T.dot(layer_2_delta) weights_0_1+=alpha*layer_0.T.dot(layer_1_delta) if (j%10==0): test_error=0.0 test_correct_cnt=0 for i in range(len(test_images)): layer_0=test_images[i:i+1] layer_1=relu(np.dot(layer_0,weights_0_1)) layer_2=np.dot(layer_1,weights_1_2) test_error+=np.sum((test_labels[i:i+1]-layer_2)**2) test_correct_cnt+=int(np.argmax(layer_2)==np.argmax(test_labels[i:i+1])) sys.stdout.write("\n"+\ "I:"+str(j)+\ " Test-Error:"+str(test_error/float(len(test_images)))[0:5] +\ " Test-Acc:"+str(test_correct_cnt/float(len(test_images)))+\ " Train-Err:"+str(error/float(len(images)))[0:5]+\ " Train-Acc:"+str(correct_cnt/float(len(images))))帮我看看哪里有问题

时间: 2023-03-01 13:51:42 浏览: 379
这是一段使用Python代码,主要实现了以下操作: 1. 导入了必要的库:sys、numpy和keras中的mnist数据集。 2. 从mnist数据集中加载了训练数据和测试数据,并将训练数据的前1000个样本的图像和标签提取出来。 3. 将标签转换为一个“one-hot”编码,即每个标签对应的数字将被转换为一个长度为10的0/1数组。 4. 将测试数据的图像转换为28*28的矩阵并进行归一化,并将测试数据的标签也转换为“one-hot”编码。 5. 设置随机数生成器的种子为1,以确保后续生成的随机数相同。 6. 定义了一个ReLU函数,其中,当输入大于等于0时,返回该输入,否则返回0。
相关问题

tf.keras.datasets.mnist.load_data

tf.keras.datasets.mnist.load_data是一个tensorflow中的函数,用于加载并返回MNIST数据集。 MNIST是一个非常经典的手写数字数据集,其中包含了60000个训练样本和10000个测试样本。该数据集被广泛用于机器学习和深度学习的训练和验证。 load_data()函数会自动下载MNIST数据集到本地,并将其分为训练集和测试集。下载完成后,load_data()函数会将训练集和测试集分别存储在两个元组中。 训练集元组包含两个NumPy数组:(x_train, y_train)。x_train包含了60000个28x28的灰度图像,每个图像代表一个手写数字样本。y_train包含了与x_train对应的60000个标签,取值范围为0到9,表示手写数字的类别。 测试集元组也包含两个NumPy数组:(x_test, y_test)。x_test包含了10000个28x28的灰度图像,每个图像代表一个手写数字样本。y_test包含了与x_test对应的10000个标签。 load_data()函数的返回结果是一个元组,其中包含了训练集元组和测试集元组。我们可以通过如下方式获取这些数据: (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() 加载MNIST数据集后,我们就可以使用这些数据进行模型的训练和测试,用于识别手写数字。

优化这段代码:import tensorflow as tf import numpy as np # 加载数据集 mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 # 定义模型 model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax')]) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, epochs=5) # 生成对抗样本 epsilon = 0.1 x_adv = tf.Variable(x_test[:1000], dtype=tf.float32) y_true = tf.Variable(y_test[:1000], dtype=tf.int64) with tf.GradientTape() as tape: tape.watch(x_adv) y_pred = model(x_adv) loss = tf.keras.losses.sparse_categorical_crossentropy(y_true, y_pred) grad = tape.gradient(loss, x_adv) normed_grad = tf.sign(grad) x_adv = x_adv + epsilon * normed_grad # 评估模型在对抗样本上的性能 model.evaluate(x_adv, y_true)

下面是优化后的代码: ```python import tensorflow as tf import numpy as np # 加载数据集 mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 # 定义模型 model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ]) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, epochs=5) # 生成对抗样本 epsilon = 0.1 x_adv = x_test[:1000] y_true = y_test[:1000] # 使用tf.GradientTape计算梯度 def get_grads(model, x, y): with tf.GradientTape() as tape: tape.watch(x) y_pred = model(x) loss = tf.keras.losses.sparse_categorical_crossentropy(y, y_pred) return tape.gradient(loss, x) # 对抗样本生成函数 def generate_adv_example(model, x, y, epsilon): grad = tf.sign(get_grads(model, x, y)) return x + epsilon * grad x_adv = generate_adv_example(model, x_adv, y_true, epsilon) # 评估模型在对抗样本上的性能 model.evaluate(x_adv, y_true) ``` 优化后的代码主要做了以下几个方面的改进: 1. 对抗样本生成过程封装成了函数 `generate_adv_example()`,提高了代码的复用性。 2. 使用了 `get_grads()` 函数来计算梯度,避免了重复计算梯度的问题。 3. 去掉了 `tf.Variable` 的使用,避免了不必要的内存开销。 4. 代码风格更加规范,易于阅读。

相关推荐

下面的代码哪里有问题,帮我改一下from __future__ import print_function import numpy as np import tensorflow import keras from keras.models import Sequential from keras.layers import Dense,Dropout,Flatten from keras.layers import Conv2D,MaxPooling2D from keras import backend as K import tensorflow as tf import datetime import os np.random.seed(0) from sklearn.model_selection import train_test_split from PIL import Image import matplotlib.pyplot as plt from keras.datasets import mnist images = [] labels = [] (x_train,y_train),(x_test,y_test)=mnist.load_data() X = np.array(images) print (X.shape) y = np.array(list(map(int, labels))) print (y.shape) x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=0) print (x_train.shape) print (x_test.shape) print (y_train.shape) print (y_test.shape) ############################ ########## batch_size = 20 num_classes = 4 learning_rate = 0.0001 epochs = 10 img_rows,img_cols = 32 , 32 if K.image_data_format() =='channels_first': x_train =x_train.reshape(x_train.shape[0],1,img_rows,img_cols) x_test = x_test.reshape(x_test.shape[0],1,img_rows,img_cols) input_shape = (1,img_rows,img_cols) else: x_train = x_train.reshape(x_train.shape[0],img_rows,img_cols,1) x_test = x_test.reshape(x_test.shape[0],img_rows,img_cols,1) input_shape =(img_rows,img_cols,1) x_train =x_train.astype('float32') x_test = x_test.astype('float32') x_train /= 255 x_test /= 255 print('x_train shape:',x_train.shape) print(x_train.shape[0],'train samples') print(x_test.shape[0],'test samples')

import numpy as np import tensorflow as tf from tensorflow import keras import matplotlib.pyplot as plt Let us define a plt function for simplicity def plt_loss(x,training_metric,testing_metric,ax,colors = ['b']): ax.plot(x,training_metric,'b',label = 'Train') ax.plot(x,testing_metric,'k',label = 'Test') ax.set_xlabel('Epochs') ax.set_ylabel('Accuracy') plt.legend() plt.grid() plt.show() tf.keras.utils.set_random_seed(1) We import the Minist Dataset using Keras.datasets (train_data, train_labels), (test_data, test_labels) = keras.datasets.mnist.load_data() We first vectorize the image (28*28) into a vector (784) train_data = train_data.reshape(train_data.shape[0],train_data.shape[1]train_data.shape[2]) # 60000784 test_data = test_data.reshape(test_data.shape[0],test_data.shape[1]test_data.shape[2]) # 10000784 We next change label number to a 10 dimensional vector, e.g., 1-> train_labels = keras.utils.to_categorical(train_labels,10) test_labels = keras.utils.to_categorical(test_labels,10) start to build a MLP model N_batch_size = 5000 N_epochs = 100 lr = 0.01 we build a three layer model, 784 -> 64 -> 10 MLP_3 = keras.models.Sequential([ keras.layers.Dense(128, input_shape=(784,),activation='relu'), keras.layers.Dense(64, activation='relu'), keras.layers.Dense(10,activation='softmax') ]) MLP_3.compile( optimizer=keras.optimizers.Adam(lr), loss= 'categorical_crossentropy', metrics = ['accuracy'] ) History = MLP_3.fit(train_data,train_labels, batch_size = N_batch_size, epochs = N_epochs,validation_data=(test_data,test_labels), shuffle=False) train_acc = History.history['accuracy'] test_acc = History.history对于该模型,使用不同数量的训练数据(5000,10000,15000,…,60000,公差=5000的等差数列),绘制训练集和测试集准确率(纵轴)关于训练数据大小(横轴)的曲线

import numpy as np import tensorflow as tf from keras.models import Sequential from keras.layers import Dense, Activation, Dropout, Flatten from keras.layers.convolutional import Conv2D, MaxPooling2D from keras.utils import np_utils from keras.datasets import mnist from keras import backend as K from keras.optimizers import Adam import skfuzzy as fuzz import pandas as pd from sklearn.model_selection import train_test_split # 绘制损失曲线 import matplotlib.pyplot as plt from sklearn.metrics import accuracy_score data = pd.read_excel(r"D:\pythonProject60\filtered_data1.xlsx") # 读取数据文件 # Split data into input and output variables X = data.iloc[:, :-1].values y = data.iloc[:, -1].values X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 导入MNIST数据集 # 数据预处理 y_train = np_utils.to_categorical(y_train, 3) y_test = np_utils.to_categorical(y_test, 3) # 创建DNFN模型 model = Sequential() model.add(Dense(64, input_shape=(11,), activation='relu')) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(3, activation='softmax')) # 编译模型 model.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics=['accuracy']) # 训练模型 history = model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=10, batch_size=128) # 使用DNFN模型进行预测 y_pred = model.predict(X_test) y_pred= np.argmax(y_pred, axis=1) print(y_pred) # 计算模糊分类 fuzzy_pred = [] for i in range(len(y_pred)): fuzzy_class = np.zeros((3,)) fuzzy_class[y_pred[i]] = 1.0 fuzzy_pred.append(fuzzy_class) fuzzy_pred = np.array(fuzzy_pred) print(fuzzy_pred)获得其运行时间

mport numpy as np import tensorflow as tf from keras.models import Sequential from keras.layers import Dense, Activation, Dropout, Flatten from keras.layers.convolutional import Conv2D, MaxPooling2D from keras.utils import np_utils from keras.datasets import mnist from keras import backend as K from keras.optimizers import Adam import skfuzzy as fuzz import pandas as pd from sklearn.model_selection import train_test_split # 绘制损失曲线 import matplotlib.pyplot as plt import time from sklearn.metrics import accuracy_score data = pd.read_excel(r"D:\pythonProject60\filtered_data1.xlsx") # 读取数据文件 # Split data into input and output variables X = data.iloc[:, :-1].values y = data.iloc[:, -1].values X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 导入MNIST数据集 # 数据预处理 y_train = np_utils.to_categorical(y_train, 3) y_test = np_utils.to_categorical(y_test, 3) # 创建DNFN模型 start_time=time.time() model = Sequential() model.add(Dense(64, input_shape=(11,), activation='relu')) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(3, activation='softmax')) # 编译模型 model.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics=['accuracy']) # 训练模型 history = model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=10, batch_size=128) # 使用DNFN模型进行预测 y_pred = model.predict(X_test) y_pred= np.argmax(y_pred, axis=1) print(y_pred) # 计算模糊分类 fuzzy_pred = [] for i in range(len(y_pred)): fuzzy_class = np.zeros((3,)) fuzzy_class[y_pred[i]] = 1.0 fuzzy_pred.append(fuzzy_class) fuzzy_pred = np.array(fuzzy_pred) end_time = time.time() print("Total time taken: ", end_time - start_time, "seconds")获得运行结果并分析

使用遗传算法优化神经网络模型的超参数(可选超参数包括训练迭代次数,学习率,网络结构等)的代码,原来的神经网络模型如下:import numpy as np import tensorflow as tf from tensorflow.keras.datasets import mnist from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense from tensorflow.keras.utils import to_categorical from tensorflow.keras.optimizers import Adam from sklearn.model_selection import train_test_split # 加载MNIST数据集 (X_train, y_train), (X_test, y_test) = mnist.load_data() # 数据预处理 X_train = X_train.reshape(-1, 28, 28, 1).astype('float32') / 255.0 X_test = X_test.reshape(-1, 28, 28, 1).astype('float32') / 255.0 y_train = to_categorical(y_train) y_test = to_categorical(y_test) # 划分验证集 X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.1, random_state=42) def create_model(): model = Sequential() model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D((2, 2))) model.add(Flatten()) model.add(Dense(64, activation='relu')) model.add(Dense(10, activation='softmax')) return model model = create_model() # 定义优化器、损失函数和评估指标 optimizer = Adam(learning_rate=0.001) loss_fn = tf.keras.losses.CategoricalCrossentropy() metrics = ['accuracy'] # 编译模型 model.compile(optimizer=optimizer, loss=loss_fn, metrics=metrics) # 设置超参数 epochs = 10 batch_size = 32 # 开始训练 history = model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(X_val, y_val)) # 评估模型 test_loss, test_accuracy = model.evaluate(X_test, y_test) print('Test Loss:', test_loss) print('Test Accuracy:', test_accuracy)

最新推荐

wheel-0.9.6-py27-none-any.whl

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

基于ssm布卡维纳红酒网页平台.zip

基于ssm布卡维纳红酒网页平台.zip

基于SSM的旅游管理系统.zip

基于SSM的旅游管理系统.zip

菜鸟驿站(诚毅小高层对面厂房内) 2.m4a

菜鸟驿站(诚毅小高层对面厂房内) 2.m4a

ExcelVBA中的Range和Cells用法说明.pdf

ExcelVBA中的Range和Cells用法是非常重要的,Range对象可以用来表示Excel中的单元格、单元格区域、行、列或者多个区域的集合。它可以实现对单元格内容的赋值、取值、复制、粘贴等操作。而Cells对象则表示Excel中的单个单元格,通过指定行号和列号来操作相应的单元格。 在使用Range对象时,我们需要指定所操作的单元格或单元格区域的具体位置,可以通过指定工作表、行号、列号或者具体的单元格地址来实现。例如,可以通过Worksheets("Sheet1").Range("A5")来表示工作表Sheet1中的第五行第一列的单元格。然后可以通过对该单元格的Value属性进行赋值,实现给单元格赋值的操作。例如,可以通过Worksheets("Sheet1").Range("A5").Value = 22来讲22赋值给工作表Sheet1中的第五行第一列的单元格。 除了赋值操作,Range对象还可以实现其他操作,比如取值、复制、粘贴等。通过获取单元格的Value属性,可以取得该单元格的值。可以通过Range对象的Copy和Paste方法实现单元格内容的复制和粘贴。例如,可以通过Worksheets("Sheet1").Range("A5").Copy和Worksheets("Sheet1").Range("B5").Paste来实现将单元格A5的内容复制到单元格B5。 Range对象还有很多其他属性和方法可供使用,比如Merge方法可以合并单元格、Interior属性可以设置单元格的背景颜色和字体颜色等。通过灵活运用Range对象的各种属性和方法,可以实现丰富多样的操作,提高VBA代码的效率和灵活性。 在处理大量数据时,Range对象的应用尤为重要。通过遍历整个单元格区域来实现对数据的批量处理,可以极大地提高代码的运行效率。同时,Range对象还可以多次使用,可以在多个工作表之间进行数据的复制、粘贴等操作,提高了代码的复用性。 另外,Cells对象也是一个非常实用的对象,通过指定行号和列号来操作单元格,可以简化对单元格的定位过程。通过Cells对象,可以快速准确地定位到需要操作的单元格,实现对数据的快速处理。 总的来说,Range和Cells对象在ExcelVBA中的应用非常广泛,可以实现对Excel工作表中各种数据的处理和操作。通过灵活使用Range对象的各种属性和方法,可以实现对单元格内容的赋值、取值、复制、粘贴等操作,提高代码的效率和灵活性。同时,通过Cells对象的使用,可以快速定位到需要操作的单元格,简化代码的编写过程。因此,深入了解和熟练掌握Range和Cells对象的用法对于提高ExcelVBA编程水平是非常重要的。

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire

C++中的数据库连接与操作技术

# 1. 数据库连接基础 数据库连接是在各种软件开发项目中常见的操作,它是连接应用程序与数据库之间的桥梁,负责传递数据与指令。在C++中,数据库连接的实现有多种方式,针对不同的需求和数据库类型有不同的选择。在本章中,我们将深入探讨数据库连接的概念、重要性以及在C++中常用的数据库连接方式。同时,我们也会介绍配置数据库连接的环境要求,帮助读者更好地理解和应用数据库连接技术。 # 2. 数据库操作流程 数据库操作是C++程序中常见的任务之一,通过数据库操作可以实现对数据库的增删改查等操作。在本章中,我们将介绍数据库操作的基本流程、C++中执行SQL查询语句的方法以及常见的异常处理技巧。让我们

unity中如何使用代码实现随机生成三个不相同的整数

你可以使用以下代码在Unity中生成三个不同的随机整数: ```csharp using System.Collections.Generic; public class RandomNumbers : MonoBehaviour { public int minNumber = 1; public int maxNumber = 10; private List<int> generatedNumbers = new List<int>(); void Start() { GenerateRandomNumbers();

基于单片机的电梯控制模型设计.doc

基于单片机的电梯控制模型设计是一项旨在完成课程设计的重要教学环节。通过使用Proteus软件与Keil软件进行整合,构建单片机虚拟实验平台,学生可以在PC上自行搭建硬件电路,并完成电路分析、系统调试和输出显示的硬件设计部分。同时,在Keil软件中编写程序,进行编译和仿真,完成系统的软件设计部分。最终,在PC上展示系统的运行效果。通过这种设计方式,学生可以通过仿真系统节约开发时间和成本,同时具有灵活性和可扩展性。 这种基于单片机的电梯控制模型设计有利于促进课程和教学改革,更有利于学生人才的培养。从经济性、可移植性、可推广性的角度来看,建立这样的课程设计平台具有非常重要的意义。通过仿真系统,学生可以在实际操作之前完成系统设计和调试工作,提高了实验效率和准确性。最终,通过Proteus设计PCB,并完成真正硬件的调试。这种设计方案可以为学生提供实践操作的机会,帮助他们更好地理解电梯控制系统的原理和实践应用。 在设计方案介绍中,指出了在工业领域中,通常采用可编程控制器或微型计算机实现电梯逻辑控制,虽然可编程控制器有较强的抗干扰性,但价格昂贵且针对性强。而通过单片机控制中心,可以针对不同楼层分别进行合理调度,实现电梯控制的模拟。设计中使用按键用于用户发出服务请求,LED用于显示电梯状态。通过这种设计方案,学生可以了解电梯控制系统的基本原理和实现方法,培养他们的实践操作能力和创新思维。 总的来说,基于单片机的电梯控制模型设计是一项具有重要意义的课程设计项目。通过Proteus软件与Keil软件的整合,搭建单片机虚拟实验平台,可以帮助学生更好地理解电梯控制系统的原理和实践应用,培养他们的实践操作能力和创新思维。这种设计方案不仅有利于课程和教学改革,也对学生的人才培养具有积极的促进作用。通过这样的设计方案,学生可以在未来的工作中更好地应用所学知识,为电梯控制系统的研发和应用做出贡献。

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依