用ChatGPT写神经网络!

文章描述了一位博主利用ChatGPT构建神经网络解决MNIST手写数字识别问题的过程。ChatGPT生成了包括选择损失函数、添加卷积层、调整训练设置、绘制损失图、保存模型和创建预测器类等代码,并展示了模型的结构和性能。文章以Colabnotebook的形式提供了完整代码。
摘要由CSDN通过智能技术生成

 Datawhale干货 

技术:ChatGPT,编辑:机器之心

AI 写 AI,来得比预料中更快一些。

自从去年底推出以来,对话式 AI 模型 ChatGPT 火遍了整个社区。

ChatGPT 的确是一个了不起的工具,就像一个「潘多拉魔盒」。一旦找到正确的打开方式,你或许会发现,自己再也离不开它了。

作为一个全能选手,人们给 ChatGPT 提出的要求五花八门,有人用它写论文,有人让它陪聊,这些都是常见的玩法。脑洞再打开一点,既然 ChatGPT 是 AI 中的「王者」,那它会不会写一个 AI?

近日,一位机器学习领域的博主突发奇想,他决定让 ChatGPT 构建一个神经网络,使用 Keras 解决 MNIST 问题。

MNIST 算是机器学习领域的经典问题。即使这个手写数字数据集逐渐淡出了计算机视觉领域,但它的纪念意义仍然不可忽视,很多人入门深度学习的第一个数据集、验证算法的第一个实验都是 MNIST。

a12a7bdc4adf88b2ef2c81f08a45a4e6.png

话不多说,想到了就开工。作者直接让 ChatGPT 写了一段代码,看上去完美无缺,甚至不需要更改任何内容。

7c1f4dd20d8202f882f68a72bec2469d.png

这是一个很好的开始。

ChatGPT 选择了分类交叉熵作为损失函数。作者提出重写分类交叉熵这部分代码,ChatGPT 将其替换为稀疏分类交叉熵,更新之后的代码仍能 Work。可以发现,新的损失函数放弃了标签的分类转换。

16341d55e81d2fc4f380504d4d4e465e.png

ChatGPT 生成的代码使用了全连接层,但作者想使用卷积层。因此,ChatGPT 按照指示修改了代码,并添加了一个 Conv2D 和一个最大池化层(MaxPooling layer)。

adf964ab03eef6088b2d8a35762b7aa2.png

然后来到了评估最终模型阶段,作者让 ChatGPT 使用测试集编写代码。

c28fba97f967589d73fa7cad188f4aa2.png

结果看起来很棒,而且 ChatGPT 的每一次回复都带有完整的解释。比如在这次评估中,它这样解释:

「评估」方法将测试数据和测试标签作为参数,并返回模型编译(此处为准确率)期间指定的损失和度量。上面的代码片段输出了测试的准确率,这应该可以让你了解到模型对新数据的概括性。‍

模型在训练期间使用了整个测试集作为验证数据。然后,作者让 ChatGPT 将其更改为训练数据的 20%。

4a52317f85a3c8ca8556e96b384949ee.png

此外,作者还想要更小的 batch 并运行更少 epoch 的代码。虽然这一步未必要用到 ChatGPT,但他不想在不更新 ChatGPT 上下文的情况下更改代码。

所以这项任务还是落在了 ChatGPT 头上:

ae549de3c2842c1e26780aa90a917e1d.png

接下来,作者打算绘制训练过程中的训练和测试损失图。ChatGPT 的建议是:需要更改适合模型的 line 以捕获其结果值。

51081e8e3bec1f0aa17cf3ca65f43a59.png

3983685211cb618183a6828f91112d12.png

为了展示数据集中的一些示例,作者让 ChatGPT 编写代码来输出图像和标签的组合。这些输出的代码也很完美,附有 20 张图片的合集。

ed9006a5c71c94df393f0abf5a7c1c9a.png

5ab9a6ab458cbe0936caaffd7bc15be6.png

构建模型时,查看其结构也是必要的。如果用这个问题去问 ChatGPT ,回复是:

9c952cd8c63dad821df3a67f3fb03d69.png

ChatGPT 给出的是关于模型的总结:

a449734e4dab6296a6f2518747b69442.png

模型的总结很有用,但作者更想看到显示模型结构的图。所以继续问:

c10d09dbb975506105d3448229a63815.png

8d2ccc7d3e93d43204f2e279478fe1de.png

结果是满意的,最后就是准备部署这个模型了,让 ChatGPT 将模型保存到磁盘吧:

c9b452763b1e294f8e3ff4f81e5db919.png

现在,作者想创建一个使用保存的模型进行预测的类。这是 prompt 很有趣,解决方案也很完美。

8def2d7278e0d29f7ffda228dc7f1a59.png

现在编写一个示例,使用预测器的类来预测 10 个随机图像的标签:

c75f483ffc55b9717407a77bd8058b83.png

为了完成这个,作者让 ChatGPT 展示了一个混淆矩阵:

d6fd31f31151efa8eee7fe1d6719f129.png

该说不说,ChatGPT 使用的样式还真挺好看。

36b9c3b8925954483cd693171e9935f4.png

完成所有试验后,作者将所有 ChatGPT 生成的代码公布了出来,你也可以上手试试:

地址:https://colab.research.google.com/drive/1JX1AVIfGtIlnLGqgHrK6WPylPhZvu9qe?usp=sharing

510f43984c197ee0cf67c1b051e01e29.png整理不易,三连

以下是一个简单的递归神经网络(RNN)的 Python 代码,用于生成文本,类似于 OpenAI 的 GPT: ```python import tensorflow as tf from tensorflow.keras.layers import Dense, LSTM, Embedding from tensorflow.keras.models import Sequential import numpy as np # Load the data data = open('data.txt', 'r').read() chars = list(set(data)) data_size, vocab_size = len(data), len(chars) char_to_ix = { ch:i for i,ch in enumerate(chars) } ix_to_char = { i:ch for i,ch in enumerate(chars) } # Set the hyperparameters hidden_size = 128 sequence_length = 100 learning_rate = 0.01 # Define the model model = Sequential() model.add(Embedding(vocab_size, hidden_size, input_length=sequence_length)) model.add(LSTM(hidden_size, return_sequences=True)) model.add(LSTM(hidden_size)) model.add(Dense(vocab_size, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam') # Train the model batch_size = 128 num_epochs = 10 steps_per_epoch = (data_size - sequence_length) // batch_size for epoch in range(num_epochs): print('Epoch {}/{}'.format(epoch+1, num_epochs)) for step in range(steps_per_epoch): input_chars = data[step*batch_size:step*batch_size+sequence_length] output_char = data[step*batch_size+sequence_length] X = np.zeros((batch_size, sequence_length)) Y = np.zeros((batch_size, vocab_size)) for i, char in enumerate(input_chars): X[:, i] = char_to_ix[char] Y[:, char_to_ix[output_char]] = 1 model.train_on_batch(X, Y) # Generate some text start_index = np.random.randint(0, len(data) - sequence_length) seed_chars = data[start_index:start_index+sequence_length] generated_text = seed_chars for i in range(1000): X = np.zeros((1, sequence_length)) for j, char in enumerate(seed_chars): X[0, j] = char_to_ix[char] prediction = model.predict(X, verbose=0)[0] index = np.random.choice(range(vocab_size), p=prediction.ravel()) char = ix_to_char[index] generated_text += char seed_chars = seed_chars[1:] + char print(generated_text) ``` 请注意,这只是一个简单的示例代码,可以根据需要进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值